froala-editor
Version:
The next generation Javascript WYSIWYG HTML rich text editor made by devs for devs. High performance and modern design make it easy to use for developers and loved by users.
7 lines (6 loc) • 8.18 kB
JavaScript
/*!
* froala_editor v4.7.0 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2025 Froala Labs
*/
!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(o.FroalaEditor)}(this,function(v){"use strict";v=v&&v.hasOwnProperty("default")?v["default"]:v,Object.assign(v.POPUP_TEMPLATES,{"textColor.picker":"[_BUTTONS_][_TEXT_COLORS_][_CUSTOM_COLOR_]","backgroundColor.picker":"[_BUTTONS_][_BACKGROUND_COLORS_][_CUSTOM_COLOR_]"}),Object.assign(v.DEFAULTS,{colorsText:["#61BD6D","#1ABC9C","#54ACD2","#2C82C9","#9365B8","#475577","#CCCCCC","#41A85F","#00A885","#3D8EB9","#2969B0","#553982","#28324E","#000000","#F7DA64","#FBA026","#EB6B56","#E25041","#A38F84","#EFEFEF","#FFFFFF","#FAC51C","#F37934","#D14841","#B8312F","#7C706B","#D1D5D8","REMOVE"],colorsBackground:["#61BD6D","#1ABC9C","#54ACD2","#2C82C9","#9365B8","#475577","#CCCCCC","#41A85F","#00A885","#3D8EB9","#2969B0","#553982","#28324E","#000000","#F7DA64","#FBA026","#EB6B56","#E25041","#A38F84","#EFEFEF","#FFFFFF","#FAC51C","#F37934","#D14841","#B8312F","#7C706B","#D1D5D8","REMOVE"],colorsStep:7,colorsHEXInput:!0,colorsButtons:["colorsBack","|","-"]}),v.PLUGINS.colors=function(m){var O=m.$,s='<div class="fr-color-hex-layer fr-active fr-layer" id="fr-color-hex-layer- \n '.concat(m.id,'"><div class="fr-input-line"><input maxlength="9" id="[ID]"\n type="text" placeholder="').concat(m.language.translate("HEX Color"),'" \n tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><button \n type="button" class="fr-command fr-submit" data-cmd="[COMMAND]" tabIndex="2" role="button">\n ').concat(m.language.translate("OK"),"</button></div></div>");function l(o){for(var t="text"===o?m.opts.colorsText:m.opts.colorsBackground,r='<div class="fr-color-set fr-'.concat(o,'-color fr-selected-set">'),e=0;e<t.length;e++)0!==e&&e%m.opts.colorsStep==0&&(r+="<br>"),"REMOVE"!==t[e]?r+='<span class="fr-command fr-select-color" style="background:'.concat(t[e].toUpperCase(),';" \n tabIndex="-1" aria-selected="false" role="button" data-cmd="apply').concat(o,'Color" \n data-param1="').concat(t[e].toUpperCase(),'"><span class="fr-sr-only"> ').concat(m.language.translate("Color")).concat(t[e]," \n </span></span>"):r+='<span class="fr-command fr-select-color" data-cmd="apply'.concat(o,'Color"\n tabIndex="-1" role="button" data-param1="REMOVE" \n title="').concat(m.language.translate("Clear Formatting"),'">').concat(m.icon.create("remove"),' \n <span class="fr-sr-only"> ').concat(m.language.translate("Clear Formatting")," </span></span>");return"".concat(r,"</div>")}function i(o){var t,r=m.popups.get("".concat(o,"Color.picker")),e=O(m.selection.element());t="background"===o?"background-color":"color";var a=r.find(".fr-".concat(o,"-color .fr-select-color"));for(a.find(".fr-selected-color").remove(),a.removeClass("fr-active-item"),a.not('[data-param1="REMOVE"]').attr("aria-selected",!1);e.get(0)!==m.el;){if("transparent"!==e.css(t)&&"rgba(0, 0, 0, 0)"!==e.css(t)){var c=r.find(".fr-".concat(o,'-color .fr-select-color[data-param1="').concat(m.helpers.RGBToHex(e.css(t)),'"]'));c.append('<span class="fr-selected-color" aria-hidden="true">\uf00c</span>'),c.addClass("fr-active-item").attr("aria-selected",!0);break}e=e.parent()}!function n(o){var t=m.popups.get("".concat(o,"Color.picker")),r=t.find(".fr-".concat(o,"-color .fr-active-item")).attr("data-param1"),e=t.find(".fr-color-hex-layer input");r||(r="");e.length&&O(e.val(r).input).trigger("change")}(o)}function e(o){"REMOVE"!==o?m.format.applyStyle("background-color",m.helpers.HEXtoRGB(o)):m.format.removeStyle("background-color"),m.popups.hide("backgroundColor.picker")}function a(o){"REMOVE"!==o?m.format.applyStyle("color",m.helpers.HEXtoRGB(o)):m.format.removeStyle("color"),m.popups.hide("textColor.picker")}return{showColorsPopup:function p(o){var t=m.$tb.find('.fr-command[data-cmd="'.concat(o,'"]')),r=m.popups.get("".concat(o,".picker"));if(r||(r=function n(o){var t="";m.opts.toolbarInline&&0<m.opts.colorsButtons.length&&(t+='<div class="fr-buttons fr-colors-buttons fr-tabs">\n '.concat(m.button.buildList(m.opts.colorsButtons),"\n </div>"));var r,e="";r="textColor"===o?(m.opts.colorsHEXInput&&(e=s.replace(/\[ID\]/g,"fr-color-hex-layer-text-".concat(m.id)).replace(/\[COMMAND\]/g,"customTextColor")),{buttons:t,text_colors:l("text"),custom_color:e}):(m.opts.colorsHEXInput&&(e=s.replace(/\[ID\]/g,"fr-color-hex-layer-background-".concat(m.id)).replace(/\[COMMAND\]/g,"customBackgroundColor")),{buttons:t,background_colors:l("background"),custom_color:e});var a=m.popups.create("".concat(o,".picker"),r);return function c(h,k){m.events.on("popup.tab",function(o){var t=O(o.currentTarget);if(!m.popups.isVisible(k)||!t.is("span, input, button"))return!0;var r,e,a=o.which,c=!0;if(v.KEYCODE.TAB===a){var n=h.find("span.fr-select-color");if(t.is(n.first())&&o.shiftKey||t.is(h.find("span.fr-submit"))&&!o.shiftKey){var s=h.find(".fr-buttons");c=!m.accessibility.focusToolbar(s,!!o.shiftKey)}if(!1!==c){var l=h.find("span.fr-select-color");l.add(h.find("input")),l.add(h.find("button.fr-submit")),r=l.index(t),r=o.shiftKey?((r-1)%l.length+l.length)%l.length:(r+1)%l.length,e=l.get(r),m.events.disableBlur(),e.focus(),c=!1}}else if(v.KEYCODE.ARROW_UP===a||v.KEYCODE.ARROW_DOWN===a||v.KEYCODE.ARROW_LEFT===a||v.KEYCODE.ARROW_RIGHT===a){if(t.is("span.fr-select-color")){var i=t.parent().find("span.fr-select-color"),p=i.index(t),u=m.opts.colorsStep,d=Math.floor(i.length/u),f=p%u,C=Math.floor(p/u),b=C*u+f,g=d*u;v.KEYCODE.ARROW_UP===a?b=((b-u)%g+g)%g:v.KEYCODE.ARROW_DOWN===a?b=(b+u)%g:v.KEYCODE.ARROW_LEFT===a?b=((b-1)%g+g)%g:v.KEYCODE.ARROW_RIGHT===a&&(b=(b+1)%g);var E=O(i.get(b));m.events.disableBlur(),E.focus(),c=!1}}else v.KEYCODE.ENTER===a&&(m.button.exec(t),c=!1);return!1===c&&(o.preventDefault(),o.stopPropagation()),c},!0)}(a,"".concat(o,".picker")),a}(o)),!r.hasClass("fr-active"))if(m.popups.setContainer("".concat(o,".picker"),m.$tb),i("textColor"===o?"text":"background"),t.isVisible()){var e=m.button.getPosition(t),a=e.left,c=e.top;m.popups.show("".concat(o,".picker"),a,c,t.outerHeight())}else m.position.forSelection(r),m.popups.show("".concat(o,".picker"))},background:e,customColor:function c(o){var t=m.popups.get("".concat(o,"Color.picker")).find(".fr-color-hex-layer input");if(t.length){var r=t.val();"background"===o?e(r):a(r)}},text:a,back:function o(){m.popups.hide("textColor.picker"),m.popups.hide("backgroundColor.picker"),m.toolbar.showInline()}}},v.DefineIcon("textColor",{NAME:"tint",SVG_KEY:"textColor"}),v.RegisterCommand("textColor",{title:"Text Color",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("textColor.picker")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("textColor.picker")):this.colors.showColorsPopup("textColor")}}),v.RegisterCommand("applytextColor",{undo:!0,callback:function(o,t){this.colors.text(t)}}),v.RegisterCommand("customTextColor",{title:"OK",undo:!0,callback:function(){this.colors.customColor("text")}}),v.DefineIcon("backgroundColor",{NAME:"paint-brush",SVG_KEY:"backgroundColor"}),v.RegisterCommand("backgroundColor",{title:"Background Color",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("backgroundColor.picker")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("backgroundColor.picker")):this.colors.showColorsPopup("backgroundColor")}}),v.RegisterCommand("applybackgroundColor",{undo:!0,callback:function(o,t){this.colors.background(t)}}),v.RegisterCommand("customBackgroundColor",{title:"OK",undo:!0,callback:function(){this.colors.customColor("background")}}),v.DefineIcon("colorsBack",{NAME:"arrow-left",SVG_KEY:"back"}),v.RegisterCommand("colorsBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.colors.back()}}),v.DefineIcon("remove",{NAME:"eraser",SVG_KEY:"remove"})});