(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.pell = factory()); }(this, function () { 'use strict'; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } var addEventListener = function addEventListener(parent, type, listener) { return parent.addEventListener(type, listener); }; var appendChild = function appendChild(parent, child) { return parent.appendChild(child); }; var createElement = function createElement(tag) { return document.createElement(tag); }; var defaultParagraphSeparatorString = 'defaultParagraphSeparator'; var exec = function exec(command) { var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return document.execCommand(command, false, value); }; var formatBlock = 'formatBlock'; var queryCommandState = function queryCommandState(command) { return document.queryCommandState(command); }; var queryCommandValue = function queryCommandValue(command) { return document.queryCommandValue(command); }; var bold = { icon: 'B', result: function result() { return exec('bold'); }, state: function state() { return queryCommandState('bold'); }, title: 'Bold' }; var code = { icon: '</>', result: function result() { return exec(formatBlock, '
');
    },
    title: 'Code'
  };
  var heading1 = {
    icon: 'H1',
    result: function result() {
      return exec(formatBlock, '

'); }, title: 'Heading 1' }; var heading2 = { icon: 'H2', result: function result() { return exec(formatBlock, '

'); }, title: 'Heading 2' }; var image = { icon: '📷', result: function result() { var url = window.prompt('Enter the image URL'); if (url) exec('insertImage', url); }, title: 'Image' }; var italic = { icon: 'I', result: function result() { return exec('italic'); }, state: function state() { return queryCommandState('italic'); }, title: 'Italic' }; var line = { icon: '―', result: function result() { return exec('insertHorizontalRule'); }, title: 'Horizontal Line' }; var link = { icon: '🔗', result: function result() { var url = window.prompt('Enter the link URL'); if (url) exec('createLink', url); }, title: 'Link' }; var olist = { icon: '#', result: function result() { return exec('insertOrderedList'); }, title: 'Ordered List' }; var paragraph = { icon: '¶', result: function result() { return exec(formatBlock, '

'); }, title: 'Paragraph' }; var quote = { icon: '“ ”', result: function result() { return exec(formatBlock, '

'); }, title: 'Quote' }; var strikethrough = { icon: 'S', result: function result() { return exec('strikeThrough'); }, state: function state() { return queryCommandState('strikeThrough'); }, title: 'Strike-through' }; var ulist = { icon: '•', result: function result() { return exec('insertUnorderedList'); }, title: 'Unordered List' }; var underline = { icon: 'U', result: function result() { return exec('underline'); }, state: function state() { return queryCommandState('underline'); }, title: 'Underline' }; var defaultActions = { bold: bold, code: code, heading1: heading1, heading2: heading2, image: image, italic: italic, line: line, link: link, olist: olist, paragraph: paragraph, quote: quote, strikethrough: strikethrough, ulist: ulist, underline: underline }; var defaultClasses = { actionbar: 'pell-actionbar', button: 'pell-button', content: 'pell-content', selected: 'pell-button-selected' }; var init = function init(settings) { var actions = settings.actions ? settings.actions.map(function (action) { if (typeof action === 'string') return defaultActions[action];else if (defaultActions[action.name]) return _objectSpread({}, defaultActions[action.name], action); return action; }) : Object.keys(defaultActions).map(function (action) { return defaultActions[action]; }); var classes = _objectSpread({}, defaultClasses, settings.classes); var defaultParagraphSeparator = settings[defaultParagraphSeparatorString] || 'div'; var actionbar = createElement('div'); actionbar.className = classes.actionbar; appendChild(settings.element, actionbar); var content = settings.element.content = createElement('div'); content.contentEditable = true; content.className = classes.content; content.className = classes.content; content.id = "pell-id"; content.oninput = function (_ref) { var firstChild = _ref.target.firstChild; if (firstChild && firstChild.nodeType === 3) exec(formatBlock, "<".concat(defaultParagraphSeparator, ">"));else if (content.innerHTML === '
') content.innerHTML = ''; settings.onChange(content.innerHTML); }; content.onkeydown = function (event) { if (event.key === 'Enter' && queryCommandValue(formatBlock) === 'blockquote') { setTimeout(function () { return exec(formatBlock, "<".concat(defaultParagraphSeparator, ">")); }, 0); } }; appendChild(settings.element, content); actions.forEach(function (action) { var button = createElement('button'); button.className = classes.button; button.innerHTML = action.icon; button.title = action.title; button.setAttribute('type', 'button'); button.onclick = function () { return action.result() && content.focus(); }; if (action.state) { var handler = function handler() { return button.classList[action.state() ? 'add' : 'remove'](classes.selected); }; addEventListener(content, 'keyup', handler); addEventListener(content, 'mouseup', handler); addEventListener(button, 'click', handler); } appendChild(actionbar, button); }); if (settings.styleWithCSS) exec('styleWithCSS'); exec(defaultParagraphSeparatorString, defaultParagraphSeparator); return settings.element; }; var pell = { init: init }; return pell; }));