{"version":3,"file":"bundle.js","sources":["../src/constants.js","../src/select.js","../src/button.js","../src/icon.js","../src/toolbar.js","../src/input.js","../src/editor.js","../node_modules/style-inject/dist/style-inject.es.js","../src/index.js"],"sourcesContent":["export const BEFORE_BEGIN = 'beforebegin';\r\nexport const BEFORE_END = 'beforeend';\r\nexport const TOOLBAR_ITEM = '__toolbar-item';\r\n","import { BEFORE_END, TOOLBAR_ITEM } from './constants';\r\n\r\nconst createOption = (value, text, selected) => {\r\n const option = document.createElement('option');\r\n option.innerText = text;\r\n\r\n if (value) {\r\n option.setAttribute('value', value);\r\n }\r\n\r\n if (selected) {\r\n option.setAttribute('selected', selected);\r\n }\r\n\r\n return option;\r\n};\r\n\r\nexport const createSelect = (commandId, title, options, execCommand) => {\r\n const select = document.createElement('select');\r\n select.dataset.commandId = commandId;\r\n select.className = TOOLBAR_ITEM;\r\n select.title = title;\r\n select.addEventListener('change', e =>\r\n execCommand(commandId, e.target.options[e.target.selectedIndex].value)\r\n );\r\n\r\n for (const option of options) {\r\n select.insertAdjacentElement(\r\n BEFORE_END,\r\n createOption(option.value, option.text, option.selected)\r\n );\r\n }\r\n\r\n return select;\r\n};\r\n","import { BEFORE_END, TOOLBAR_ITEM } from './constants';\r\n\r\nexport const createButton = (commandId, title, children, execCommand) => {\r\n const button = document.createElement('button');\r\n button.dataset.commandId = commandId;\r\n button.className = TOOLBAR_ITEM;\r\n button.title = title;\r\n button.type = 'button';\r\n button.insertAdjacentElement(BEFORE_END, children);\r\n button.addEventListener('click', () => execCommand(commandId));\r\n\r\n return button;\r\n};\r\n","export const createIcon = className => {\r\n const icon = document.createElement('i');\r\n icon.className = className;\r\n\r\n return icon;\r\n};\r\n","import { createSelect } from './select';\r\nimport { createButton } from './button';\r\nimport { createIcon } from './icon';\r\nimport { createInput } from './input';\r\nimport { BEFORE_END } from './constants';\r\n\r\nconst NO = 'no';\r\n\r\nconst createSeparator = () => {\r\n const separator = document.createElement('span');\r\n separator.className = '__toolbar-separator';\r\n\r\n return separator;\r\n};\r\n\r\nexport const createToolbar = (options, execCommand) => {\r\n const toolbar = document.createElement('div');\r\n toolbar.className = '__toolbar';\r\n\r\n // Styles\r\n if (options.formatblock !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createSelect(\r\n 'formatblock',\r\n 'Styles',\r\n [\r\n { value: 'h1', text: 'Title 1' },\r\n { value: 'h2', text: 'Title 2' },\r\n { value: 'h3', text: 'Title 3' },\r\n { value: 'h4', text: 'Title 4' },\r\n { value: 'h5', text: 'Title 5' },\r\n { value: 'h6', text: 'Title 6' },\r\n { value: 'p', text: 'Paragraph', selected: true },\r\n { value: 'pre', text: 'Preformatted' }\r\n ],\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Font\r\n if (options.fontname !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createSelect(\r\n 'fontname',\r\n 'Font',\r\n [\r\n { value: 'serif', text: 'Serif', selected: true },\r\n { value: 'sans-serif', text: 'Sans Serif' },\r\n { value: 'monospace', text: 'Monospace' },\r\n { value: 'cursive', text: 'Cursive' },\r\n { value: 'fantasy', text: 'Fantasy' }\r\n ],\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Bold\r\n if (options.bold !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton('bold', 'Bold', createIcon('fas fa-bold'), execCommand)\r\n );\r\n }\r\n\r\n // Italic\r\n if (options.italic !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton('italic', 'Italic', createIcon('fas fa-italic'), execCommand)\r\n );\r\n }\r\n\r\n // Underline\r\n if (options.underline !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'underline',\r\n 'Underline',\r\n createIcon('fas fa-underline'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Text color\r\n if (options.forecolor !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createInput('forecolor', 'Text color', 'color', execCommand)\r\n );\r\n }\r\n\r\n // Separator\r\n toolbar.insertAdjacentElement(BEFORE_END, createSeparator());\r\n\r\n // Left align\r\n if (options.justifyleft !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'justifyleft',\r\n 'Left align',\r\n createIcon('fas fa-align-left'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Center align\r\n if (options.justifycenter !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'justifycenter',\r\n 'Center align',\r\n createIcon('fas fa-align-center'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Right align\r\n if (options.justifyright !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'justifyright',\r\n 'Right align',\r\n createIcon('fas fa-align-right'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Separator\r\n toolbar.insertAdjacentElement(BEFORE_END, createSeparator());\r\n\r\n // Numbered list\r\n if (options.insertorderedlist !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'insertorderedlist',\r\n 'Numbered list',\r\n createIcon('fas fa-list-ol'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Bulleted list\r\n if (options.insertunorderedlist !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'insertunorderedlist',\r\n 'Bulleted list',\r\n createIcon('fas fa-list-ul'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Decrease indent\r\n if (options.outdent !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'outdent',\r\n 'Decrease indent',\r\n createIcon('fas fa-indent fa-flip-horizontal'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Increase indent\r\n if (options.indent !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'indent',\r\n 'Increase indent',\r\n createIcon('fas fa-indent'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n // Separator\r\n toolbar.insertAdjacentElement(BEFORE_END, createSeparator());\r\n\r\n // Clear formatting\r\n if (options.removeFormat !== NO) {\r\n toolbar.insertAdjacentElement(\r\n BEFORE_END,\r\n createButton(\r\n 'removeFormat',\r\n 'Clear formatting',\r\n createIcon('fas fa-eraser'),\r\n execCommand\r\n )\r\n );\r\n }\r\n\r\n return toolbar;\r\n};\r\n","import { TOOLBAR_ITEM } from './constants';\r\n\r\nexport const createInput = (commandId, title, type, execCommand) => {\r\n const input = document.createElement('input');\r\n input.dataset.commandId = commandId;\r\n input.className = TOOLBAR_ITEM;\r\n input.title = title;\r\n input.type = type;\r\n input.addEventListener('change', e => execCommand(commandId, e.target.value));\r\n\r\n return input;\r\n};\r\n","import { createToolbar } from './toolbar';\r\nimport { BEFORE_BEGIN } from './constants';\r\n\r\nconst rgbToHex = color => {\r\n const digits = /(.*?)rgb\\((\\d+), (\\d+), (\\d+)\\)/.exec(color);\r\n const red = parseInt(digits[2]);\r\n const green = parseInt(digits[3]);\r\n const blue = parseInt(digits[4]);\r\n const rgb = blue | (green << 8) | (red << 16);\r\n\r\n return digits[1] + '#' + rgb.toString(16).padStart(6, '0');\r\n};\r\n\r\nexport const transformToEditor = editor => {\r\n // Indicate that the element is editable\r\n editor.setAttribute('contentEditable', true);\r\n\r\n // Add a custom class\r\n editor.className = '__editor';\r\n\r\n // Create an exec command function\r\n const execCommand = (commandId, value) => {\r\n document.execCommand(commandId, false, value);\r\n editor.focus();\r\n };\r\n\r\n // Set default paragraph to

\r\n execCommand('defaultParagraphSeparator', 'p');\r\n\r\n // Create a toolbar\r\n const toolbar = createToolbar(editor.dataset, execCommand);\r\n editor.insertAdjacentElement(BEFORE_BEGIN, toolbar);\r\n\r\n // Listen for events to detect where the caret is\r\n const updateActiveState = () => {\r\n const toolbarSelects = toolbar.querySelectorAll('select[data-command-id]');\r\n for (const select of toolbarSelects) {\r\n const value = document.queryCommandValue(select.dataset.commandId);\r\n const option = Array.from(select.options).find(\r\n option => option.value === value\r\n );\r\n select.selectedIndex = option ? option.index : -1;\r\n }\r\n\r\n const toolbarButtons = toolbar.querySelectorAll('button[data-command-id]');\r\n for (const button of toolbarButtons) {\r\n const active = document.queryCommandState(button.dataset.commandId);\r\n button.classList.toggle('active', active);\r\n }\r\n\r\n const inputButtons = toolbar.querySelectorAll('input[data-command-id]');\r\n for (const input of inputButtons) {\r\n const value = document.queryCommandValue(input.dataset.commandId);\r\n input.value = rgbToHex(value);\r\n }\r\n };\r\n editor.addEventListener('keydown', updateActiveState);\r\n editor.addEventListener('keyup', updateActiveState);\r\n editor.addEventListener('click', updateActiveState);\r\n toolbar.addEventListener('click', updateActiveState);\r\n};\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { transformToEditor } from \"./editor\";\r\nimport \"./style.css\";\r\n\r\ndocument.querySelectorAll(\"[data-tiny-editor]\").forEach(transformToEditor);\r\n\r\nwindow.__tinyEditor = {\r\n transformToEditor,\r\n};\r\n"],"names":["BEFORE_END","TOOLBAR_ITEM","createSelect","commandId","title","options","execCommand","select","document","createElement","dataset","className","addEventListener","e","target","selectedIndex","value","text","selected","option","insertAdjacentElement","innerText","setAttribute","createButton","children","button","type","createIcon","icon","NO","createSeparator","separator","createToolbar","input","toolbar","formatblock","fontname","bold","italic","underline","forecolor","justifyleft","justifycenter","justifyright","insertorderedlist","insertunorderedlist","outdent","indent","removeFormat","transformToEditor","editor","focus","updateActiveState","querySelectorAll","queryCommandValue","Array","from","find","index","active","queryCommandState","classList","toggle","digits","red","green","rgb","exec","parseInt","toString","padStart","css","ref","insertAt","head","getElementsByTagName","style","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","forEach","window","__tinyEditor"],"mappings":"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"}