├── .gitignore ├── .travis.yml ├── MANIFEST.in ├── README.md ├── README.rst ├── _config.yml ├── froala_editor ├── __init__.py ├── fields.py ├── static │ └── froala_editor │ │ ├── css │ │ ├── froala-django.css │ │ ├── froala_editor.css │ │ ├── froala_editor.min.css │ │ ├── froala_editor.pkgd.css │ │ ├── froala_editor.pkgd.min.css │ │ ├── froala_style.css │ │ ├── froala_style.min.css │ │ ├── plugins.pkgd.css │ │ ├── plugins.pkgd.min.css │ │ ├── plugins │ │ │ ├── char_counter.css │ │ │ ├── char_counter.min.css │ │ │ ├── code_view.css │ │ │ ├── code_view.min.css │ │ │ ├── colors.css │ │ │ ├── colors.min.css │ │ │ ├── draggable.css │ │ │ ├── draggable.min.css │ │ │ ├── emoticons.css │ │ │ ├── emoticons.min.css │ │ │ ├── file.css │ │ │ ├── file.min.css │ │ │ ├── files_manager.css │ │ │ ├── files_manager.min.css │ │ │ ├── filestack.css │ │ │ ├── filestack.min.css │ │ │ ├── find_and_replace.css │ │ │ ├── find_and_replace.min.css │ │ │ ├── fullscreen.css │ │ │ ├── fullscreen.min.css │ │ │ ├── help.css │ │ │ ├── help.min.css │ │ │ ├── image.css │ │ │ ├── image.min.css │ │ │ ├── image_manager.css │ │ │ ├── image_manager.min.css │ │ │ ├── line_breaker.css │ │ │ ├── line_breaker.min.css │ │ │ ├── markdown.css │ │ │ ├── markdown.min.css │ │ │ ├── quick_insert.css │ │ │ ├── quick_insert.min.css │ │ │ ├── special_characters.css │ │ │ ├── special_characters.min.css │ │ │ ├── table.css │ │ │ ├── table.min.css │ │ │ ├── trim_video.css │ │ │ ├── trim_video.min.css │ │ │ ├── video.css │ │ │ └── video.min.css │ │ ├── themes │ │ │ ├── dark.css │ │ │ ├── dark.min.css │ │ │ ├── gray.css │ │ │ ├── gray.min.css │ │ │ ├── royal.css │ │ │ └── royal.min.css │ │ └── third_party │ │ │ ├── embedly.css │ │ │ ├── embedly.min.css │ │ │ ├── font_awesome.css │ │ │ ├── font_awesome.min.css │ │ │ ├── image_tui.css │ │ │ ├── image_tui.min.css │ │ │ ├── spell_checker.css │ │ │ └── spell_checker.min.css │ │ └── js │ │ ├── froala-django.js │ │ ├── froala_editor.min.js │ │ ├── froala_editor.pkgd.min.js │ │ ├── languages │ │ ├── ar.js │ │ ├── bs.js │ │ ├── cs.js │ │ ├── da.js │ │ ├── de.js │ │ ├── el.js │ │ ├── en_ca.js │ │ ├── en_gb.js │ │ ├── es.js │ │ ├── et.js │ │ ├── fa.js │ │ ├── fi.js │ │ ├── fr.js │ │ ├── he.js │ │ ├── hr.js │ │ ├── hu.js │ │ ├── id.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── ko.js │ │ ├── ku.js │ │ ├── me.js │ │ ├── nb.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── pt_br.js │ │ ├── pt_pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── sl.js │ │ ├── sr.js │ │ ├── sv.js │ │ ├── th.js │ │ ├── tr.js │ │ ├── uk.js │ │ ├── vi.js │ │ ├── zh_cn.js │ │ └── zh_tw.js │ │ ├── plugins.pkgd.min.js │ │ ├── plugins │ │ ├── align.min.js │ │ ├── char_counter.min.js │ │ ├── code_beautifier.min.js │ │ ├── code_view.min.js │ │ ├── colors.min.js │ │ ├── cryptojs.min.js │ │ ├── draggable.min.js │ │ ├── edit_in_popup.min.js │ │ ├── emoticons.min.js │ │ ├── entities.min.js │ │ ├── file.min.js │ │ ├── files_manager.min.js │ │ ├── filestack.min.js │ │ ├── find_and_replace.min.js │ │ ├── font_family.min.js │ │ ├── font_size.min.js │ │ ├── forms.min.js │ │ ├── fullscreen.min.js │ │ ├── help.min.js │ │ ├── image.min.js │ │ ├── image_manager.min.js │ │ ├── inline_class.min.js │ │ ├── inline_style.min.js │ │ ├── line_breaker.min.js │ │ ├── line_height.min.js │ │ ├── link.min.js │ │ ├── lists.min.js │ │ ├── markdown.min.js │ │ ├── paragraph_format.min.js │ │ ├── paragraph_style.min.js │ │ ├── print.min.js │ │ ├── quick_insert.min.js │ │ ├── quote.min.js │ │ ├── save.min.js │ │ ├── special_characters.min.js │ │ ├── table.min.js │ │ ├── track_changes.min.js │ │ ├── trim_video.min.js │ │ ├── url.min.js │ │ ├── video.min.js │ │ ├── word_counter.min.js │ │ └── word_paste.min.js │ │ └── third_party │ │ ├── embedly.min.js │ │ ├── font_awesome.min.js │ │ ├── image_tui.min.js │ │ ├── showdown.min.js │ │ └── spell_checker.min.js ├── urls.py ├── views.py └── widgets.py ├── publish_package.sh ├── setup.py └── version.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *~ 3 | *.DS_Store 4 | .idea 5 | *.egg-info 6 | dist 7 | build 8 | MANIFEST -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | git: 2 | depth: false 3 | quiet: false 4 | language: generic 5 | dist: bionic 6 | sudo: required 7 | branches: 8 | only: 9 | - /dev*/ 10 | - /AO-dev*/ 11 | - /QA*/ 12 | - /QE*/ 13 | - /RC*/ 14 | - /Release-Master*/ 15 | 16 | env: 17 | - SHORT_COMMIT= `git rev-parse --short=7 ${TRAVIS_COMMIT}` 18 | 19 | before_install: 20 | - echo $TRAVIS_BRANCH 21 | - echo $PWD 22 | - echo $TRAVIS_COMMIT 23 | - echo $BUILD_REPO_NAME 24 | jobs: 25 | include: 26 | if: commit_message =~ /(deploy-yes)/ 27 | script: 28 | - chmod u+x publish_package.sh && bash publish_package.sh 29 | notifications: 30 | email: 31 | recipients: 32 | - harasunu.narayan@froala.com 33 | on_success: always 34 | on_failure: always 35 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt 2 | include README.md 3 | recursive-include docs *.txt 4 | recursive-include froala_editor/static * 5 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Django Froala WYSIWYG Editor 2 | ============================ 3 | 4 | django-froala-editor package helps integrate `Froala WYSIWYG HTML 5 | editor `__ with Django. 6 | 7 | View the full documentation at `Github. `__ -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /froala_editor/__init__.py: -------------------------------------------------------------------------------- 1 | PLUGINS = ( 2 | 'align', 'char_counter', 'code_beautifier', 'code_view', 'colors', 'draggable', 'emoticons', 'entities', 'file', 3 | 'font_family', 'font_size', 'fullscreen', 'help', 'image', 'image_manager', 'inline_style', 'line_breaker', 'link', 'lists', 4 | 'paragraph_format', 'paragraph_style', 'print', 'quick_insert', 'quote', 'save', 'special_characters', 'table', 'url', 5 | 'video', 'word_paste' 6 | ) 7 | 8 | PLUGINS_WITH_CSS = ( 9 | 'char_counter', 'code_view', 'colors', 'draggable', 'emoticons', 'file', 'fullscreen', 'help', 'image', 'image_manager', 10 | 'line_breaker', 'quick_insert', 'special_characters', 'table', 'video', 'markdown', 'filestack' 11 | ) 12 | 13 | THIRD_PARTY = ( 14 | # 'image_aviary', 'spell_checker' 15 | ) 16 | 17 | THIRD_PARTY_WITH_CSS = ( 18 | 'spell_checker' 19 | ) 20 | -------------------------------------------------------------------------------- /froala_editor/fields.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Field 2 | from django.forms import Textarea 3 | 4 | from froala_editor.widgets import FroalaEditor 5 | from django.conf import settings 6 | 7 | from . import PLUGINS, THIRD_PARTY 8 | 9 | 10 | class FroalaField(Field): 11 | description = "Froala Editable Field" 12 | 13 | def __init__(self, *args, **kwargs): 14 | self.options = kwargs.pop('options', {}) 15 | self.theme = kwargs.pop('theme', getattr(settings, 'FROALA_EDITOR_THEME', None)) 16 | self.plugins = kwargs.pop('plugins', getattr(settings, 'FROALA_EDITOR_PLUGINS', PLUGINS)) 17 | self.third_party = kwargs.pop('plugins', getattr(settings, 'FROALA_EDITOR_THIRD_PARTY', THIRD_PARTY)) 18 | self.image_upload = kwargs.pop('image_upload', True) 19 | self.file_upload = kwargs.pop('file_upload', True) 20 | self.use_froala = kwargs.pop('', getattr(settings, 'USE_FROALA_EDITOR', True)) 21 | super(FroalaField, self).__init__(*args, **kwargs) 22 | 23 | def get_internal_type(self): 24 | return "TextField" 25 | 26 | def formfield(self, **kwargs): 27 | if self.use_froala: 28 | widget = FroalaEditor(options=self.options, theme=self.theme, plugins=self.plugins, 29 | image_upload=self.image_upload, 30 | file_upload=self.file_upload, third_party=self.third_party) 31 | else: 32 | widget = Textarea() 33 | defaults = {'widget': widget} 34 | defaults.update(kwargs) 35 | return super(FroalaField, self).formfield(**defaults) 36 | 37 | 38 | try: 39 | from south.modelsinspector import add_introspection_rules 40 | 41 | add_introspection_rules([], ["^froala_editor\.fields\.FroalaField"]) 42 | except ImportError: 43 | pass 44 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/froala-django.css: -------------------------------------------------------------------------------- 1 | form .fr-dropdown ul.fr-dropdown-menu { 2 | margin-left: 0; 3 | } 4 | 5 | form .fr-element p { 6 | margin-left: 0; 7 | padding-left: 0; 8 | } 9 | 10 | .fr-box { 11 | clear: both; 12 | z-index: 1; 13 | } 14 | 15 | div.form-row { 16 | overflow: visible; 17 | } 18 | 19 | .aligned label:not(.vCheckboxLabel):after { 20 | content: none; 21 | } -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/char_counter.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-box .fr-counter { 24 | padding: 10px; 25 | float: right; 26 | color: #999999; 27 | content: attr(data-chars); 28 | font-size: 14px; 29 | font-family: sans-serif; 30 | z-index: 1; 31 | border-radius: 2px 0 0 0; 32 | -moz-border-radius: 2px 0 0 0; 33 | -webkit-border-radius: 2px 0 0 0; 34 | -moz-background-clip: padding; 35 | -webkit-background-clip: padding-box; 36 | background-clip: padding-box; } 37 | .fr-box.fr-rtl .fr-counter { 38 | left: 0; 39 | right: auto; 40 | border-left: none; 41 | border-radius: 0 2px 0 0; 42 | -moz-border-radius: 0 2px 0 0; 43 | -webkit-border-radius: 0 2px 0 0; 44 | -moz-background-clip: padding; 45 | -webkit-background-clip: padding-box; 46 | background-clip: padding-box; } 47 | 48 | .fr-box.fr-code-view .fr-counter { 49 | display: none; } 50 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/char_counter.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-box .fr-counter{padding:10px;float:right;color:#999;content:attr(data-chars);font-size:14px;font-family:sans-serif;z-index:1;border-radius:2px 0 0 0;-moz-border-radius:2px 0 0 0;-webkit-border-radius:2px 0 0 0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.fr-box.fr-rtl .fr-counter{left:0;right:auto;border-left:none;border-radius:0 2px 0 0;-moz-border-radius:0 2px 0 0;-webkit-border-radius:0 2px 0 0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.fr-box.fr-code-view .fr-counter{display:none} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/code_view.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | textarea.fr-code { 24 | display: none; 25 | width: 100%; 26 | resize: none; 27 | -moz-resize: none; 28 | -webkit-resize: none; 29 | -webkit-box-sizing: border-box; 30 | -moz-box-sizing: border-box; 31 | box-sizing: border-box; 32 | border: none; 33 | padding: 10px; 34 | margin: 0; 35 | font-family: "Courier New",monospace; 36 | font-size: 14px; 37 | background: #FFF; 38 | color: #000; 39 | outline: none; } 40 | 41 | .fr-box.fr-rtl textarea.fr-code { 42 | direction: rtl; } 43 | 44 | .fr-box .CodeMirror { 45 | display: none; } 46 | 47 | .fr-box.fr-code-view textarea.fr-code { 48 | display: block; } 49 | .fr-box.fr-code-view .fr-element, .fr-box.fr-code-view .fr-placeholder, .fr-box.fr-code-view .fr-iframe { 50 | display: none; } 51 | .fr-box.fr-code-view .CodeMirror { 52 | display: block; } 53 | 54 | .fr-box.fr-inline.fr-code-view .fr-command.fr-btn.html-switch { 55 | display: block; } 56 | .fr-box.fr-inline .fr-command.fr-btn.html-switch { 57 | display: none; 58 | position: absolute; 59 | top: 0; 60 | right: 0; 61 | display: none; 62 | background: #FFF; 63 | color: #333333; 64 | -moz-outline: 0; 65 | outline: 0; 66 | border: 0; 67 | line-height: 1; 68 | cursor: pointer; 69 | text-align: left; 70 | padding: 8px 7px; 71 | -webkit-transition: background 0.2s ease 0s; 72 | -moz-transition: background 0.2s ease 0s; 73 | -ms-transition: background 0.2s ease 0s; 74 | -o-transition: background 0.2s ease 0s; 75 | border-radius: 0; 76 | -moz-border-radius: 0; 77 | -webkit-border-radius: 0; 78 | -moz-background-clip: padding; 79 | -webkit-background-clip: padding-box; 80 | background-clip: padding-box; 81 | z-index: 2; 82 | -webkit-box-sizing: border-box; 83 | -moz-box-sizing: border-box; 84 | box-sizing: border-box; 85 | text-decoration: none; 86 | user-select: none; 87 | -o-user-select: none; 88 | -moz-user-select: none; 89 | -khtml-user-select: none; 90 | -webkit-user-select: none; 91 | -ms-user-select: none; } 92 | .fr-box.fr-inline .fr-command.fr-btn.html-switch i { 93 | font-size: 24px; 94 | width: 24px; 95 | text-align: center; } 96 | .fr-box.fr-inline .fr-command.fr-btn.html-switch.fr-desktop:hover { 97 | background: #ebebeb; } 98 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/code_view.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}textarea.fr-code{display:none;width:100%;resize:none;-moz-resize:none;-webkit-resize:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;padding:10px;margin:0;font-family:"Courier New",monospace;font-size:14px;background:#FFF;color:#000;outline:none}.fr-box.fr-rtl textarea.fr-code{direction:rtl}.fr-box .CodeMirror{display:none}.fr-box.fr-code-view textarea.fr-code{display:block}.fr-box.fr-code-view .fr-element,.fr-box.fr-code-view .fr-placeholder,.fr-box.fr-code-view .fr-iframe{display:none}.fr-box.fr-code-view .CodeMirror{display:block}.fr-box.fr-inline.fr-code-view .fr-command.fr-btn.html-switch{display:block}.fr-box.fr-inline .fr-command.fr-btn.html-switch{display:none;position:absolute;top:0;right:0;display:none;background:#FFF;color:#333;-moz-outline:0;outline:0;border:0;line-height:1;cursor:pointer;text-align:left;padding:8px 7px;-webkit-transition:background 0.2s ease 0s;-moz-transition:background 0.2s ease 0s;-ms-transition:background 0.2s ease 0s;-o-transition:background 0.2s ease 0s;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;z-index:2;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;text-decoration:none;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.fr-box.fr-inline .fr-command.fr-btn.html-switch i{font-size:24px;width:24px;text-align:center}.fr-box.fr-inline .fr-command.fr-btn.html-switch.fr-desktop:hover{background:#ebebeb} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/colors.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-popup .fr-layer.fr-color-hex-layer { 24 | margin: 0; 25 | padding: 20px; 26 | padding-top: 0; 27 | float: left; } 28 | .fr-popup .fr-layer.fr-color-hex-layer .fr-input-line { 29 | float: left; 30 | width: calc(100% - 50px); 31 | padding: 15px 0 0; } 32 | .fr-popup .fr-layer.fr-color-hex-layer .fr-action-buttons { 33 | float: right; 34 | width: 38px; 35 | height: 40px; 36 | padding: 17px 0 0; 37 | margin: 0; } 38 | .fr-popup .fr-layer.fr-color-hex-layer .fr-action-buttons button.fr-command { 39 | border-radius: 2px; 40 | -moz-border-radius: 2px; 41 | -webkit-border-radius: 2px; 42 | -moz-background-clip: padding; 43 | -webkit-background-clip: padding-box; 44 | background-clip: padding-box; 45 | font-size: 13px; 46 | height: 40px; 47 | width: 38px; } 48 | .fr-popup .fr-separator + .fr-colors-tabs { 49 | margin-left: 2px; 50 | margin-right: 2px; } 51 | .fr-popup .fr-color-set { 52 | line-height: 0; 53 | display: none; } 54 | .fr-popup .fr-color-set.fr-selected-set { 55 | display: block; 56 | padding: 20px; 57 | padding-bottom: 0; } 58 | .fr-popup .fr-color-set > span { 59 | display: inline-block; 60 | width: 32px; 61 | height: 32px; 62 | position: relative; 63 | z-index: 1; } 64 | .fr-popup .fr-color-set > span > i, .fr-popup .fr-color-set > span > svg { 65 | text-align: center; 66 | line-height: 32px; 67 | height: 24px; 68 | width: 24px; 69 | margin: 4px; 70 | font-size: 13px; 71 | position: absolute; 72 | bottom: 0; 73 | cursor: default; 74 | left: 0; } 75 | .fr-popup .fr-color-set > span > i path, .fr-popup .fr-color-set > span > svg path { 76 | fill: #222222; } 77 | .fr-popup .fr-color-set > span .fr-selected-color { 78 | color: #FFF; 79 | font-family: FontAwesome; 80 | font-size: 13px; 81 | font-weight: 400; 82 | line-height: 32px; 83 | position: absolute; 84 | top: 0; 85 | bottom: 0; 86 | right: 0; 87 | left: 0; 88 | text-align: center; 89 | cursor: default; } 90 | .fr-popup .fr-color-set > span:hover, .fr-popup .fr-color-set > span:focus { 91 | outline: 1px solid #222222; 92 | z-index: 2; } 93 | 94 | .fr-rtl .fr-popup .fr-colors-tabs .fr-colors-tab.fr-selected-tab[data-param1="text"] ~ [data-param1="background"]::after { 95 | -webkit-transform: translate3d(100%, 0, 0); 96 | -moz-transform: translate3d(100%, 0, 0); 97 | -ms-transform: translate3d(100%, 0, 0); 98 | -o-transform: translate3d(100%, 0, 0); } 99 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/colors.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-popup .fr-layer.fr-color-hex-layer{margin:0;padding:20px;padding-top:0;float:left}.fr-popup .fr-layer.fr-color-hex-layer .fr-input-line{float:left;width:calc(100% - 50px);padding:15px 0 0}.fr-popup .fr-layer.fr-color-hex-layer .fr-action-buttons{float:right;width:38px;height:40px;padding:17px 0 0;margin:0}.fr-popup .fr-layer.fr-color-hex-layer .fr-action-buttons button.fr-command{border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;font-size:13px;height:40px;width:38px}.fr-popup .fr-separator+.fr-colors-tabs{margin-left:2px;margin-right:2px}.fr-popup .fr-color-set{line-height:0;display:none}.fr-popup .fr-color-set.fr-selected-set{display:block;padding:20px;padding-bottom:0}.fr-popup .fr-color-set>span{display:inline-block;width:32px;height:32px;position:relative;z-index:1}.fr-popup .fr-color-set>span>i,.fr-popup .fr-color-set>span>svg{text-align:center;line-height:32px;height:24px;width:24px;margin:4px;font-size:13px;position:absolute;bottom:0;cursor:default;left:0}.fr-popup .fr-color-set>span>i path,.fr-popup .fr-color-set>span>svg path{fill:#222}.fr-popup .fr-color-set>span .fr-selected-color{color:#FFF;font-family:FontAwesome;font-size:13px;font-weight:400;line-height:32px;position:absolute;top:0;bottom:0;right:0;left:0;text-align:center;cursor:default}.fr-popup .fr-color-set>span:hover,.fr-popup .fr-color-set>span:focus{outline:1px solid #222;z-index:2}.fr-rtl .fr-popup .fr-colors-tabs .fr-colors-tab.fr-selected-tab[data-param1="text"] ~ [data-param1="background"]::after{-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0)} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/draggable.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-drag-helper { 24 | background: #0098f7; 25 | height: 2px; 26 | margin-top: -1px; 27 | -webkit-opacity: 0.2; 28 | -moz-opacity: 0.2; 29 | opacity: 0.2; 30 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 31 | position: absolute; 32 | z-index: 2147483640; 33 | display: none; } 34 | .fr-drag-helper.fr-visible { 35 | display: block; } 36 | 37 | .fr-dragging { 38 | -webkit-opacity: 0.4; 39 | -moz-opacity: 0.4; 40 | opacity: 0.4; 41 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; } 42 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/draggable.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-drag-helper{background:#0098f7;height:2px;margin-top:-1px;-webkit-opacity:.2;-moz-opacity:.2;opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";position:absolute;z-index:2147483640;display:none}.fr-drag-helper.fr-visible{display:block}.fr-dragging{-webkit-opacity:.4;-moz-opacity:.4;opacity:.4;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/emoticons.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-popup .fr-emoticon { 24 | width: 24px; 25 | height: 24px; 26 | font-family: "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; } 27 | .fr-popup .fr-emoticon img { 28 | height: 24px; 29 | width: 24px; } 30 | .fr-popup .fr-command.fr-btn.fr-tabs-unicode { 31 | padding: 0 0 0 14px; } 32 | @media screen and (-ms-high-contrast: active) and (min-width: 768px), (-ms-high-contrast: none) and (min-width: 768px) { 33 | .fr-popup .fr-icon-container.fr-emoticon-container { 34 | width: 368px; } } 35 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/emoticons.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-popup .fr-emoticon{width:24px;height:24px;font-family:"Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols}.fr-popup .fr-emoticon img{height:24px;width:24px}.fr-popup .fr-command.fr-btn.fr-tabs-unicode{padding:0 0 0 14px}@media screen and (-ms-high-contrast: active) and (min-width: 768px), (-ms-high-contrast: none) and (min-width: 768px){.fr-popup .fr-icon-container.fr-emoticon-container{width:368px}} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/file.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-popup .fr-file-upload-layer { 24 | border: dashed 2px #bdbdbd; 25 | padding: 25px 0; 26 | margin: 20px; 27 | position: relative; 28 | font-size: 14px; 29 | letter-spacing: 1px; 30 | line-height: 140%; 31 | -webkit-box-sizing: border-box; 32 | -moz-box-sizing: border-box; 33 | box-sizing: border-box; 34 | text-align: center; } 35 | .fr-popup .fr-file-upload-layer:hover { 36 | background: #ebebeb; } 37 | .fr-popup .fr-file-upload-layer.fr-drop { 38 | background: #ebebeb; 39 | border-color: #0098f7; } 40 | .fr-popup .fr-file-upload-layer .fr-form { 41 | -webkit-opacity: 0; 42 | -moz-opacity: 0; 43 | opacity: 0; 44 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 45 | position: absolute; 46 | top: 0; 47 | bottom: 0; 48 | left: 0; 49 | right: 0; 50 | z-index: 2147483640; 51 | overflow: hidden; 52 | margin: 0 !important; 53 | padding: 0 !important; 54 | width: 100% !important; } 55 | .fr-popup .fr-file-upload-layer .fr-form input { 56 | cursor: pointer; 57 | position: absolute; 58 | right: 0; 59 | top: 0; 60 | bottom: 0; 61 | width: 500%; 62 | height: 100%; 63 | margin: 0; 64 | font-size: 400px; } 65 | .fr-popup .fr-file-progress-bar-layer { 66 | -webkit-box-sizing: border-box; 67 | -moz-box-sizing: border-box; 68 | box-sizing: border-box; } 69 | .fr-popup .fr-file-progress-bar-layer > h3 { 70 | font-size: 16px; 71 | margin: 10px 0; 72 | font-weight: normal; } 73 | .fr-popup .fr-file-progress-bar-layer > div.fr-action-buttons { 74 | display: none; } 75 | .fr-popup .fr-file-progress-bar-layer > div.fr-loader { 76 | background: #b3e0fd; 77 | height: 10px; 78 | width: 100%; 79 | margin-top: 20px; 80 | overflow: hidden; 81 | position: relative; } 82 | .fr-popup .fr-file-progress-bar-layer > div.fr-loader span { 83 | display: block; 84 | height: 100%; 85 | width: 0%; 86 | background: #0098f7; 87 | -webkit-transition: width 0.2s ease 0s; 88 | -moz-transition: width 0.2s ease 0s; 89 | -ms-transition: width 0.2s ease 0s; 90 | -o-transition: width 0.2s ease 0s; } 91 | .fr-popup .fr-file-progress-bar-layer > div.fr-loader.fr-indeterminate span { 92 | width: 30% !important; 93 | position: absolute; 94 | top: 0; 95 | -webkit-animation: loading 2s linear infinite; 96 | -moz-animation: loading 2s linear infinite; 97 | -o-animation: loading 2s linear infinite; 98 | animation: loading 2s linear infinite; } 99 | .fr-popup .fr-file-progress-bar-layer.fr-error > div.fr-loader { 100 | display: none; } 101 | .fr-popup .fr-file-progress-bar-layer.fr-error > div.fr-action-buttons { 102 | display: block; } 103 | 104 | @keyframes loading { 105 | from { 106 | left: -25%; } 107 | to { 108 | left: 100%; } } 109 | @-webkit-keyframes loading { 110 | from { 111 | left: -25%; } 112 | to { 113 | left: 100%; } } 114 | @-moz-keyframes loading { 115 | from { 116 | left: -25%; } 117 | to { 118 | left: 100%; } } 119 | @-o-keyframes loading { 120 | from { 121 | left: -25%; } 122 | to { 123 | left: 100%; } } 124 | @keyframes loading { 125 | from { 126 | left: -25%; } 127 | to { 128 | left: 100%; } } 129 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/file.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-popup .fr-file-upload-layer{border:dashed 2px #bdbdbd;padding:25px 0;margin:20px;position:relative;font-size:14px;letter-spacing:1px;line-height:140%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;text-align:center}.fr-popup .fr-file-upload-layer:hover{background:#ebebeb}.fr-popup .fr-file-upload-layer.fr-drop{background:#ebebeb;border-color:#0098f7}.fr-popup .fr-file-upload-layer .fr-form{-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";position:absolute;top:0;bottom:0;left:0;right:0;z-index:2147483640;overflow:hidden;margin:0 !important;padding:0 !important;width:100% !important}.fr-popup .fr-file-upload-layer .fr-form input{cursor:pointer;position:absolute;right:0;top:0;bottom:0;width:500%;height:100%;margin:0;font-size:400px}.fr-popup .fr-file-progress-bar-layer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fr-popup .fr-file-progress-bar-layer>h3{font-size:16px;margin:10px 0;font-weight:normal}.fr-popup .fr-file-progress-bar-layer>div.fr-action-buttons{display:none}.fr-popup .fr-file-progress-bar-layer>div.fr-loader{background:#b3e0fd;height:10px;width:100%;margin-top:20px;overflow:hidden;position:relative}.fr-popup .fr-file-progress-bar-layer>div.fr-loader span{display:block;height:100%;width:0%;background:#0098f7;-webkit-transition:width 0.2s ease 0s;-moz-transition:width 0.2s ease 0s;-ms-transition:width 0.2s ease 0s;-o-transition:width 0.2s ease 0s}.fr-popup .fr-file-progress-bar-layer>div.fr-loader.fr-indeterminate span{width:30% !important;position:absolute;top:0;-webkit-animation:loading 2s linear infinite;-moz-animation:loading 2s linear infinite;-o-animation:loading 2s linear infinite;animation:loading 2s linear infinite}.fr-popup .fr-file-progress-bar-layer.fr-error>div.fr-loader{display:none}.fr-popup .fr-file-progress-bar-layer.fr-error>div.fr-action-buttons{display:block}@keyframes loading{from{left:-25%}to{left:100%}}@-webkit-keyframes loading{from{left:-25%}to{left:100%}}@-moz-keyframes loading{from{left:-25%}to{left:100%}}@-o-keyframes loading{from{left:-25%}to{left:100%}}@keyframes loading{from{left:-25%}to{left:100%}} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/filestack.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-popup .fr-command.fr-btn[data-cmd="filestackIcon"] svg path, 8 | .fr-popup .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path, 9 | .fr-popup .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path, 10 | .fr-toolbar .fr-command.fr-btn[data-cmd="openFilePicker"] svg path, 11 | .fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path, 12 | .fr-popup .fr-tabs .fr-command.fr-btn[data-cmd="openFilePicker"] svg path, 13 | .fr-popup .fr-tabs .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path, 14 | .fr-popup .fr-tabs .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path, 15 | .fr-command.fr-btn[data-cmd="openFilePickerReplaceImageOnly"] svg path, 16 | .fr-command.fr-btn[data-cmd="openFilePickerReplaceVideoOnly"] svg path, 17 | .fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path, 18 | .fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerImageOnly"] svg path:last-child, 19 | .fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerVideoOnly"] svg path:last-child, 20 | .fr-popup .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path, 21 | .fr-popup .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path, 22 | .fr-popup .fr-command.fr-btn[data-cmd="filestackIcon"] svg path, 23 | .fr-popup .fr-command.fr-btn[data-cmd="openFilePickerFile"] svg path { 24 | fill: #ef4a25; } 25 | 26 | .fr-command.fr-filestack-active.fr-btn.fr-filestack-active svg path { 27 | fill: #0098F7; } 28 | 29 | .fsp-picker-appear-active { 30 | position: absolute; 31 | top: 50%; 32 | left: 50%; 33 | transform: translate(-50%, -50%); 34 | z-index: 9; } 35 | 36 | body.fr-fullscreen .fs-transforms-container { 37 | position: absolute; 38 | z-index: 2247483660; } 39 | 40 | .fsp-notifications__container { 41 | position: fixed !important; } 42 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/filestack.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-popup .fr-command.fr-btn[data-cmd="filestackIcon"] svg path,.fr-popup .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path,.fr-popup .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path,.fr-toolbar .fr-command.fr-btn[data-cmd="openFilePicker"] svg path,.fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path,.fr-popup .fr-tabs .fr-command.fr-btn[data-cmd="openFilePicker"] svg path,.fr-popup .fr-tabs .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path,.fr-popup .fr-tabs .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path,.fr-command.fr-btn[data-cmd="openFilePickerReplaceImageOnly"] svg path,.fr-command.fr-btn[data-cmd="openFilePickerReplaceVideoOnly"] svg path,.fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path,.fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerImageOnly"] svg path:last-child,.fr-toolbar .fr-command.fr-btn[data-cmd="openFilePickerVideoOnly"] svg path:last-child,.fr-popup .fr-command.fr-btn[data-cmd="openFilePickerImage"] svg path,.fr-popup .fr-command.fr-btn[data-cmd="openFilePickerVideo"] svg path,.fr-popup .fr-command.fr-btn[data-cmd="filestackIcon"] svg path,.fr-popup .fr-command.fr-btn[data-cmd="openFilePickerFile"] svg path{fill:#ef4a25}.fr-command.fr-filestack-active.fr-btn.fr-filestack-active svg path{fill:#0098F7}.fsp-picker-appear-active{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);z-index:9}body.fr-fullscreen .fs-transforms-container{position:absolute;z-index:2247483660}.fsp-notifications__container{position:fixed !important} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/find_and_replace.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-find-replace-layer .fr-header,.fr-find-replace-layer .fr-body{margin:15px}.fr-find-replace-layer .fr-drag-handle{cursor:move}.fr-find-replace-layer h3{margin:0;font-size:16px;text-align:left;font-weight:bold}.fr-find-replace-layer .fr-body .fr-input-line input.fr-disabled{background-color:#f5f5f5;color:#a9a9a9;border:1px solid #d1d1d1;cursor:not-allowed}.fr-find-replace-layer .fr-body .fr-input-line input#fr-findText::placeholder,.fr-find-replace-layer .fr-body .fr-input-line input#fr-replaceText::placeholder{color:#a9a9a9}.fr-find-replace-layer .fr-body .fr-label-disabled{background-color:#f5f5f5}.fr-find-replace-layer .fr-body .fr-close-btn{position:absolute;top:2px;right:10px;font-size:25px;background:none;border:none;cursor:pointer;color:#333}.fr-find-replace-layer .fr-body .fr-close-btn:hover{color:grey}.fr-find-replace-layer .fr-body .fr-toggle-advanced-options{display:flex;align-items:center;justify-content:space-between;padding:10px 0px;background-color:#f5f5f5;border-radius:4px;cursor:pointer;font-weight:bold;transition:background-color 0.3s ease;width:auto;background:none;color:#353333}.fr-find-replace-layer .fr-body .fr-separator{margin:10px 0;border-top:1px solid #e0e0e0}.fr-find-replace-layer .fr-body input{width:70%;padding:8px;margin-bottom:10px;font-size:14px;border:1px solid #ccc;border-radius:4px}.fr-find-replace-layer .fr-body .fr-input-container{position:relative;display:flex;align-items:center;width:100%}.fr-find-replace-layer .fr-body .fr-arrow-buttons{display:flex;flex-direction:row;gap:5px;margin-left:10px;margin-top:3px}.fr-find-replace-layer .fr-body .fr-arrow-buttons button{border:none;background:none;cursor:pointer;padding:2px 4px;margin-bottom:12px;font-size:12px}.fr-find-replace-layer .fr-body .fr-arrow-buttons .fr-disabled{pointer-events:none;cursor:not-allowed;color:#a9a9a9}.fr-find-replace-layer .fr-body .fr-advanced-options{margin-top:10px;font-size:14px;cursor:pointer;color:#007bff;text-decoration:underline}.fr-find-replace-layer .fr-body .fr-button-group{display:flex;gap:10px;justify-content:flex-end;margin-top:10px}.fr-find-replace-layer .fr-body .fr-button-group button.fr-find-btn{background-color:#FFF;color:#0098f7;margin-top:10px;border:1px solid #0098f7}.fr-find-replace-layer .fr-body .fr-button-group button.fr-replace-btn{background-color:#FFF;color:#0098f7;font-size:14px;margin-top:10px}.fr-find-replace-layer .fr-body .fr-button-group button.fr-replace-btn.fr-disabled{pointer-events:none;cursor:not-allowed;color:#a9a9a9}.fr-find-replace-layer .fr-body .fr-button-group button.fr-replace-all-btn{background-color:#FFF;color:#0098f7;font-size:14px;margin-top:10px}.fr-find-replace-layer .fr-body .fr-button-group button.fr-replace-all-btn.fr-disabled{pointer-events:none;cursor:not-allowed;color:#a9a9a9}.fr-find-replace-layer .fr-body button{padding:8px 12px;font-size:14px;border:none;border-radius:4px;cursor:pointer}.fr-find-replace-layer .fr-body .fr-input-container{position:relative;display:flex;align-items:center}.fr-find-replace-layer .fr-body #fr-replaceText{width:77%}.fr-find-replace-layer .fr-body #fr-findText{position:relative;padding-right:40px;font-size:14px;border:1px solid #ccc;border-radius:4px}.fr-find-replace-layer .fr-body #fr-findText:focus{border:2px solid #0098f7}.fr-find-replace-layer .fr-body .fr-find-error{color:#f70000;font-size:12px;padding-bottom:5px;display:none}.fr-find-replace-layer .fr-body #fr-findText.error{border-color:#f70000}.fr-find-replace-layer .fr-body .fr-count-indicator{position:absolute;right:80px;top:49%;transform:translateY(-50%);color:gray;font-size:12px;pointer-events:none;visibility:hidden;z-index:10}.fr-find-replace-layer .fr-body .fr-toggle-advanced-options .arrow{font-size:15px;transition:transform 0.3s ease;margin-right:10px;font-size:14px;margin-right:4px;margin-top:2px;font-weight:100}.fr-find-replace-layer .fr-body .fr-advanced-options-panel{border-radius:4px}.fr-find-replace-layer .fr-body .fr-advanced-options-panel .fr-checkbox-group{display:flex;margin-top:10px}.fr-find-replace-layer .fr-body .fr-advanced-options-panel .fr-checkbox-group .fr-checkbox-item{position:relative;display:inline-block;height:20px}.fr-find-replace-layer .fr-body .fr-advanced-options-panel .fr-checkbox-group .fr-checkbox-item input[type="checkbox"]{margin-left:0;margin-right:0;margin-top:0;position:inherit;left:-5px}.fr-find-replace-layer .fr-body .fr-advanced-options-panel .fr-checkbox-group .fr-checkbox-label{font-size:14px;display:flex;flex-direction:column;gap:10px;left:-10px;position:relative}.fr-find-replace-layer .fr-body .fr-toggle-btn{width:40px;height:20px;background-color:#ccc;border-radius:10px;position:relative;cursor:pointer;margin-right:10px;display:inline-block;vertical-align:middle}.fr-find-replace-layer .fr-body .fr-arrow{margin-right:5px;font-size:12px;margin-top:1px;position:absolute;right:15px}.fr-find-replace-layer .fr-body .fr-btn-active-popup{background:#d6d6d6}.fr-find-replace-highlight{background-color:#ff0}.fr-find-replace-current-highlight{background-color:orange} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/fullscreen.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | body.fr-fullscreen { 24 | overflow: hidden; 25 | height: 100%; 26 | width: 100%; 27 | position: fixed; } 28 | 29 | .fr-box.fr-fullscreen { 30 | margin: 0 !important; 31 | position: fixed; 32 | top: 0; 33 | left: 0; 34 | bottom: 0; 35 | right: 0; 36 | z-index: 2147483630 !important; 37 | width: auto !important; } 38 | .fr-box.fr-fullscreen .fr-wrapper { 39 | background-color: #FFF; } 40 | .fr-box.fr-fullscreen.fr-basic.fr-top .fr-wrapper { 41 | border-radius: 0; 42 | -moz-border-radius: 0; 43 | -webkit-border-radius: 0; 44 | -moz-background-clip: padding; 45 | -webkit-background-clip: padding-box; 46 | background-clip: padding-box; } 47 | .fr-box.fr-fullscreen.fr-basic.fr-bottom .fr-wrapper { 48 | border-radius: 0; 49 | -moz-border-radius: 0; 50 | -webkit-border-radius: 0; 51 | -moz-background-clip: padding; 52 | -webkit-background-clip: padding-box; 53 | background-clip: padding-box; } 54 | .fr-box.fr-fullscreen .fr-toolbar { 55 | border-radius: 0; 56 | -moz-border-radius: 0; 57 | -webkit-border-radius: 0; 58 | -moz-background-clip: padding; 59 | -webkit-background-clip: padding-box; 60 | background-clip: padding-box; } 61 | .fr-box.fr-fullscreen .fr-toolbar.fr-top { 62 | top: 0 !important; } 63 | .fr-box.fr-fullscreen .fr-toolbar.fr-bottom { 64 | bottom: 0 !important; } 65 | .fr-box.fr-fullscreen .fr-second-toolbar { 66 | margin-top: 0; 67 | border-radius: 0; 68 | -moz-border-radius: 0; 69 | -webkit-border-radius: 0; 70 | -moz-background-clip: padding; 71 | -webkit-background-clip: padding-box; 72 | background-clip: padding-box; } 73 | 74 | .fr-fullscreen-wrapper { 75 | z-index: 2147483640 !important; 76 | width: 100% !important; 77 | margin: 0 !important; 78 | padding: 0 !important; 79 | overflow: visible !important; } 80 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/fullscreen.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}body.fr-fullscreen{overflow:hidden;height:100%;width:100%;position:fixed}.fr-box.fr-fullscreen{margin:0 !important;position:fixed;top:0;left:0;bottom:0;right:0;z-index:2147483630 !important;width:auto !important}.fr-box.fr-fullscreen .fr-wrapper{background-color:#FFF}.fr-box.fr-fullscreen.fr-basic.fr-top .fr-wrapper{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.fr-box.fr-fullscreen.fr-basic.fr-bottom .fr-wrapper{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.fr-box.fr-fullscreen .fr-toolbar{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.fr-box.fr-fullscreen .fr-toolbar.fr-top{top:0 !important}.fr-box.fr-fullscreen .fr-toolbar.fr-bottom{bottom:0 !important}.fr-box.fr-fullscreen .fr-second-toolbar{margin-top:0;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.fr-fullscreen-wrapper{z-index:2147483640 !important;width:100% !important;margin:0 !important;padding:0 !important;overflow:visible !important} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/help.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal { 24 | text-align: left; 25 | padding: 20px 20px 10px; } 26 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table { 27 | border-collapse: collapse; 28 | font-size: 14px; 29 | line-height: 1.5; 30 | width: 100%; } 31 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table + table { 32 | margin-top: 20px; } 33 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tr { 34 | border: 0; } 35 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table th { 36 | text-align: left; } 37 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table th, .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table td { 38 | padding: 6px 0 4px; } 39 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tbody tr { 40 | border-bottom: solid 1px #ebebeb; } 41 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tbody td:first-child { 42 | width: 60%; 43 | color: #646464; } 44 | .fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tbody td:nth-child(n+2) { 45 | letter-spacing: 0.5px; } 46 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/help.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal{text-align:left;padding:20px 20px 10px}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table{border-collapse:collapse;font-size:14px;line-height:1.5;width:100%}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table+table{margin-top:20px}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tr{border:0}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table th{text-align:left}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table th,.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table td{padding:6px 0 4px}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tbody tr{border-bottom:solid 1px #ebebeb}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tbody td:first-child{width:60%;color:#646464}.fr-modal .fr-modal-wrapper .fr-modal-body .fr-help-modal table tbody td:nth-child(n+2){letter-spacing:0.5px} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/image.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-element img { 24 | cursor: pointer; 25 | padding: 0 1px; } 26 | 27 | .fr-image-resizer { 28 | position: absolute; 29 | border: solid 1px #0098f7; 30 | display: none; 31 | user-select: none; 32 | -o-user-select: none; 33 | -moz-user-select: none; 34 | -khtml-user-select: none; 35 | -webkit-user-select: none; 36 | -ms-user-select: none; 37 | -webkit-box-sizing: content-box; 38 | -moz-box-sizing: content-box; 39 | box-sizing: content-box; } 40 | .fr-image-resizer.fr-active { 41 | display: block; } 42 | .fr-image-resizer .fr-handler { 43 | display: block; 44 | position: absolute; 45 | background: #0098f7; 46 | border: solid 1px #FFF; 47 | border-radius: 2px; 48 | -moz-border-radius: 2px; 49 | -webkit-border-radius: 2px; 50 | -moz-background-clip: padding; 51 | -webkit-background-clip: padding-box; 52 | background-clip: padding-box; 53 | z-index: 4; 54 | -webkit-box-sizing: border-box; 55 | -moz-box-sizing: border-box; 56 | box-sizing: border-box; } 57 | .fr-image-resizer .fr-handler.fr-hnw { 58 | cursor: nw-resize; } 59 | .fr-image-resizer .fr-handler.fr-hne { 60 | cursor: ne-resize; } 61 | .fr-image-resizer .fr-handler.fr-hsw { 62 | cursor: sw-resize; } 63 | .fr-image-resizer .fr-handler.fr-hse { 64 | cursor: se-resize; } 65 | .fr-image-resizer .fr-handler { 66 | width: 12px; 67 | height: 12px; } 68 | .fr-image-resizer .fr-handler.fr-hnw { 69 | left: -6px; 70 | top: -6px; } 71 | .fr-image-resizer .fr-handler.fr-hne { 72 | right: -6px; 73 | top: -6px; } 74 | .fr-image-resizer .fr-handler.fr-hsw { 75 | left: -6px; 76 | bottom: -6px; } 77 | .fr-image-resizer .fr-handler.fr-hse { 78 | right: -6px; 79 | bottom: -6px; } 80 | @media (min-width: 1200px) { 81 | .fr-image-resizer .fr-handler { 82 | width: 10px; 83 | height: 10px; } 84 | .fr-image-resizer .fr-handler.fr-hnw { 85 | left: -5px; 86 | top: -5px; } 87 | .fr-image-resizer .fr-handler.fr-hne { 88 | right: -5px; 89 | top: -5px; } 90 | .fr-image-resizer .fr-handler.fr-hsw { 91 | left: -5px; 92 | bottom: -5px; } 93 | .fr-image-resizer .fr-handler.fr-hse { 94 | right: -5px; 95 | bottom: -5px; } } 96 | 97 | .fr-image-overlay { 98 | position: fixed; 99 | top: 0; 100 | left: 0; 101 | bottom: 0; 102 | right: 0; 103 | z-index: 2147483640; 104 | display: none; } 105 | 106 | .fr-popup .fr-image-upload-layer { 107 | border: dashed 2px #bdbdbd; 108 | padding: 25px 0; 109 | margin: 20px; 110 | position: relative; 111 | font-size: 14px; 112 | letter-spacing: 1px; 113 | line-height: 140%; 114 | text-align: center; } 115 | .fr-popup .fr-image-upload-layer:hover { 116 | background: #ebebeb; } 117 | .fr-popup .fr-image-upload-layer.fr-drop { 118 | background: #ebebeb; 119 | border-color: #0098f7; } 120 | .fr-popup .fr-image-upload-layer .fr-form { 121 | -webkit-opacity: 0; 122 | -moz-opacity: 0; 123 | opacity: 0; 124 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 125 | position: absolute; 126 | top: 0; 127 | bottom: 0; 128 | left: 0; 129 | right: 0; 130 | z-index: 2147483640; 131 | overflow: hidden; 132 | margin: 0 !important; 133 | padding: 0 !important; 134 | width: 100% !important; } 135 | .fr-popup .fr-image-upload-layer .fr-form input { 136 | cursor: pointer; 137 | position: absolute; 138 | right: 0; 139 | top: 0; 140 | bottom: 0; 141 | width: 500%; 142 | height: 100%; 143 | margin: 0; 144 | font-size: 400px; } 145 | .fr-popup .fr-image-progress-bar-layer > h3 { 146 | font-size: 16px; 147 | margin: 10px 0; 148 | font-weight: normal; } 149 | .fr-popup .fr-image-progress-bar-layer > div.fr-action-buttons { 150 | display: none; } 151 | .fr-popup .fr-image-progress-bar-layer > div.fr-loader { 152 | background: #b3e0fd; 153 | height: 10px; 154 | width: 100%; 155 | margin-top: 20px; 156 | overflow: hidden; 157 | position: relative; } 158 | .fr-popup .fr-image-progress-bar-layer > div.fr-loader span { 159 | display: block; 160 | height: 100%; 161 | width: 0%; 162 | background: #0098f7; 163 | -webkit-transition: width 0.2s ease 0s; 164 | -moz-transition: width 0.2s ease 0s; 165 | -ms-transition: width 0.2s ease 0s; 166 | -o-transition: width 0.2s ease 0s; } 167 | .fr-popup .fr-image-progress-bar-layer > div.fr-loader.fr-indeterminate span { 168 | width: 30% !important; 169 | position: absolute; 170 | top: 0; 171 | -webkit-animation: loading 2s linear infinite; 172 | -moz-animation: loading 2s linear infinite; 173 | -o-animation: loading 2s linear infinite; 174 | animation: loading 2s linear infinite; } 175 | .fr-popup .fr-image-progress-bar-layer.fr-error > div.fr-loader { 176 | display: none; } 177 | .fr-popup .fr-image-progress-bar-layer.fr-error > div.fr-action-buttons { 178 | display: block; } 179 | 180 | .fr-image-size-layer .fr-image-group .fr-input-line { 181 | width: calc(50% - 5px); 182 | display: inline-block; } 183 | .fr-image-size-layer .fr-image-group .fr-input-line + .fr-input-line { 184 | margin-left: 10px; } 185 | 186 | .fr-uploading { 187 | -webkit-opacity: 0.4; 188 | -moz-opacity: 0.4; 189 | opacity: 0.4; 190 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; } 191 | 192 | @-webkit-keyframes loading { 193 | from { 194 | left: -25%; } 195 | to { 196 | left: 100%; } } 197 | @-moz-keyframes loading { 198 | from { 199 | left: -25%; } 200 | to { 201 | left: 100%; } } 202 | @-o-keyframes loading { 203 | from { 204 | left: -25%; } 205 | to { 206 | left: 100%; } } 207 | @keyframes loading { 208 | from { 209 | left: -25%; } 210 | to { 211 | left: 100%; } } 212 | img.fr-draggable { 213 | user-select: none; } 214 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/image.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-element img{cursor:pointer;padding:0 1px}.fr-image-resizer{position:absolute;border:solid 1px #0098f7;display:none;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fr-image-resizer.fr-active{display:block}.fr-image-resizer .fr-handler{display:block;position:absolute;background:#0098f7;border:solid 1px #FFF;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;z-index:4;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fr-image-resizer .fr-handler.fr-hnw{cursor:nw-resize}.fr-image-resizer .fr-handler.fr-hne{cursor:ne-resize}.fr-image-resizer .fr-handler.fr-hsw{cursor:sw-resize}.fr-image-resizer .fr-handler.fr-hse{cursor:se-resize}.fr-image-resizer .fr-handler{width:12px;height:12px}.fr-image-resizer .fr-handler.fr-hnw{left:-6px;top:-6px}.fr-image-resizer .fr-handler.fr-hne{right:-6px;top:-6px}.fr-image-resizer .fr-handler.fr-hsw{left:-6px;bottom:-6px}.fr-image-resizer .fr-handler.fr-hse{right:-6px;bottom:-6px}@media (min-width: 1200px){.fr-image-resizer .fr-handler{width:10px;height:10px}.fr-image-resizer .fr-handler.fr-hnw{left:-5px;top:-5px}.fr-image-resizer .fr-handler.fr-hne{right:-5px;top:-5px}.fr-image-resizer .fr-handler.fr-hsw{left:-5px;bottom:-5px}.fr-image-resizer .fr-handler.fr-hse{right:-5px;bottom:-5px}}.fr-image-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:2147483640;display:none}.fr-popup .fr-image-upload-layer{border:dashed 2px #bdbdbd;padding:25px 0;margin:20px;position:relative;font-size:14px;letter-spacing:1px;line-height:140%;text-align:center}.fr-popup .fr-image-upload-layer:hover{background:#ebebeb}.fr-popup .fr-image-upload-layer.fr-drop{background:#ebebeb;border-color:#0098f7}.fr-popup .fr-image-upload-layer .fr-form{-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";position:absolute;top:0;bottom:0;left:0;right:0;z-index:2147483640;overflow:hidden;margin:0 !important;padding:0 !important;width:100% !important}.fr-popup .fr-image-upload-layer .fr-form input{cursor:pointer;position:absolute;right:0;top:0;bottom:0;width:500%;height:100%;margin:0;font-size:400px}.fr-popup .fr-image-progress-bar-layer>h3{font-size:16px;margin:10px 0;font-weight:normal}.fr-popup .fr-image-progress-bar-layer>div.fr-action-buttons{display:none}.fr-popup .fr-image-progress-bar-layer>div.fr-loader{background:#b3e0fd;height:10px;width:100%;margin-top:20px;overflow:hidden;position:relative}.fr-popup .fr-image-progress-bar-layer>div.fr-loader span{display:block;height:100%;width:0%;background:#0098f7;-webkit-transition:width 0.2s ease 0s;-moz-transition:width 0.2s ease 0s;-ms-transition:width 0.2s ease 0s;-o-transition:width 0.2s ease 0s}.fr-popup .fr-image-progress-bar-layer>div.fr-loader.fr-indeterminate span{width:30% !important;position:absolute;top:0;-webkit-animation:loading 2s linear infinite;-moz-animation:loading 2s linear infinite;-o-animation:loading 2s linear infinite;animation:loading 2s linear infinite}.fr-popup .fr-image-progress-bar-layer.fr-error>div.fr-loader{display:none}.fr-popup .fr-image-progress-bar-layer.fr-error>div.fr-action-buttons{display:block}.fr-image-size-layer .fr-image-group .fr-input-line{width:calc(50% - 5px);display:inline-block}.fr-image-size-layer .fr-image-group .fr-input-line+.fr-input-line{margin-left:10px}.fr-uploading{-webkit-opacity:.4;-moz-opacity:.4;opacity:.4;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}@-webkit-keyframes loading{from{left:-25%}to{left:100%}}@-moz-keyframes loading{from{left:-25%}to{left:100%}}@-o-keyframes loading{from{left:-25%}to{left:100%}}@keyframes loading{from{left:-25%}to{left:100%}}img.fr-draggable{user-select:none} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/image_manager.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-modal .fr-modal-head .fr-modal-head-line::after{clear:both;display:block;content:"";height:0}.fr-modal .fr-modal-head .fr-modal-head-line .fr-modal-more{margin-top:10px}.fr-modal .fr-modal-head .fr-modal-head-line .fr-modal-more.fr-not-available{opacity:0;width:0;padding:12px 0}.fr-modal .fr-modal-head .fr-modal-tags{padding:0 20px;display:none;text-align:left}.fr-modal .fr-modal-head .fr-modal-tags a{display:inline-block;opacity:0;padding:6px 12px;margin:8px 0 8px 8px;text-decoration:none;border-radius:32px;-moz-border-radius:32px;-webkit-border-radius:32px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-transition:opacity 0.2s ease 0s,background 0.2s ease 0s;-moz-transition:opacity 0.2s ease 0s,background 0.2s ease 0s;-ms-transition:opacity 0.2s ease 0s,background 0.2s ease 0s;-o-transition:opacity 0.2s ease 0s,background 0.2s ease 0s;cursor:pointer;background-color:#f5f5f5}.fr-modal .fr-modal-head .fr-modal-tags a:focus{outline:none;background-color:#ebebeb}.fr-modal .fr-modal-head .fr-modal-tags a:hover{background-color:#ebebeb}.fr-modal .fr-modal-head .fr-modal-tags a:active{background-color:#d6d6d6}.fr-modal .fr-modal-head .fr-modal-tags a.fr-selected-tag{background-color:#EcF5Ff;color:#0098f7}.fr-modal .fr-modal-head .fr-modal-tags a.fr-selected-tag:focus{outline:none;background-color:#ebebeb}.fr-modal .fr-modal-head .fr-modal-tags a.fr-selected-tag:hover{background-color:#ebebeb}.fr-modal .fr-modal-head .fr-modal-tags a.fr-selected-tag:active{background-color:#d6d6d6}.fr-show-tags .fr-modal-more svg path{fill:#0098f7}div.fr-modal-body{-webkit-transition:background 0.2s ease 0s;-moz-transition:background 0.2s ease 0s;-ms-transition:background 0.2s ease 0s;-o-transition:background 0.2s ease 0s}div.fr-modal-body .fr-preloader{display:block;margin:50px auto}div.fr-modal-body div.fr-image-list{text-align:center;margin:0 20px;padding:0}div.fr-modal-body div.fr-image-list .fr-list-column{float:left;width:calc((100% - 20px) / 2)}@media (min-width: 768px) and (max-width: 1199px){div.fr-modal-body div.fr-image-list .fr-list-column{width:calc((100% - 40px) / 3)}}@media (min-width: 1200px){div.fr-modal-body div.fr-image-list .fr-list-column{width:calc((100% - 60px) / 4)}}div.fr-modal-body div.fr-image-list .fr-list-column+.fr-list-column{margin-left:20px}div.fr-modal-body div.fr-image-list div.fr-image-container{position:relative;width:100%;display:block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;overflow:hidden}div.fr-modal-body div.fr-image-list div.fr-image-container:first-child{margin-top:20px}div.fr-modal-body div.fr-image-list div.fr-image-container+div{margin-top:20px}div.fr-modal-body div.fr-image-list div.fr-image-container.fr-image-deleting::after{position:absolute;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-webkit-transition:opacity 0.2s ease 0s;-moz-transition:opacity 0.2s ease 0s;-ms-transition:opacity 0.2s ease 0s;-o-transition:opacity 0.2s ease 0s;background:#000;content:"";top:0;left:0;bottom:0;right:0;z-index:2}div.fr-modal-body div.fr-image-list div.fr-image-container.fr-image-deleting::before{content:attr(data-deleting);color:#FFF;top:0;left:0;bottom:0;right:0;margin:auto;position:absolute;z-index:3;font-size:15px;height:20px}div.fr-modal-body div.fr-image-list div.fr-image-container.fr-empty{height:95px;background:#ccc;z-index:1}div.fr-modal-body div.fr-image-list div.fr-image-container.fr-empty::after{position:absolute;margin:auto;top:0;bottom:0;left:0;right:0;content:attr(data-loading);display:inline-block;height:20px}div.fr-modal-body div.fr-image-list div.fr-image-container img{width:100%;vertical-align:middle;position:relative;z-index:2;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-webkit-transition:opacity 0.2s ease 0s,filter 0.2s ease 0s;-moz-transition:opacity 0.2s ease 0s,filter 0.2s ease 0s;-ms-transition:opacity 0.2s ease 0s,filter 0.2s ease 0s;-o-transition:opacity 0.2s ease 0s,filter 0.2s ease 0s;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0)}div.fr-modal-body div.fr-image-list div.fr-image-container.fr-mobile-selected img{-webkit-opacity:.75;-moz-opacity:.75;opacity:.75;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}div.fr-modal-body div.fr-image-list div.fr-image-container.fr-mobile-selected .fr-delete-img,div.fr-modal-body div.fr-image-list div.fr-image-container.fr-mobile-selected .fr-insert-img{display:inline-block}div.fr-modal-body div.fr-image-list div.fr-image-container .fr-delete-img,div.fr-modal-body div.fr-image-list div.fr-image-container .fr-insert-img{display:none;top:50%;border-radius:100%;-moz-border-radius:100%;-webkit-border-radius:100%;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-transition:background 0.2s ease 0s,color 0.2s ease 0s;-moz-transition:background 0.2s ease 0s,color 0.2s ease 0s;-ms-transition:background 0.2s ease 0s,color 0.2s ease 0s;-o-transition:background 0.2s ease 0s,color 0.2s ease 0s;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;cursor:pointer;margin:0;line-height:40px;text-decoration:none;z-index:3}div.fr-modal-body div.fr-image-list div.fr-image-container .fr-delete-img{background:#B8312F;fill:#FFF;padding:8px;left:50%;-webkit-transform:translateY(-50%) translateX(25%);-moz-transform:translateY(-50%) translateX(25%);-ms-transform:translateY(-50%) translateX(25%);-o-transform:translateY(-50%) translateX(25%)}div.fr-modal-body div.fr-image-list div.fr-image-container .fr-insert-img{background:#FFF;fill:#0098f7;padding:8px;left:50%;-webkit-transform:translateY(-50%) translateX(-125%);-moz-transform:translateY(-50%) translateX(-125%);-ms-transform:translateY(-50%) translateX(-125%);-o-transform:translateY(-50%) translateX(-125%)}.fr-desktop .fr-modal-wrapper div.fr-modal-body div.fr-image-list div.fr-image-container:hover img{-webkit-opacity:.75;-moz-opacity:.75;opacity:.75;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.fr-desktop .fr-modal-wrapper div.fr-modal-body div.fr-image-list div.fr-image-container:hover .fr-delete-img,.fr-desktop .fr-modal-wrapper div.fr-modal-body div.fr-image-list div.fr-image-container:hover .fr-insert-img{display:inline-block;width:40px;height:40px}.fr-desktop .fr-modal-wrapper div.fr-modal-body div.fr-image-list div.fr-image-container .fr-delete-img:hover{background:#bf4644;color:#FFF}.fr-desktop .fr-modal-wrapper div.fr-modal-body div.fr-image-list div.fr-image-container .fr-insert-img:hover{background:#ebebeb} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/line_breaker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-line-breaker { 24 | cursor: text; 25 | border-top: 1px solid #0098f7; 26 | position: fixed; 27 | z-index: 2; 28 | display: none; } 29 | .fr-line-breaker.fr-visible { 30 | display: block; } 31 | .fr-line-breaker a.fr-floating-btn { 32 | position: absolute; 33 | left: calc(50% - (40px / 2)); 34 | top: -20px; } 35 | .fr-line-breaker a.fr-floating-btn svg { 36 | margin: 8px; 37 | height: 24px; 38 | width: 24px; } 39 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/line_breaker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-line-breaker{cursor:text;border-top:1px solid #0098f7;position:fixed;z-index:2;display:none}.fr-line-breaker.fr-visible{display:block}.fr-line-breaker a.fr-floating-btn{position:absolute;left:calc(50% - (40px / 2));top:-20px}.fr-line-breaker a.fr-floating-btn svg{margin:8px;height:24px;width:24px} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/markdown.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-wrapper-markdown { 24 | display: flex; } 25 | 26 | .fr-markdown-view { 27 | width: calc(52% - 1px); 28 | box-sizing: inherit; } 29 | 30 | .fr-markdown-editor { 31 | width: calc(48% - 1px); 32 | box-sizing: inherit; 33 | background-color: #eee; } 34 | 35 | .fr-markdown-editor > p { 36 | margin: 0; } 37 | 38 | .fr-markdown-view > p { 39 | margin-top: 0; } 40 | 41 | .gutter-horizontal { 42 | display: flex; 43 | z-index: 9; 44 | background-color: #dadada; 45 | cursor: col-resize; 46 | width: 2px; } 47 | 48 | .e-resize-handler { 49 | z-index: 9; 50 | width: 1px; 51 | display: flex; 52 | justify-content: center; 53 | align-items: center; 54 | align-self: center; 55 | position: relative; 56 | font-size: 10px; 57 | color: #c5c5c5; } 58 | 59 | .fr-markdown-view > dl { 60 | margin-top: 0; 61 | margin-bottom: 1rem; } 62 | 63 | .fr-markdown-view > dt { 64 | font-weight: 700; } 65 | 66 | .fr-markdown-view > dd { 67 | margin-bottom: .5rem; 68 | margin-left: 0; } 69 | 70 | .fr-markdown-view > pre { 71 | white-space: pre-wrap; 72 | white-space: -moz-pre-wrap; 73 | white-space: -pre-wrap; 74 | white-space: -o-pre-wrap; 75 | word-wrap: break-word; 76 | background-color: #f8f8f8; 77 | border: 1px solid #dfdfdf; 78 | margin-top: 1.5em; 79 | margin-bottom: 1.5em; 80 | padding: 0.125rem 0.3125rem 0.0625rem; } 81 | 82 | .fr-markdown-view > code { 83 | background-color: #f8f8f8; 84 | border-color: #dfdfdf; 85 | border-style: solid; 86 | border-width: 1px; 87 | color: #333; 88 | font-family: Consolas,"Liberation Mono",Courier,monospace; 89 | font-weight: normal; 90 | padding: 0.125rem 0.3125rem 0.0625rem; } 91 | 92 | .fr-markdown-view > pre code { 93 | background-color: transparent; 94 | border: 0; 95 | padding: 0; } 96 | 97 | .fr-markdown-view > sup { 98 | top: -.5em; } 99 | 100 | .footnote-a { 101 | color: #007bff; 102 | text-decoration: none; 103 | background-color: transparent; } 104 | 105 | .fr-markdown-view > hr { 106 | margin-top: 1rem; 107 | margin-bottom: 1rem; 108 | border: 0; 109 | border-top: 1px solid rgba(0, 0, 0, 0.1); } 110 | 111 | .blockquote { 112 | margin: 0 0 1rem; 113 | border-left: 5px solid #eee; 114 | padding: 10px 20px; 115 | font-size: 1.25rem; } 116 | 117 | .fr-markdown-view > table { 118 | width: 100%; 119 | max-width: 100%; 120 | margin-bottom: 20px; 121 | background-color: transparent; 122 | border-spacing: 0; 123 | border-collapse: collapse; } 124 | 125 | .fr-markdown-view > table > tbody > tr > td, 126 | .fr-markdown-view > table > tbody > tr > th, 127 | .fr-markdown-view > table > thead > tr > td, 128 | .fr-markdown-view > table > thead > tr > th { 129 | padding: 8px; 130 | line-height: 1.42857143; 131 | vertical-align: top; 132 | border: 1px solid #ddd; } 133 | 134 | .fr-markdown-view > table > thead > tr > td, 135 | .fr-markdown-view > table > thead > tr > th { 136 | border-bottom-width: 2px; } 137 | 138 | .fr-markdown-view > table > tbody > tr:nth-of-type(odd) { 139 | background-color: #f9f9f9; } 140 | 141 | .fr-markdown-view > a { 142 | color: #337ab7; 143 | text-decoration: none; } 144 | 145 | .fr-markdown-view > h1 { 146 | font-size: 2em !important; } 147 | 148 | .fr-markdown-view > h2 { 149 | font-size: 1.5em !important; } 150 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/markdown.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-wrapper-markdown{display:flex}.fr-markdown-view{width:calc(52% - 1px);box-sizing:inherit}.fr-markdown-editor{width:calc(48% - 1px);box-sizing:inherit;background-color:#eee}.fr-markdown-editor>p{margin:0}.fr-markdown-view>p{margin-top:0}.gutter-horizontal{display:flex;z-index:9;background-color:#dadada;cursor:col-resize;width:2px}.e-resize-handler{z-index:9;width:1px;display:flex;justify-content:center;align-items:center;align-self:center;position:relative;font-size:10px;color:#c5c5c5}.fr-markdown-view>dl{margin-top:0;margin-bottom:1rem}.fr-markdown-view>dt{font-weight:700}.fr-markdown-view>dd{margin-bottom:.5rem;margin-left:0}.fr-markdown-view>pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;background-color:#f8f8f8;border:1px solid #dfdfdf;margin-top:1.5em;margin-bottom:1.5em;padding:0.125rem 0.3125rem 0.0625rem}.fr-markdown-view>code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;padding:0.125rem 0.3125rem 0.0625rem}.fr-markdown-view>pre code{background-color:transparent;border:0;padding:0}.fr-markdown-view>sup{top:-.5em}.footnote-a{color:#007bff;text-decoration:none;background-color:transparent}.fr-markdown-view>hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}.blockquote{margin:0 0 1rem;border-left:5px solid #eee;padding:10px 20px;font-size:1.25rem}.fr-markdown-view>table{width:100%;max-width:100%;margin-bottom:20px;background-color:transparent;border-spacing:0;border-collapse:collapse}.fr-markdown-view>table>tbody>tr>td,.fr-markdown-view>table>tbody>tr>th,.fr-markdown-view>table>thead>tr>td,.fr-markdown-view>table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border:1px solid #ddd}.fr-markdown-view>table>thead>tr>td,.fr-markdown-view>table>thead>tr>th{border-bottom-width:2px}.fr-markdown-view>table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.fr-markdown-view>a{color:#337ab7;text-decoration:none}.fr-markdown-view>h1{font-size:2em !important}.fr-markdown-view>h2{font-size:1.5em !important} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/quick_insert.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-quick-insert { 24 | position: absolute; 25 | z-index: 2147483639; 26 | white-space: nowrap; 27 | padding-right: 10px; 28 | -webkit-box-sizing: content-box; 29 | -moz-box-sizing: content-box; 30 | box-sizing: content-box; } 31 | .fr-quick-insert a.fr-floating-btn svg { 32 | margin: 8px; 33 | width: 24px; 34 | height: 24px; } 35 | .fr-quick-insert.fr-on a.fr-floating-btn svg { 36 | -webkit-transform: rotate(135deg); 37 | -moz-transform: rotate(135deg); 38 | -ms-transform: rotate(135deg); 39 | -o-transform: rotate(135deg); } 40 | .fr-quick-insert.fr-hidden { 41 | display: none; } 42 | 43 | .fr-qi-helper { 44 | position: absolute; 45 | z-index: 3; 46 | padding-left: 20px; 47 | white-space: nowrap; } 48 | .fr-qi-helper a.fr-btn.fr-floating-btn { 49 | text-align: center; 50 | padding: 6px 10px 10px 10px; 51 | display: inline-block; 52 | color: #222222; 53 | background: #FFF; 54 | -webkit-opacity: 0; 55 | -moz-opacity: 0; 56 | opacity: 0; 57 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 58 | -webkit-transform: scale(0); 59 | -moz-transform: scale(0); 60 | -ms-transform: scale(0); 61 | -o-transform: scale(0); } 62 | .fr-qi-helper a.fr-btn.fr-floating-btn svg { 63 | fill: #222222; } 64 | .fr-qi-helper a.fr-btn.fr-floating-btn.fr-size-1 { 65 | -webkit-opacity: 1; 66 | -moz-opacity: 1; 67 | opacity: 1; 68 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 69 | -webkit-transform: scale(1); 70 | -moz-transform: scale(1); 71 | -ms-transform: scale(1); 72 | -o-transform: scale(1); } 73 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/quick_insert.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-quick-insert{position:absolute;z-index:2147483639;white-space:nowrap;padding-right:10px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fr-quick-insert a.fr-floating-btn svg{margin:8px;width:24px;height:24px}.fr-quick-insert.fr-on a.fr-floating-btn svg{-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg)}.fr-quick-insert.fr-hidden{display:none}.fr-qi-helper{position:absolute;z-index:3;padding-left:20px;white-space:nowrap}.fr-qi-helper a.fr-btn.fr-floating-btn{text-align:center;padding:6px 10px 10px 10px;display:inline-block;color:#222;background:#FFF;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-webkit-transform:scale(0);-moz-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0)}.fr-qi-helper a.fr-btn.fr-floating-btn svg{fill:#222}.fr-qi-helper a.fr-btn.fr-floating-btn.fr-size-1{-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1)} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/special_characters.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-popup .fr-buttons.fr-tabs .fr-special-character-category { 24 | padding: 10px 15px; } 25 | .fr-popup .fr-buttons.fr-tabs .fr-special-character-category span { 26 | font-weight: normal; 27 | font-size: 16px; } 28 | .fr-popup .fr-special-character { 29 | width: 24px; 30 | height: 24px; } 31 | @media screen and (-ms-high-contrast: active) and (min-width: 768px), (-ms-high-contrast: none) and (min-width: 768px) { 32 | .fr-popup .fr-icon-container.fr-sc-container { 33 | width: 368px; } } 34 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/special_characters.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-popup .fr-buttons.fr-tabs .fr-special-character-category{padding:10px 15px}.fr-popup .fr-buttons.fr-tabs .fr-special-character-category span{font-weight:normal;font-size:16px}.fr-popup .fr-special-character{width:24px;height:24px}@media screen and (-ms-high-contrast: active) and (min-width: 768px), (-ms-high-contrast: none) and (min-width: 768px){.fr-popup .fr-icon-container.fr-sc-container{width:368px}} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/table.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-element table td.fr-selected-cell, .fr-element table th.fr-selected-cell { 24 | border: 1px double #0098f7; 25 | position: relative; } 26 | .fr-element table td.fr-selected-cell:after, .fr-element table th.fr-selected-cell:after { 27 | content: ""; 28 | position: absolute; 29 | top: 0; 30 | left: 0; 31 | width: 100%; 32 | height: 100%; 33 | background-color: rgba(0, 100, 255, 0.15); 34 | pointer-events: none; } 35 | .fr-element table td, .fr-element table th { 36 | user-select: text; 37 | -o-user-select: text; 38 | -moz-user-select: text; 39 | -khtml-user-select: text; 40 | -webkit-user-select: text; 41 | -ms-user-select: text; } 42 | .fr-element .fr-no-selection table td, .fr-element .fr-no-selection table th { 43 | user-select: none; 44 | -o-user-select: none; 45 | -moz-user-select: none; 46 | -khtml-user-select: none; 47 | -webkit-user-select: none; 48 | -ms-user-select: none; } 49 | 50 | .fr-table-resizer { 51 | cursor: col-resize; 52 | position: absolute; 53 | z-index: 3; 54 | display: none; } 55 | .fr-table-resizer.fr-moving { 56 | z-index: 2; } 57 | .fr-table-resizer div { 58 | -webkit-opacity: 0; 59 | -moz-opacity: 0; 60 | opacity: 0; 61 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 62 | border-right: 1px solid #0098f7; } 63 | 64 | .fr-no-selection { 65 | user-select: none; 66 | -o-user-select: none; 67 | -moz-user-select: none; 68 | -khtml-user-select: none; 69 | -webkit-user-select: none; 70 | -ms-user-select: none; } 71 | 72 | .fr-table-selector { 73 | display: block; 74 | position: absolute; 75 | z-index: 9999; 76 | width: 16px; 77 | height: 16px; 78 | padding: 3px; 79 | border: transparent 2px solid; 80 | border-radius: 4px 4px 0 0; } 81 | .fr-table-selector a { 82 | width: 16px; 83 | height: 16px; 84 | display: block; } 85 | .fr-table-selector a > svg { 86 | width: 16px; 87 | height: 16px; } 88 | 89 | .fr-table-selector-active { 90 | opacity: 1; 91 | visibility: visible; 92 | border: #fdcf00 2px solid; } 93 | .fr-table-selector-active a > svg { 94 | color: #fdcf00; } 95 | 96 | .fr-table-selector-active-selected { 97 | border: #0d65ff 2px solid; } 98 | .fr-table-selector-active-selected a > svg { 99 | color: #0d65ff; } 100 | 101 | .fr-table-selector-inactive { 102 | opacity: 0; 103 | visibility: hidden; } 104 | 105 | .fr-view .fr-table-selection-hover { 106 | outline: #fdcf00 2px solid; } 107 | 108 | .fr-view .fr-table-selected { 109 | outline: #0d65ff 2px solid; 110 | caret-color: transparent; } 111 | 112 | .fr-popup .fr-table-size { 113 | margin: 20px; } 114 | .fr-popup .fr-table-size .fr-table-size-info { 115 | text-align: center; 116 | font-size: 14px; } 117 | .fr-popup .fr-table-size .fr-select-table-size { 118 | line-height: 0; 119 | padding: 5px; 120 | white-space: nowrap; } 121 | .fr-popup .fr-table-size .fr-select-table-size > span { 122 | display: inline-block; 123 | padding: 0 4px 4px 0; 124 | background: transparent; } 125 | .fr-popup .fr-table-size .fr-select-table-size > span > span { 126 | display: inline-block; 127 | width: 18px; 128 | height: 18px; 129 | border: 1px solid #DDD; } 130 | .fr-popup .fr-table-size .fr-select-table-size > span.hover { 131 | background: transparent; } 132 | .fr-popup .fr-table-size .fr-select-table-size > span.hover > span { 133 | background: rgba(0, 152, 247, 0.3); 134 | border: solid 1px #0098f7; } 135 | .fr-popup .fr-table-size .fr-select-table-size .new-line::after { 136 | clear: both; 137 | display: block; 138 | content: ""; 139 | height: 0; } 140 | .fr-popup.fr-above .fr-table-size .fr-select-table-size > span { 141 | display: inline-block !important; } 142 | .fr-popup .fr-table-colors { 143 | display: block; 144 | padding: 20px; 145 | padding-bottom: 0; } 146 | 147 | .fr-popup.fr-desktop .fr-table-size .fr-select-table-size > span > span { 148 | width: 12px; 149 | height: 12px; } 150 | 151 | .fr-insert-helper { 152 | position: absolute; 153 | z-index: 9999; 154 | white-space: nowrap; } 155 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/table.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-element table td.fr-selected-cell,.fr-element table th.fr-selected-cell{border:1px double #0098f7;position:relative}.fr-element table td.fr-selected-cell:after,.fr-element table th.fr-selected-cell:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(0,100,255,0.15);pointer-events:none}.fr-element table td,.fr-element table th{user-select:text;-o-user-select:text;-moz-user-select:text;-khtml-user-select:text;-webkit-user-select:text;-ms-user-select:text}.fr-element .fr-no-selection table td,.fr-element .fr-no-selection table th{user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.fr-table-resizer{cursor:col-resize;position:absolute;z-index:3;display:none}.fr-table-resizer.fr-moving{z-index:2}.fr-table-resizer div{-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";border-right:1px solid #0098f7}.fr-no-selection{user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.fr-table-selector{display:block;position:absolute;z-index:9999;width:16px;height:16px;padding:3px;border:transparent 2px solid;border-radius:4px 4px 0 0}.fr-table-selector a{width:16px;height:16px;display:block}.fr-table-selector a>svg{width:16px;height:16px}.fr-table-selector-active{opacity:1;visibility:visible;border:#fdcf00 2px solid}.fr-table-selector-active a>svg{color:#fdcf00}.fr-table-selector-active-selected{border:#0d65ff 2px solid}.fr-table-selector-active-selected a>svg{color:#0d65ff}.fr-table-selector-inactive{opacity:0;visibility:hidden}.fr-view .fr-table-selection-hover{outline:#fdcf00 2px solid}.fr-view .fr-table-selected{outline:#0d65ff 2px solid;caret-color:transparent}.fr-popup .fr-table-size{margin:20px}.fr-popup .fr-table-size .fr-table-size-info{text-align:center;font-size:14px}.fr-popup .fr-table-size .fr-select-table-size{line-height:0;padding:5px;white-space:nowrap}.fr-popup .fr-table-size .fr-select-table-size>span{display:inline-block;padding:0 4px 4px 0;background:transparent}.fr-popup .fr-table-size .fr-select-table-size>span>span{display:inline-block;width:18px;height:18px;border:1px solid #DDD}.fr-popup .fr-table-size .fr-select-table-size>span.hover{background:transparent}.fr-popup .fr-table-size .fr-select-table-size>span.hover>span{background:rgba(0,152,247,0.3);border:solid 1px #0098f7}.fr-popup .fr-table-size .fr-select-table-size .new-line::after{clear:both;display:block;content:"";height:0}.fr-popup.fr-above .fr-table-size .fr-select-table-size>span{display:inline-block !important}.fr-popup .fr-table-colors{display:block;padding:20px;padding-bottom:0}.fr-popup.fr-desktop .fr-table-size .fr-select-table-size>span>span{width:12px;height:12px}.fr-insert-helper{position:absolute;z-index:9999;white-space:nowrap} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/trim_video.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | #fr-form-container { 24 | margin: auto; 25 | position: relative; 26 | top: 10%; 27 | background-color: #f5f5f5; 28 | width: 60%; 29 | border-radius: 5px; 30 | z-index: 9002; 31 | overflow: auto; 32 | background-color: #fefefe; } 33 | 34 | .fr-trim-video-name { 35 | font-family: Arial, Helvetica, sans-serif; 36 | padding-top: 15px; } 37 | 38 | .fr-file-loader { 39 | border: 4px solid #f3f3f3; 40 | border-radius: 50%; 41 | border-top: 4px solid #53777a; 42 | display: inline-block !important; 43 | -webkit-animation: spin 2s linear infinite; 44 | /* Safari */ 45 | animation: spin 2s linear infinite; 46 | width: 20px; 47 | height: 20px; 48 | display: block !important; 49 | align-items: center; } 50 | 51 | .fr-trim-button { 52 | margin-top: 5px; 53 | height: 36px; 54 | line-height: 1; 55 | color: #0098f7; 56 | padding: 10px; 57 | cursor: pointer; 58 | text-decoration: none; 59 | border: none; 60 | background: none; 61 | font-size: 16px; 62 | border-radius: 5px; 63 | background-color: #eff5fa; 64 | outline: none; } 65 | .fr-trim-button:hover { 66 | background: #ebebeb; } 67 | 68 | /* Safari */ 69 | @-webkit-keyframes spin { 70 | 0% { 71 | -webkit-transform: rotate(0deg); } 72 | 100% { 73 | -webkit-transform: rotate(360deg); } } 74 | @keyframes spin { 75 | 0% { 76 | transform: rotate(0deg); } 77 | 100% { 78 | transform: rotate(360deg); } } 79 | .fr-slidecontainer { 80 | width: 100%; } 81 | 82 | .fr-slider { 83 | -webkit-appearance: none; 84 | width: 100%; 85 | height: 15px; 86 | background: #d3d3d3; } 87 | 88 | .fr-video-trim-buttons { 89 | text-align: right; 90 | padding-bottom: 5px; 91 | padding-right: 15px; 92 | margin-top: 10px; } 93 | 94 | .fr-slider::-webkit-slider-thumb { 95 | -webkit-appearance: none; 96 | appearance: none; 97 | width: 15px; 98 | height: 15px; 99 | border-radius: 50%; 100 | cursor: pointer; } 101 | 102 | .fr-slider::-moz-range-thumb { 103 | width: 15px; 104 | height: 15px; 105 | background: #3498db; 106 | border-radius: 50%; 107 | cursor: pointer; } 108 | 109 | .fr-range-value-start { 110 | position: absolute; } 111 | 112 | .fr-range-value-start > span { 113 | width: 60px; 114 | height: 24px; 115 | line-height: 24px; 116 | text-align: center; 117 | background: #03a9f4; 118 | color: #fff; 119 | font-size: 12px; 120 | display: block; 121 | position: absolute; 122 | left: 50%; 123 | transform: translate(-85%, 0); 124 | border-radius: 6px; } 125 | 126 | .fr-range-value-start > span:before { 127 | content: ""; 128 | position: absolute; 129 | width: 0; 130 | height: 0; 131 | border-left: 5px solid transparent; 132 | border-right: 5px solid transparent; 133 | left: 86%; 134 | margin-left: -5px; 135 | margin-top: -1px; } 136 | 137 | .fr-range-value-end { 138 | position: absolute; } 139 | 140 | .fr-range-value-end > span { 141 | width: 60px; 142 | height: 24px; 143 | line-height: 24px; 144 | text-align: center; 145 | background: #03a9f4; 146 | color: #fff; 147 | font-size: 12px; 148 | display: block; 149 | position: absolute; 150 | left: 14%; 151 | transform: translate(-8%, 0); 152 | border-radius: 6px; } 153 | 154 | .fr-range-value-end > span:before { 155 | content: ""; 156 | position: absolute; 157 | width: 0; 158 | height: 0; 159 | border-left: 5px solid transparent; 160 | border-right: 5px solid transparent; 161 | left: 14%; 162 | margin-left: -5px; 163 | margin-top: -1px; } 164 | 165 | #startTimeValue { 166 | top: -153% !important; } 167 | 168 | #startTimeValue span:before { 169 | border-top: 10px solid #03a9f4; 170 | top: 100%; } 171 | 172 | #endTimeValue { 173 | top: -153% !important; } 174 | 175 | #endTimeValue span:before { 176 | border-top: 10px solid #03a9f4; 177 | top: 100%; } 178 | 179 | .fr-range-slider { 180 | position: relative; 181 | width: 80%; 182 | height: 15px; } 183 | 184 | .fr-range-slider > input { 185 | pointer-events: none; 186 | position: absolute; 187 | left: 0; 188 | top: 10px; 189 | width: 100%; 190 | outline: none; 191 | height: 6px; 192 | border-radius: 10px; } 193 | 194 | .fr-range-slider > input::-webkit-slider-thumb { 195 | pointer-events: all; 196 | position: relative; 197 | z-index: 1; 198 | -webkit-appearance: none; 199 | appearance: none; 200 | width: 15px; 201 | height: 15px; 202 | background: #3498db; 203 | cursor: pointer; 204 | border-radius: 7px; 205 | margin-top: -3.6px; } 206 | 207 | .fr-range-slider > input::-moz-range-thumb { 208 | pointer-events: all; 209 | position: relative; 210 | z-index: 10; 211 | -moz-appearance: none; 212 | width: 9px; 213 | height: 15px; 214 | border-radius: 7px; 215 | margin-top: -3.6px; } 216 | 217 | .fr-range-slider > input::-moz-range-track { 218 | position: relative; 219 | z-index: -1; 220 | background-color: black; 221 | border: 0; 222 | height: 15px; 223 | border-radius: 50%; 224 | margin-top: -3.6px; } 225 | 226 | .fr-range-slider > input:last-of-type::-moz-range-track { 227 | -moz-appearance: none; 228 | background: none transparent; 229 | border: 0; } 230 | 231 | .fr-range-slider > input[type="range"]::-moz-focus-outer { 232 | border: 0; } 233 | 234 | @media screen and (max-width: 430px) { 235 | .range-value span { 236 | width: 40px; 237 | font-size: 10px; } 238 | 239 | #fr-form-container { 240 | top: 20%; } } 241 | #fr-video-edit { 242 | width: 80%; 243 | text-align: center; 244 | height: 50%; 245 | margin-bottom: 20px; 246 | padding-top: 8px; 247 | padding-bottom: 8px; } 248 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/trim_video.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}#fr-form-container{margin:auto;position:relative;top:10%;background-color:#f5f5f5;width:60%;border-radius:5px;z-index:9002;overflow:auto;background-color:#fefefe}.fr-trim-video-name{font-family:Arial, Helvetica, sans-serif;padding-top:15px}.fr-file-loader{border:4px solid #f3f3f3;border-radius:50%;border-top:4px solid #53777a;display:inline-block !important;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite;width:20px;height:20px;display:block !important;align-items:center}.fr-trim-button{margin-top:5px;height:36px;line-height:1;color:#0098f7;padding:10px;cursor:pointer;text-decoration:none;border:none;background:none;font-size:16px;border-radius:5px;background-color:#eff5fa;outline:none}.fr-trim-button:hover{background:#ebebeb}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.fr-slidecontainer{width:100%}.fr-slider{-webkit-appearance:none;width:100%;height:15px;background:#d3d3d3}.fr-video-trim-buttons{text-align:right;padding-bottom:5px;padding-right:15px;margin-top:10px}.fr-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;cursor:pointer}.fr-slider::-moz-range-thumb{width:15px;height:15px;background:#3498db;border-radius:50%;cursor:pointer}.fr-range-value-start{position:absolute}.fr-range-value-start>span{width:60px;height:24px;line-height:24px;text-align:center;background:#03a9f4;color:#fff;font-size:12px;display:block;position:absolute;left:50%;transform:translate(-85%, 0);border-radius:6px}.fr-range-value-start>span:before{content:"";position:absolute;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;left:86%;margin-left:-5px;margin-top:-1px}.fr-range-value-end{position:absolute}.fr-range-value-end>span{width:60px;height:24px;line-height:24px;text-align:center;background:#03a9f4;color:#fff;font-size:12px;display:block;position:absolute;left:14%;transform:translate(-8%, 0);border-radius:6px}.fr-range-value-end>span:before{content:"";position:absolute;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;left:14%;margin-left:-5px;margin-top:-1px}#startTimeValue{top:-153% !important}#startTimeValue span:before{border-top:10px solid #03a9f4;top:100%}#endTimeValue{top:-153% !important}#endTimeValue span:before{border-top:10px solid #03a9f4;top:100%}.fr-range-slider{position:relative;width:80%;height:15px}.fr-range-slider>input{pointer-events:none;position:absolute;left:0;top:10px;width:100%;outline:none;height:6px;border-radius:10px}.fr-range-slider>input::-webkit-slider-thumb{pointer-events:all;position:relative;z-index:1;-webkit-appearance:none;appearance:none;width:15px;height:15px;background:#3498db;cursor:pointer;border-radius:7px;margin-top:-3.6px}.fr-range-slider>input::-moz-range-thumb{pointer-events:all;position:relative;z-index:10;-moz-appearance:none;width:9px;height:15px;border-radius:7px;margin-top:-3.6px}.fr-range-slider>input::-moz-range-track{position:relative;z-index:-1;background-color:black;border:0;height:15px;border-radius:50%;margin-top:-3.6px}.fr-range-slider>input:last-of-type::-moz-range-track{-moz-appearance:none;background:none transparent;border:0}.fr-range-slider>input[type="range"]::-moz-focus-outer{border:0}@media screen and (max-width: 430px){.range-value span{width:40px;font-size:10px}#fr-form-container{top:20%}}#fr-video-edit{width:80%;text-align:center;height:50%;margin-bottom:20px;padding-top:8px;padding-bottom:8px} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/video.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-element .fr-video { 24 | user-select: none; 25 | -o-user-select: none; 26 | -moz-user-select: none; 27 | -khtml-user-select: none; 28 | -webkit-user-select: none; 29 | -ms-user-select: none; } 30 | .fr-element .fr-video::after { 31 | position: absolute; 32 | content: ''; 33 | z-index: 1; 34 | top: 0; 35 | left: 0; 36 | right: 0; 37 | bottom: 0; 38 | cursor: pointer; 39 | display: block; 40 | background: rgba(0, 0, 0, 0); } 41 | .fr-element .fr-video.fr-active > * { 42 | z-index: 2; 43 | position: relative; } 44 | .fr-element .fr-video > * { 45 | -webkit-box-sizing: content-box; 46 | -moz-box-sizing: content-box; 47 | box-sizing: content-box; 48 | max-width: 100%; 49 | border: none; } 50 | 51 | .fr-box .fr-video-resizer { 52 | position: absolute; 53 | border: solid 1px #0098f7; 54 | display: none; 55 | user-select: none; 56 | -o-user-select: none; 57 | -moz-user-select: none; 58 | -khtml-user-select: none; 59 | -webkit-user-select: none; 60 | -ms-user-select: none; } 61 | .fr-box .fr-video-resizer.fr-active { 62 | display: block; } 63 | .fr-box .fr-video-resizer .fr-handler { 64 | display: block; 65 | position: absolute; 66 | background: #0098f7; 67 | border: solid 1px #FFF; 68 | z-index: 4; 69 | -webkit-box-sizing: border-box; 70 | -moz-box-sizing: border-box; 71 | box-sizing: border-box; } 72 | .fr-box .fr-video-resizer .fr-handler.fr-hnw { 73 | cursor: nw-resize; } 74 | .fr-box .fr-video-resizer .fr-handler.fr-hne { 75 | cursor: ne-resize; } 76 | .fr-box .fr-video-resizer .fr-handler.fr-hsw { 77 | cursor: sw-resize; } 78 | .fr-box .fr-video-resizer .fr-handler.fr-hse { 79 | cursor: se-resize; } 80 | .fr-box .fr-video-resizer .fr-handler { 81 | width: 12px; 82 | height: 12px; } 83 | .fr-box .fr-video-resizer .fr-handler.fr-hnw { 84 | left: -6px; 85 | top: -6px; } 86 | .fr-box .fr-video-resizer .fr-handler.fr-hne { 87 | right: -6px; 88 | top: -6px; } 89 | .fr-box .fr-video-resizer .fr-handler.fr-hsw { 90 | left: -6px; 91 | bottom: -6px; } 92 | .fr-box .fr-video-resizer .fr-handler.fr-hse { 93 | right: -6px; 94 | bottom: -6px; } 95 | @media (min-width: 1200px) { 96 | .fr-box .fr-video-resizer .fr-handler { 97 | width: 10px; 98 | height: 10px; } 99 | .fr-box .fr-video-resizer .fr-handler.fr-hnw { 100 | left: -5px; 101 | top: -5px; } 102 | .fr-box .fr-video-resizer .fr-handler.fr-hne { 103 | right: -5px; 104 | top: -5px; } 105 | .fr-box .fr-video-resizer .fr-handler.fr-hsw { 106 | left: -5px; 107 | bottom: -5px; } 108 | .fr-box .fr-video-resizer .fr-handler.fr-hse { 109 | right: -5px; 110 | bottom: -5px; } } 111 | 112 | .fr-popup .fr-video-size-layer .fr-video-group .fr-input-line { 113 | width: calc(50% - 5px); 114 | display: inline-block; } 115 | .fr-popup .fr-video-size-layer .fr-video-group .fr-input-line + .fr-input-line { 116 | margin-left: 10px; } 117 | .fr-popup .fr-video-upload-layer { 118 | border: dashed 2px #bdbdbd; 119 | padding: 25px 0; 120 | margin: 20px; 121 | position: relative; 122 | font-size: 14px; 123 | letter-spacing: 1px; 124 | line-height: 140%; 125 | text-align: center; } 126 | .fr-popup .fr-video-upload-layer:hover { 127 | background: #ebebeb; } 128 | .fr-popup .fr-video-upload-layer.fr-drop { 129 | background: #ebebeb; 130 | border-color: #0098f7; } 131 | .fr-popup .fr-video-upload-layer .fr-form { 132 | -webkit-opacity: 0; 133 | -moz-opacity: 0; 134 | opacity: 0; 135 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 136 | position: absolute; 137 | top: 0; 138 | bottom: 0; 139 | left: 0; 140 | right: 0; 141 | z-index: 2147483640; 142 | overflow: hidden; 143 | margin: 0 !important; 144 | padding: 0 !important; 145 | width: 100% !important; } 146 | .fr-popup .fr-video-upload-layer .fr-form input { 147 | cursor: pointer; 148 | position: absolute; 149 | right: 0; 150 | top: 0; 151 | bottom: 0; 152 | width: 500%; 153 | height: 100%; 154 | margin: 0; 155 | font-size: 400px; } 156 | .fr-popup .fr-video-progress-bar-layer > h3 { 157 | font-size: 16px; 158 | margin: 10px 0; 159 | font-weight: normal; } 160 | .fr-popup .fr-video-progress-bar-layer > div.fr-action-buttons { 161 | display: none; } 162 | .fr-popup .fr-video-progress-bar-layer > div.fr-loader { 163 | background: #b3e0fd; 164 | height: 10px; 165 | width: 100%; 166 | margin-top: 20px; 167 | overflow: hidden; 168 | position: relative; } 169 | .fr-popup .fr-video-progress-bar-layer > div.fr-loader span { 170 | display: block; 171 | height: 100%; 172 | width: 0%; 173 | background: #0098f7; 174 | -webkit-transition: width 0.2s ease 0s; 175 | -moz-transition: width 0.2s ease 0s; 176 | -ms-transition: width 0.2s ease 0s; 177 | -o-transition: width 0.2s ease 0s; } 178 | .fr-popup .fr-video-progress-bar-layer > div.fr-loader.fr-indeterminate span { 179 | width: 30% !important; 180 | position: absolute; 181 | top: 0; 182 | -webkit-animation: loading 2s linear infinite; 183 | -moz-animation: loading 2s linear infinite; 184 | -o-animation: loading 2s linear infinite; 185 | animation: loading 2s linear infinite; } 186 | .fr-popup .fr-video-progress-bar-layer.fr-error > div.fr-loader { 187 | display: none; } 188 | .fr-popup .fr-video-progress-bar-layer.fr-error > div.fr-action-buttons { 189 | display: block; } 190 | 191 | .fr-video-overlay { 192 | position: fixed; 193 | top: 0; 194 | left: 0; 195 | bottom: 0; 196 | right: 0; 197 | z-index: 2147483640; 198 | display: none; } 199 | 200 | .fr-autoplay-margin { 201 | margin-top: 0px !important; } 202 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/plugins/video.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-element .fr-video{user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.fr-element .fr-video::after{position:absolute;content:'';z-index:1;top:0;left:0;right:0;bottom:0;cursor:pointer;display:block;background:transparent}.fr-element .fr-video.fr-active>*{z-index:2;position:relative}.fr-element .fr-video>*{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;max-width:100%;border:none}.fr-box .fr-video-resizer{position:absolute;border:solid 1px #0098f7;display:none;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.fr-box .fr-video-resizer.fr-active{display:block}.fr-box .fr-video-resizer .fr-handler{display:block;position:absolute;background:#0098f7;border:solid 1px #FFF;z-index:4;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fr-box .fr-video-resizer .fr-handler.fr-hnw{cursor:nw-resize}.fr-box .fr-video-resizer .fr-handler.fr-hne{cursor:ne-resize}.fr-box .fr-video-resizer .fr-handler.fr-hsw{cursor:sw-resize}.fr-box .fr-video-resizer .fr-handler.fr-hse{cursor:se-resize}.fr-box .fr-video-resizer .fr-handler{width:12px;height:12px}.fr-box .fr-video-resizer .fr-handler.fr-hnw{left:-6px;top:-6px}.fr-box .fr-video-resizer .fr-handler.fr-hne{right:-6px;top:-6px}.fr-box .fr-video-resizer .fr-handler.fr-hsw{left:-6px;bottom:-6px}.fr-box .fr-video-resizer .fr-handler.fr-hse{right:-6px;bottom:-6px}@media (min-width: 1200px){.fr-box .fr-video-resizer .fr-handler{width:10px;height:10px}.fr-box .fr-video-resizer .fr-handler.fr-hnw{left:-5px;top:-5px}.fr-box .fr-video-resizer .fr-handler.fr-hne{right:-5px;top:-5px}.fr-box .fr-video-resizer .fr-handler.fr-hsw{left:-5px;bottom:-5px}.fr-box .fr-video-resizer .fr-handler.fr-hse{right:-5px;bottom:-5px}}.fr-popup .fr-video-size-layer .fr-video-group .fr-input-line{width:calc(50% - 5px);display:inline-block}.fr-popup .fr-video-size-layer .fr-video-group .fr-input-line+.fr-input-line{margin-left:10px}.fr-popup .fr-video-upload-layer{border:dashed 2px #bdbdbd;padding:25px 0;margin:20px;position:relative;font-size:14px;letter-spacing:1px;line-height:140%;text-align:center}.fr-popup .fr-video-upload-layer:hover{background:#ebebeb}.fr-popup .fr-video-upload-layer.fr-drop{background:#ebebeb;border-color:#0098f7}.fr-popup .fr-video-upload-layer .fr-form{-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";position:absolute;top:0;bottom:0;left:0;right:0;z-index:2147483640;overflow:hidden;margin:0 !important;padding:0 !important;width:100% !important}.fr-popup .fr-video-upload-layer .fr-form input{cursor:pointer;position:absolute;right:0;top:0;bottom:0;width:500%;height:100%;margin:0;font-size:400px}.fr-popup .fr-video-progress-bar-layer>h3{font-size:16px;margin:10px 0;font-weight:normal}.fr-popup .fr-video-progress-bar-layer>div.fr-action-buttons{display:none}.fr-popup .fr-video-progress-bar-layer>div.fr-loader{background:#b3e0fd;height:10px;width:100%;margin-top:20px;overflow:hidden;position:relative}.fr-popup .fr-video-progress-bar-layer>div.fr-loader span{display:block;height:100%;width:0%;background:#0098f7;-webkit-transition:width 0.2s ease 0s;-moz-transition:width 0.2s ease 0s;-ms-transition:width 0.2s ease 0s;-o-transition:width 0.2s ease 0s}.fr-popup .fr-video-progress-bar-layer>div.fr-loader.fr-indeterminate span{width:30% !important;position:absolute;top:0;-webkit-animation:loading 2s linear infinite;-moz-animation:loading 2s linear infinite;-o-animation:loading 2s linear infinite;animation:loading 2s linear infinite}.fr-popup .fr-video-progress-bar-layer.fr-error>div.fr-loader{display:none}.fr-popup .fr-video-progress-bar-layer.fr-error>div.fr-action-buttons{display:block}.fr-video-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:2147483640;display:none}.fr-autoplay-margin{margin-top:0px !important} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/embedly.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-element .fr-embedly { 24 | user-select: none; 25 | -o-user-select: none; 26 | -moz-user-select: none; 27 | -khtml-user-select: none; 28 | -webkit-user-select: none; 29 | -ms-user-select: none; 30 | position: relative; } 31 | .fr-element .fr-embedly::after { 32 | position: absolute; 33 | z-index: 1; 34 | top: 0; 35 | left: 0; 36 | right: 0; 37 | bottom: 0; 38 | cursor: pointer; 39 | display: block; 40 | background: rgba(0, 0, 0, 0); } 41 | .fr-element .fr-embedly > * { 42 | -webkit-box-sizing: content-box; 43 | -moz-box-sizing: content-box; 44 | box-sizing: content-box; 45 | max-width: 100%; 46 | border: none; } 47 | 48 | .fr-box .fr-embedly-resizer { 49 | position: absolute; 50 | z-index: 2; 51 | border: solid 1px #0098f7; 52 | display: none; 53 | user-select: none; 54 | -o-user-select: none; 55 | -moz-user-select: none; 56 | -khtml-user-select: none; 57 | -webkit-user-select: none; 58 | -ms-user-select: none; } 59 | .fr-box .fr-embedly-resizer.fr-active { 60 | display: block; } 61 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/embedly.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-element .fr-embedly{user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;position:relative}.fr-element .fr-embedly::after{position:absolute;z-index:1;top:0;left:0;right:0;bottom:0;cursor:pointer;display:block;background:transparent}.fr-element .fr-embedly>*{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;max-width:100%;border:none}.fr-box .fr-embedly-resizer{position:absolute;z-index:2;border:solid 1px #0098f7;display:none;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.fr-box .fr-embedly-resizer.fr-active{display:block} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/font_awesome.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .fr-popup .fr-icon.fr-fa-icon { 24 | width: 18px; 25 | padding: 8px; 26 | margin: 6px; 27 | font-size: 16px; } 28 | @supports not (-ms-high-contrast: none) { 29 | .fr-popup .fr-icon-container.fr-fa-container { 30 | grid-template-columns: repeat(auto-fill, minmax(45px, 45px)); } } 31 | @media screen and (-ms-high-contrast: active) and (min-width: 768px), (-ms-high-contrast: none) and (min-width: 768px) { 32 | .fr-popup .fr-icon-container.fr-fa-container { 33 | width: 506px; } } 34 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/font_awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.fr-popup .fr-icon.fr-fa-icon{width:18px;padding:8px;margin:6px;font-size:16px}@supports not (-ms-high-contrast: none){.fr-popup .fr-icon-container.fr-fa-container{grid-template-columns:repeat(auto-fill, minmax(45px, 45px))}}@media screen and (-ms-high-contrast: active) and (min-width: 768px), (-ms-high-contrast: none) and (min-width: 768px){.fr-popup .fr-icon-container.fr-fa-container{width:506px}} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/image_tui.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .tui-image-editor-container { 24 | position: fixed; 25 | top: 0; 26 | left: 0; 27 | bottom: 0; 28 | right: 0; 29 | height: 100%; 30 | width: 100%; 31 | z-index: 10; } 32 | 33 | .tui-editor-cancel-btn { 34 | background-color: #FFF; 35 | border: 1px solid #CCCCCC; 36 | color: #222; } 37 | 38 | .tui-editor-save-btn { 39 | background-color: #fdba3b; 40 | border: 1px solid #fdba3b; 41 | color: #FFF; } 42 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/image_tui.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.tui-image-editor-container{position:fixed;top:0;left:0;bottom:0;right:0;height:100%;width:100%;z-index:10}.tui-editor-cancel-btn{background-color:#FFF;border:1px solid #ccc;color:#222}.tui-editor-save-btn{background-color:#fdba3b;border:1px solid #fdba3b;color:#FFF} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/spell_checker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after { 8 | clear: both; 9 | display: block; 10 | content: ""; 11 | height: 0; } 12 | 13 | .fr-hide-by-clipping { 14 | position: absolute; 15 | width: 1px; 16 | height: 1px; 17 | padding: 0; 18 | margin: -1px; 19 | overflow: hidden; 20 | clip: rect(0, 0, 0, 0); 21 | border: 0; } 22 | 23 | .examples-variante > a { 24 | font-size: 14px; 25 | font-family: Arial, Helvetica, sans-serif; } 26 | 27 | .sc-cm-holder > .sc-cm { 28 | border-top: 5px solid #222222 !important; 29 | padding: 0 !important; 30 | line-height: 200% !important; } 31 | 32 | .sc-cm .sc-cm__item.examples-variante.sc-cm__item_active > a > i { 33 | display: none !important; } 34 | 35 | .sc-cm .sc-cm__item.examples-variante > a > i { 36 | display: none !important; } 37 | 38 | .sc-cm__item_dropdown .i-icon { 39 | display: none !important; } 40 | 41 | .sc-cm__item_dropdown .i-icon::before { 42 | display: none !important; } 43 | 44 | .sc-cm::before { 45 | display: none !important; } 46 | 47 | div.sc-cm-holder.sc-cm_show > ul > li.sc-cm__item.sc-cm__item_dropdown.sc-cm__item_arrow > div > ul { 48 | border-style: none !important; 49 | padding: 0 !important; } 50 | 51 | .sc-cm__item_dropdown:hover > a, .sc-cm a:hover { 52 | background-color: #ebebeb !important; } 53 | 54 | .sc-cm__item_active > a, .sc-cm__item_active > a:hover, .sc-cm a:active, .sc-cm a:focus { 55 | background-color: #d6d6d6 !important; } 56 | 57 | .sc-cm__item > a { 58 | line-height: 200% !important; } 59 | 60 | .sc-cm-holder > .sc-cm:before { 61 | background-color: #ebebeb !important; } 62 | 63 | .sc-cm-holder { 64 | display: none; } 65 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/css/third_party/spell_checker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | .fr-clearfix::after{clear:both;display:block;content:"";height:0}.fr-hide-by-clipping{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.examples-variante>a{font-size:14px;font-family:Arial,Helvetica,sans-serif}.sc-cm-holder>.sc-cm{border-top:5px solid #222 !important;padding:0 !important;line-height:200% !important}.sc-cm .sc-cm__item.examples-variante.sc-cm__item_active>a>i{display:none !important}.sc-cm .sc-cm__item.examples-variante>a>i{display:none !important}.sc-cm__item_dropdown .i-icon{display:none !important}.sc-cm__item_dropdown .i-icon::before{display:none !important}.sc-cm::before{display:none !important}div.sc-cm-holder.sc-cm_show>ul>li.sc-cm__item.sc-cm__item_dropdown.sc-cm__item_arrow>div>ul{border-style:none !important;padding:0 !important}.sc-cm__item_dropdown:hover>a,.sc-cm a:hover{background-color:#ebebeb !important}.sc-cm__item_active>a,.sc-cm__item_active>a:hover,.sc-cm a:active,.sc-cm a:focus{background-color:#d6d6d6 !important}.sc-cm__item>a{line-height:200% !important}.sc-cm-holder>.sc-cm:before{background-color:#ebebeb !important}.sc-cm-holder{display:none} 8 | -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/froala-django.js: -------------------------------------------------------------------------------- 1 | function getCookie(name) { 2 | var cookieValue = null; 3 | if (document.cookie && document.cookie != '') { 4 | var cookies = document.cookie.split(';'); 5 | for (var i = 0; i < cookies.length; i++) { 6 | var cookie = cookies[i].trim(); 7 | // Does this cookie string begin with the name we want? 8 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 9 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 10 | break; 11 | } 12 | } 13 | } 14 | return cookieValue; 15 | } -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/align.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(i){"use strict";(i=i&&i.hasOwnProperty("default")?i["default"]:i).PLUGINS.align=function(o){var s=o.$;return{apply:function c(e){var t=o.selection.element(),n=s(t).closest(".fr-table-selected"),i=s(t).parents("TD"),a="TD"===t.tagName||i.length&&o.el.contains(i.get(0));if(s(t).parents(".fr-img-caption").length)s(t).css("text-align",e);else if(n.length&&o.el.contains(n[0]))n.find("td").css("text-align",e);else if(a)o.node.isBlock(t)?s(t).css("text-align",e):i.css("text-align",e);else{o.selection.save(),o.html.wrap(!0,!0,!0,!0),o.selection.restore();for(var l=o.selection.blocks(),r=0;r *").first().replaceWith(o.icon.create("align-".concat(n)))}},refreshOnShow:function a(e,t){var n=o.selection.blocks();if(n.length){var i=o.helpers.getAlignment(s(n[0]));t.find('a.fr-command[data-param1="'.concat(i,'"]')).addClass("fr-active").attr("aria-selected",!0)}},refreshForToolbar:function l(e){var t=o.selection.blocks();if(t.length){var n=o.helpers.getAlignment(s(t[0]));n=n.charAt(0).toUpperCase()+n.slice(1),"align".concat(n)===e.attr("data-cmd")&&e.addClass("fr-active")}}}},i.DefineIcon("align",{NAME:"align-left",SVG_KEY:"alignLeft"}),i.DefineIcon("align-left",{NAME:"align-left",SVG_KEY:"alignLeft"}),i.DefineIcon("align-right",{NAME:"align-right",SVG_KEY:"alignRight"}),i.DefineIcon("align-center",{NAME:"align-center",SVG_KEY:"alignCenter"}),i.DefineIcon("align-justify",{NAME:"align-justify",SVG_KEY:"alignJustify"}),i.RegisterCommand("align",{type:"dropdown",title:"Align",options:{left:"Align Left",center:"Align Center",right:"Align Right",justify:"Align Justify"},html:function(){var e='"},callback:function(e,t){this.align.apply(t)},refresh:function(e){this.align.refresh(e)},refreshOnShow:function(e,t){this.align.refreshOnShow(e,t)},plugin:"align"}),i.RegisterCommand("alignLeft",{type:"button",icon:"align-left",title:"Align Left",callback:function(){this.align.apply("left")},refresh:function(e){this.align.refreshForToolbar(e)},plugin:"align"}),i.RegisterCommand("alignRight",{type:"button",icon:"align-right",title:"Align Right",callback:function(){this.align.apply("right")},refresh:function(e){this.align.refreshForToolbar(e)},plugin:"align"}),i.RegisterCommand("alignCenter",{type:"button",icon:"align-center",title:"Align Center",callback:function(){this.align.apply("center")},refresh:function(e){this.align.refreshForToolbar(e)},plugin:"align"}),i.RegisterCommand("alignJustify",{type:"button",icon:"align-justify",title:"Align Justify",callback:function(){this.align.apply("justify")},refresh:function(e){this.align.refreshForToolbar(e)},plugin:"align"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/char_counter.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],e):e(t.FroalaEditor)}(this,function(i){"use strict";i=i&&i.hasOwnProperty("default")?i["default"]:i,Object.assign(i.DEFAULTS,{charCounterMax:-1,charCounterCount:!0}),i.PLUGINS.charCounter=function(r){var n,o=r.$,a=function a(){return(r.opts.iframe&&r.markdown&&r.markdown.isEnabled()?r.$el.text()||"":r.el.textContent||"").replace(/\u200B/g,"").length};function t(t){if(r.opts.charCounterMax<0)return!0;if(a()").html(t).text().length+a()<=r.opts.charCounterMax?t:(r.events.trigger("charCounter.exceeded"),"")}function c(t,e,n){return r.opts.charCounterMax<0||(t.includes('=r.opts.charCounterMax)||(r.events.trigger("charCounter.exceeded"),!1):o("
").html(t).text().length+a()<=r.opts.charCounterMax||(r.events.trigger("charCounter.exceeded"),!1))}function s(){if(r.opts.charCounterCount){var t=a()+(0'),c.$wp.append(d),d.attr("dir",c.opts.direction),c.$box.hasClass("fr-basic")||(m=h('')),c.$box.append(m),c.events.bindClick(c.$box,"a.html-switch",function(){c.events.trigger("commands.before",["html"]),M(!1),c.events.trigger("commands.after",["html"])}));var e=function e(){return!p()};c.events.on("buttons.refresh",e),c.events.on("copy",e,!0),c.events.on("cut",e,!0),c.events.on("paste",e,!0),c.events.on("destroy",x,!0),c.events.on("html.set",function(){p()&&M(!0)}),c.events.on("codeView.update",g),c.events.on("codeView.toggle",function(){c.$box.hasClass("fr-code-view")&&M()}),c.events.on("form.submit",function(){p()&&(c.html.set(u()),c.events.trigger("contentChanged",[],!0))},!0)}(),!f&&c.opts.codeMirror?((f=c.opts.codeMirror.fromTextArea(d.get(0),c.opts.codeMirrorOptions)).on("blur",v),f.on("focus",w)):(c.events.$on(d,"keydown keyup change input",function(){c.opts.height?this.removeAttribute("rows"):(this.rows=1,0===this.value.length?this.style.height="auto":this.style.height="".concat(this.scrollHeight,"px"))}),c.events.$on(d,"blur",v),c.events.$on(d,"focus",w))),c.undo.saveStep(),c.html.cleanEmptyTags(),c.html.cleanWhiteTags(!0),c.core.hasFocus()&&(c.core.isEmpty()||(c.selection.save(),c.$el.find('.fr-marker[data-type="true"]').first().replaceWith('F'),c.$el.find('.fr-marker[data-type="false"]').last().replaceWith('F')));var t=c.html.get(!1,!0);c.$el.find("span.fr-tmp").remove(),c.$box.toggleClass("fr-code-view",!0);var r,o,n=!1;if(c.core.hasFocus()&&(n=!0,c.events.disableBlur(),c.$el.blur()),t=(t=t.replace(/F<\/span>/,"FROALA-SM")).replace(/F<\/span>/,"FROALA-EM"),c.codeBeautifier&&!t.includes("fr-embedly")&&(t=c.codeBeautifier.run(t,c.opts.codeBeautifierOptions)),f){r=t.indexOf("FROALA-SM"),(o=t.indexOf("FROALA-EM")) .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-grp > .fr-btn-wrap > .fr-command, .fr-more-toolbar > .fr-btn-wrap > .fr-command").not(e).filter(function(){return c.opts.codeViewKeepActiveButtons.indexOf(h(this).data("cmd"))<0}).addClass("fr-disabled").attr("aria-disabled",!0),e.addClass("fr-active").attr("aria-pressed",!0),!c.helpers.isMobile()&&c.opts.toolbarInline&&c.toolbar.hide()}function M(e){void 0===e&&(e=!p());var t=c.$tb.find('.fr-command[data-cmd="html"]');e?(c.popups.hideAll(),o(t)):(c.$box.toggleClass("fr-code-view",!1),function r(e){var t=u();c.html.set(t),c.$el.blur(),c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-grp > .fr-btn-wrap > .fr-command, .fr-more-toolbar > .fr-btn-wrap > .fr-command").not(e).removeClass("fr-disabled").attr("aria-disabled",!1),e.removeClass("fr-active").attr("aria-pressed",!1),c.selection.setAtStart(c.el),c.selection.restore(),c.placeholder.refresh(),c.undo.saveStep()}(t),c.events.trigger("codeView.update"))}function x(){p()&&M(!1),f&&f.toTextArea(),d.val("").removeData().remove(),d=null,m&&(m.remove(),m=null)}return{_init:function e(){if(c.events.on("focus",function(){c.opts.toolbarContainer&&function t(){var e=c.$tb.find('.fr-command[data-cmd="html"]');p()?(c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command").not(e).filter(function(){return c.opts.codeViewKeepActiveButtons.indexOf(h(this).data("cmd"))<0}).addClass("fr-disabled").attr("aria-disabled",!1),e.addClass("fr-active").attr("aria-pressed",!1)):(c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command").not(e).removeClass("fr-disabled").attr("aria-disabled",!1),e.removeClass("fr-active").attr("aria-pressed",!1))}()}),!c.$wp)return!1},toggle:M,isActive:p,get:u}},e.RegisterCommand("html",{title:"Code View",undo:!1,focus:!1,forcedRefresh:!0,toggle:!0,callback:function(){this.codeView.toggle()},plugin:"codeView"}),e.DefineIcon("html",{NAME:"code",SVG_KEY:"codeView"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/draggable.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(m){"use strict";m=m&&m.hasOwnProperty("default")?m["default"]:m,Object.assign(m.DEFAULTS,{dragInline:!0}),m.PLUGINS.draggable=function(g){var d=g.$;function e(e){return!(!e.originalEvent||!e.originalEvent.target||e.originalEvent.target.nodeType!==Node.TEXT_NODE)||(e.target&&"A"===e.target.tagName&&1===e.target.childNodes.length&&"IMG"===e.target.childNodes[0].tagName&&(e.target=e.target.childNodes[0]),d(e.target).hasClass("fr-draggable")?(g.undo.canDo()||g.undo.saveStep(),g.opts.dragInline?g.$el.attr("contenteditable",!0):g.$el.attr("contenteditable",!1),g.opts.toolbarInline&&g.toolbar.hide(),d(e.target).addClass("fr-dragging"),g.browser.msie||g.browser.edge||g.selection.clear(),void e.originalEvent.dataTransfer.setData("text","Froala")):(e.preventDefault(),!1))}var p,v=function v(e){return!(e&&("HTML"===e.tagName||"BODY"===e.tagName||g.node.isElement(e)))};function c(e,t,n){if(g.opts.iframe){var r=g.helpers.getPX(g.$wp.find(".fr-iframe").css("padding-top")),a=g.helpers.getPX(g.$wp.find(".fr-iframe").css("padding-left"));e+=g.$iframe.offset().top+r,t+=g.$iframe.offset().left+a}p.offset().top!==e&&p.css("top",e),p.offset().left!==t&&p.css("left",t),p.width()!==n&&p.css("width",n)}function t(e){e.originalEvent.dataTransfer.dropEffect="move",g.opts.dragInline?(!function n(){for(var e=null,t=0;t'),p.removeClass("fr-visible");else if(!1===g.markers.insertAtPoint(e.originalEvent))return!1;if(t.removeClass("fr-dragging"),!1===(t=g.events.chainTrigger("element.beforeDrop",t)))return!1;var a=t;if(t.parent().is("A")&&1===t.parent().get(0).childNodes.length&&(a=t.parent()),g.core.isEmpty())g.events.focus();else g.$el.find(".fr-marker").replaceWith(m.MARKERS),g.selection.restore();if(n===g||g.undo.canDo()||g.undo.saveStep(),g.core.isEmpty())g.$el.html(a);else{var o=g.markers.insert();(g||"").selection&&a.contains(o)&&a.before(o),0===a.find(o).length?d(o).replaceWith(a):0===t.find(o).length&&d(o).replaceWith(t),t.after(m.MARKERS),g.selection.restore()}return g.popups.hideAll(),g.selection.save(),g.$el.find(g.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").not(g.opts.htmlAllowedEmptyTags.join(",")).remove(),g.html.wrap(),g.html.fillEmptyBlocks(),g.selection.restore(),g.undo.saveStep(),g.opts.iframe&&g.size.syncIframe(),n!==g&&(n.popups.hideAll(),n.$el.find(n.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").remove(),n.html.wrap(),n.html.fillEmptyBlocks(),n.undo.saveStep(),n.events.trigger("element.dropped"),n.opts.iframe&&n.size.syncIframe()),g.events.trigger("element.dropped",[a]),!1}p&&p.removeClass("fr-visible"),g.undo.canDo()||g.undo.saveStep(),setTimeout(function(){g.undo.saveStep()},0)}function o(e){if(e&&"DIV"===e.tagName&&g.node.hasClass(e,"fr-drag-helper"))e.parentNode.removeChild(e);else if(e&&e.nodeType===Node.ELEMENT_NODE)for(var t=e.querySelectorAll("div.fr-drag-helper"),n=0;n
")};i.popups.create("text.edit",t)}(),t())},update:function e(){var t=i.popups.get("text.edit").find("input").val();0===t.length&&(t=i.opts.placeholderText),"INPUT"===i.el.tagName?i.$el.attr("placeholder",t):i.$el.text(t),i.events.trigger("contentChanged"),i.popups.hide("text.edit")}}},t.RegisterCommand("updateText",{focus:!1,undo:!1,callback:function(){this.editInPopup.update()}})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/entities.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,a){"object"==typeof exports&&"undefined"!=typeof module?a(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],a):a(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{entities:""'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿŒœŠšŸƒˆ˜ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ   ‌‍‎‏–—‘’‚“”„†‡•…‰′″‹›‾⁄€ℑ℘ℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋⟨⟩◊♠♣♥♦"}),e.PLUGINS.entities=function(i){var n,o,l=i.$;function r(e){var a=e.textContent;if(a.match(n)){for(var t="",r=0;r span").text(o.opts.fontFamily[n()]||t[0]||o.language.translate(o.opts.fontFamilyDefaultSelection))}}}},e.RegisterCommand("fontFamily",{type:"dropdown",displaySelection:function(e){return e.opts.fontFamilySelection},defaultSelection:function(e){return e.opts.fontFamilyDefaultSelection},displaySelectionWidth:120,html:function(){var e='"},title:"Font Family",callback:function(e,t){this.fontFamily.apply(t)},refresh:function(e){this.fontFamily.refresh(e)},refreshOnShow:function(e,t){this.fontFamily.refreshOnShow(e,t)},plugin:"fontFamily"}),e.DefineIcon("fontFamily",{NAME:"font",SVG_KEY:"fontFamily"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/font_size.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],e):e(t.FroalaEditor)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t["default"]:t,Object.assign(t.DEFAULTS,{fontSize:["8","9","10","11","12","14","18","24","30","36","48","60","72","96"],fontSizeSelection:!1,fontSizeDefaultSelection:"Font Size",fontSizeUnit:"px"}),t.PLUGINS.fontSize=function(o){var i=o.$;return{apply:function e(t){o.format.applyStyle("font-size",t)},refreshOnShow:function a(t,e){var n=i(o.selection.element()).css("font-size");"pt"===o.opts.fontSizeUnit&&(n="".concat(Math.round(72*parseFloat(n,10)/96),"pt")),e.find(".fr-command.fr-active").removeClass("fr-active").attr("aria-selected",!1),e.find('.fr-command[data-param1="'.concat(n,'"]')).addClass("fr-active").attr("aria-selected",!0)},refresh:function n(t){if(o.opts.fontSizeSelection){var e=o.helpers.getPX(i(o.selection.element()).css("font-size"));"pt"===o.opts.fontSizeUnit&&(e="".concat(Math.round(72*parseFloat(e,10)/96),"pt")),t.find("> span").text(e)}}}},t.RegisterCommand("fontSize",{type:"dropdown",title:"Font Size",displaySelection:function(t){return t.opts.fontSizeSelection},displaySelectionWidth:30,defaultSelection:function(t){return t.opts.fontSizeDefaultSelection},html:function(){for(var t='"},callback:function(t,e){this.fontSize.apply(e)},refresh:function(t){this.fontSize.refresh(t)},refreshOnShow:function(t,e){this.fontSize.refreshOnShow(t,e)},plugin:"fontSize"}),t.DefineIcon("fontSize",{NAME:"text-height",SVG_KEY:"fontSize"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/forms.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],e):e(t.FroalaEditor)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t["default"]:t,Object.assign(t.POPUP_TEMPLATES,{"forms.edit":"[_BUTTONS_]","forms.update":"[_BUTTONS_][_TEXT_LAYER_]"}),Object.assign(t.DEFAULTS,{formEditButtons:["inputStyle","inputEdit"],formStyles:{"fr-rounded":"Rounded","fr-large":"Large"},formMultipleStyles:!0,formUpdateButtons:["inputBack","|"]}),t.PLUGINS.forms=function(s){var u,r=s.$;function e(t){s.selection.clear(),r(this).data("mousedown",!0)}function o(t){r(this).data("mousedown")&&(t.stopPropagation(),r(this).removeData("mousedown"),f(u=this)),t.preventDefault()}function n(){s.$el.find("input, textarea, button").removeData("mousedown")}function a(){r(this).removeData("mousedown")}function p(){return u||null}function f(t){if(-1==["checkbox","radio"].indexOf(t.type)){var e=s.popups.get("forms.edit");e||(e=function i(){var t="";0'.concat(s.button.buildList(s.opts.formEditButtons),""));var e={buttons:t},o=s.popups.create("forms.edit",e);return s.$wp&&s.events.$on(s.$wp,"scroll.link-edit",function(){p()&&s.popups.isVisible("forms.edit")&&f(p())}),o}());var o=r(u=t);s.popups.refresh("forms.edit"),s.popups.setContainer("forms.edit",s.$sc);var n=o.offset().left+o.outerWidth()/2,a=o.offset().top+o.outerHeight();s.popups.show("forms.edit",n,a,o.outerHeight())}}function i(){var t=s.popups.get("forms.update"),e=p();if(e){var o=r(e);o.is("button")?t.find('input[type="text"][name="text"]').val(o.text()):o.is("input[type=button]")||o.is("input[type=submit]")||o.is("input[type=reset]")?t.find('input[type="text"][name="text"]').val(o.val()):t.find('input[type="text"][name="text"]').val(o.attr("placeholder"))}t.find('input[type="text"][name="text"]').trigger("change")}function d(){u=null}function l(t){if(t)return s.popups.onRefresh("forms.update",i),s.popups.onHide("forms.update",d),!0;var e="";1<=s.opts.formUpdateButtons.length&&(e='
'.concat(s.button.buildList(s.opts.formUpdateButtons),"
"));var o=0,n={buttons:e,text_layer:'
\n
\n
")};return s.popups.create("forms.update",n)}return{_init:function c(){!function t(){s.events.$on(s.$el,s._mousedown,"input, textarea, button",e),s.events.$on(s.$el,s._mouseup,"input, textarea, button",o),s.events.$on(s.$el,"touchmove","input, textarea, button",a),s.events.$on(s.$el,s._mouseup,n),s.events.$on(s.$win,s._mouseup,n),l(!0)}(),s.events.$on(s.$el,"submit","form",function(t){return t.preventDefault(),!1})},updateInput:function m(){var t=s.popups.get("forms.update"),e=p();if(e){var o=r(e),n=t.find('input[type="text"][name="text"]').val()||"";o.is("button")?n.length?o.text(n):o.text("\u200b"):-1!=["button","submit","reset"].indexOf(e.type)?o.attr("value",n):o.attr("placeholder",n),s.popups.hide("forms.update"),f(e)}},getInput:p,applyStyle:function v(t,e,o){void 0===e&&(e=s.opts.formStyles),void 0===o&&(o=s.opts.formMultipleStyles);var n=p();if(!n)return!1;if(!o){var a=Object.keys(e);a.splice(a.indexOf(t),1),r(n).removeClass(a.join(" "))}r(n).toggleClass(t)},showUpdatePopup:function h(){var t=p();if(t){var e=r(t),o=s.popups.get("forms.update");o||(o=l()),s.popups.isVisible("forms.update")||s.popups.refresh("forms.update"),s.popups.setContainer("forms.update",s.$sc);var n=e.offset().left+e.outerWidth()/2,a=e.offset().top+e.outerHeight();s.popups.show("forms.update",n,a,e.outerHeight())}},showEditPopup:f,back:function b(){s.events.disableBlur(),s.selection.restore(),s.events.enableBlur();var t=p();t&&s.$wp&&("BUTTON"===t.tagName&&s.selection.restore(),f(t))}}},t.RegisterCommand("updateInput",{undo:!1,focus:!1,title:"Update",callback:function(){this.forms.updateInput()}}),t.DefineIcon("inputStyle",{NAME:"magic",SVG_KEY:"inlineStyle"}),t.RegisterCommand("inputStyle",{title:"Style",type:"dropdown",html:function(){var t='"},callback:function(t,e){var o=this.forms.getInput();o&&(this.forms.applyStyle(e),this.forms.showEditPopup(o))},refreshOnShow:function(t,e){var o=this.$,n=this.forms.getInput();if(n){var a=o(n);e.find(".fr-command").each(function(){var t=o(this).data("param1");o(this).toggleClass("fr-active",a.hasClass(t))})}}}),t.DefineIcon("inputEdit",{NAME:"edit",SVG_KEY:"edit"}),t.RegisterCommand("inputEdit",{title:"Edit Button",undo:!1,refreshAfterCallback:!1,callback:function(){this.forms.showUpdatePopup()}}),t.DefineIcon("inputBack",{NAME:"arrow-left",SVG_KEY:"back"}),t.RegisterCommand("inputBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.forms.back()}}),t.RegisterCommand("updateInput",{undo:!1,focus:!1,title:"Update",callback:function(){this.forms.updateInput()}})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/fullscreen.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";(e=e&&e.hasOwnProperty("default")?e["default"]:e).PLUGINS.fullscreen=function(s){var t,r,o,n,i=s.$,a=function a(){return s.$box.hasClass("fr-fullscreen")};function l(){if(s.helpers.isIOS()&&s.core.hasFocus())return s.$el.blur(),setTimeout(c,250),!1;t=s.helpers.scrollTop(),s.opts.iframe&&s.markdown&&s.markdown.isEnabled()&&(s.$box=s.$oel),s.$box.toggleClass("fr-fullscreen"),i("body").first().toggleClass("fr-fullscreen"),s.helpers.isMobile()&&(s.opts.toolbarBottom?s.$tb[0].removeAttribute("style"):(s.$tb.data("parent",s.$tb.parent()),s.$box.prepend(s.$tb),s.$tb.data("sticky-dummy")&&s.$tb.after(s.$tb.data("sticky-dummy")))),r=s.opts.height,o=s.opts.heightMax,n=s.opts.zIndex,s.opts.height=s.o_win.innerHeight-(s.opts.toolbarInline?0:s.$tb.outerHeight()+(s.$second_tb?s.$second_tb.outerHeight():0)),s.opts.zIndex=2147483641,s.opts.heightMax=null,s.size.refresh(),s.opts.toolbarInline&&s.toolbar.showInline();for(var e=s.$box.parent();!e.first().is("body");)e.addClass("fr-fullscreen-wrapper"),e=e.parent();s.opts.toolbarContainer&&s.$box.prepend(s.$tb),s.events.trigger("charCounter.update"),s.events.trigger("codeView.update"),s.$win.trigger("scroll")}function f(){if(s.helpers.isIOS()&&s.core.hasFocus())return s.$el.blur(),setTimeout(c,250),!1;s.$box.toggleClass("fr-fullscreen"),i("body").first().toggleClass("fr-fullscreen"),s.$tb.data("parent")&&s.$tb.data("parent").prepend(s.$tb),s.$tb.data("sticky-dummy")&&s.$tb.after(s.$tb.data("sticky-dummy")),s.opts.height=r,s.opts.heightMax=o,s.opts.zIndex=n,s.size.refresh(),s.o_win.scroll(0,t),s.opts.toolbarInline&&s.toolbar.showInline(),s.events.trigger("charCounter.update"),s.opts.toolbarSticky&&s.opts.toolbarStickyOffset&&(s.opts.toolbarBottom?s.$tb.css("bottom",s.opts.toolbarStickyOffset).data("bottom",s.opts.toolbarStickyOffset):s.$tb.css("top",s.opts.toolbarStickyOffset).data("top",s.opts.toolbarStickyOffset));for(var e=s.$box.parent();!e.first().is("body");)e.removeClass("fr-fullscreen-wrapper"),e=e.parent();s.opts.toolbarContainer&&i(s.opts.toolbarContainer).append(s.$tb),i(s.o_win).trigger("scroll"),s.events.trigger("codeView.update")}function c(){a()?f():l(),d(s.$tb.find('.fr-command[data-cmd="fullscreen"]'));var e=s.$tb.find('.fr-command[data-cmd="moreText"]'),t=s.$tb.find('.fr-command[data-cmd="moreParagraph"]'),r=s.$tb.find('.fr-command[data-cmd="moreRich"]'),o=s.$tb.find('.fr-command[data-cmd="moreMisc"]');e.length&&s.refresh.moreText(e),t.length&&s.refresh.moreParagraph(t),r.length&&s.refresh.moreRich(r),o.length&&s.refresh.moreMisc(o)}function d(e){var t=a();e.toggleClass("fr-active",t).attr("aria-pressed",t),e.find("> *").not(".fr-sr-only").replaceWith(t?s.icon.create("fullscreenCompress"):s.icon.create("fullscreen"))}return{_init:function e(){if(!s.$wp)return!1;s.events.$on(i(s.o_win),"resize",function(){a()&&(f(),l())}),s.events.on("toolbar.hide",function(){if(a()&&s.helpers.isMobile())return!1}),s.events.on("position.refresh",function(){if(s.helpers.isIOS())return!a()}),s.events.on("destroy",function(){a()&&f()},!0)},toggle:c,refresh:d,isActive:a}},e.RegisterCommand("fullscreen",{title:"Fullscreen",undo:!1,focus:!1,accessibilityFocus:!0,forcedRefresh:!0,toggle:!0,callback:function(){this.fullscreen.toggle()},refresh:function(e){this.fullscreen.refresh(e)},plugin:"fullscreen"}),e.DefineIcon("fullscreen",{NAME:"expand",SVG_KEY:"fullscreen"}),e.DefineIcon("fullscreenCompress",{NAME:"compress",SVG_KEY:"exitFullscreen"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/help.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{helpSets:[{title:"Inline Editor",commands:[{val:"OSkeyE",desc:"Show the editor"}]},{title:"Common actions",commands:[{val:"OSkeyC",desc:"Copy"},{val:"OSkeyX",desc:"Cut"},{val:"OSkeyV",desc:"Paste"},{val:"OSkeyZ",desc:"Undo"},{val:"OSkeyShift+Z",desc:"Redo"},{val:"OSkeyK",desc:"Insert Link"},{val:"OSkeyP",desc:"Insert Image"}]},{title:"Basic Formatting",commands:[{val:"OSkeyA",desc:"Select All"},{val:"OSkeyB",desc:"Bold"},{val:"OSkeyI",desc:"Italic"},{val:"OSkeyU",desc:"Underline"},{val:"OSkeyS",desc:"Strikethrough"},{val:"OSkey]",desc:"Increase Indent"},{val:"OSkey[",desc:"Decrease Indent"}]},{title:"Quote",commands:[{val:"OSkey'",desc:"Increase quote level"},{val:"OSkeyShift+'",desc:"Decrease quote level"}]},{title:"Image / Video",commands:[{val:"OSkey+",desc:"Resize larger"},{val:"OSkey-",desc:"Resize smaller"}]},{title:"Table",commands:[{val:"Alt+Space",desc:"Select table cell"},{val:"Shift+Left/Right arrow",desc:"Extend selection one cell"},{val:"Shift+Up/Down arrow",desc:"Extend selection one row"}]},{title:"Navigation",commands:[{val:"OSkey/",desc:"Shortcuts"},{val:"Alt+F10",desc:"Focus popup / toolbar"},{val:"Esc",desc:"Return focus to previous position"}]}]}),e.PLUGINS.help=function(c){var a,o=c.$,s="help";return{_init:function e(){},show:function d(){if(!a){var e="

".concat(c.language.translate("Shortcuts"),"

"),t=function n(){for(var e='
',t=0;t";a+="".concat(c.language.translate(l.title),""),a+="";for(var o=0;o",a+="".concat(c.language.translate(s.desc),""),a+="".concat(s.val.replace("OSkey",c.helpers.isMac()?"⌘":"Ctrl+"),""),a+=""}e+=a+=""}return e+="
"}(),l=c.modals.create(s,e,t);a=l.$modal,c.events.$on(o(c.o_win),"resize",function(){c.modals.resize(s)})}c.modals.show(s),c.modals.resize(s)},hide:function t(){c.modals.hide(s)}}},e.DefineIcon("help",{NAME:"question",SVG_KEY:"help"}),e.RegisterShortcut(e.KEYCODE.SLASH,"help",null,"/"),e.RegisterCommand("help",{title:"Help",icon:"help",undo:!1,focus:!1,modal:!0,callback:function(){this.help.show()},plugin:"help",showOnMobile:!1})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/inline_class.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(n,a){"object"==typeof exports&&"undefined"!=typeof module?a(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],a):a(n.FroalaEditor)}(this,function(n){"use strict";n=n&&n.hasOwnProperty("default")?n["default"]:n,Object.assign(n.DEFAULTS,{inlineClasses:{"fr-class-code":"Code","fr-class-highlighted":"Highlighted","fr-class-transparency":"Transparent"}}),n.PLUGINS.inlineClass=function(e){var i=e.$;return{apply:function a(n){e.format.toggle("span",{"class":n})},refreshOnShow:function s(n,a){a.find(".fr-command").each(function(){var n=i(this).data("param1"),a=e.format.is("span",{"class":n});i(this).toggleClass("fr-active",a).attr("aria-selected",a)})}}},n.RegisterCommand("inlineClass",{type:"dropdown",title:"Inline Class",html:function(){var n='"},callback:function(n,a){this.inlineClass.apply(a)},refreshOnShow:function(n,a){this.inlineClass.refreshOnShow(n,a)},plugin:"inlineClass"}),n.DefineIcon("inlineClass",{NAME:"tag",SVG_KEY:"inlineClass"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/inline_style.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{inlineStyles:{"Big Red":"font-size: 20px; color: red;","Small Blue":"font-size: 14px; color: blue;"}}),e.PLUGINS.inlineStyle=function(i){return{apply:function a(e){for(var t=e.split(";"),n=0;n').concat(this.language.translate(n),"
")}return e+=""},title:"Inline Style",callback:function(e,t){this.inlineStyle.apply(t)},plugin:"inlineStyle"}),e.DefineIcon("inlineStyle",{NAME:"paint-brush",SVG_KEY:"inlineStyle"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/line_breaker.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(v){"use strict";v=v&&v.hasOwnProperty("default")?v["default"]:v,Object.assign(v.DEFAULTS,{lineBreakerTags:["table","hr","form","dl","span.fr-video",".fr-embedly","img"],lineBreakerOffset:15,lineBreakerHorizontalOffset:10}),v.PLUGINS.lineBreaker=function(d){var m,t,r,h=d.$;function l(e,t){var n,a,r,o,i,s,l,f;if(null==e)i=(o=t.parent()).offset().top,n=(l=t.offset().top)-Math.min((l-i)/2,d.opts.lineBreakerOffset),r=o.outerWidth(),a=o.offset().left;else if(null==t)(s=(o=e.parent()).offset().top+o.outerHeight())<(f=e.offset().top+e.outerHeight())&&(s=(o=h(o).parent()).offset().top+o.outerHeight()),n=f+Math.min(Math.abs(s-f)/2,d.opts.lineBreakerOffset),r=o.outerWidth(),a=o.offset().left;else{o=e.parent();var p=e.offset().top+e.height(),c=t.offset().top;if(cd.$box.offset().left&&e':"<"+a.parent().get(0).nodeName.toLowerCase()+">",l=null!=i?"":"";r?a.before("<".concat(r,">").concat(s).concat(v.MARKERS,"
").concat(l,"")):a.before("".concat(s).concat(v.MARKERS,"
").concat(l))}else r&&"TD"!=a.parent().get(0).tagName&&0===a.parents(r).length?a.before("<".concat(r,">").concat(v.MARKERS,"
")):a.before("".concat(v.MARKERS,"
"));else if(d.opts.keepTextFormatOnTable&&n.children().get(0)!=undefined&&"TBODY"==n.children().get(0).tagName){var f=n.find("span"),p=null!=f[f.length-1]?f[f.length-1].getAttribute("style"):null,c=null!=p?"<"+f[f.length-1].nodeName.toLowerCase()+' style="'+p+'">':"<"+n.parent().get(0).nodeName.toLowerCase()+">",u=null!=p?"":"";r?n.after("<".concat(r,">").concat(c).concat(v.MARKERS,"
").concat(u,"")):n.after("".concat(c).concat(v.MARKERS,"
").concat(u))}else r&&"TD"!=n.parent().get(0).tagName&&0===n.parents(r).length?n.after("<".concat(r,">").concat(v.MARKERS,"
")):n.after("".concat(v.MARKERS,"
"));t.selection.restore(),d.toolbar.enable()}return{_init:function b(){if(!d.$wp)return!1;!function e(){d.shared.$line_breaker||(d.shared.$line_breaker=h(document.createElement("div")).attr("class","fr-line-breaker").html(''))),m=d.shared.$line_breaker,d.events.on("shared.destroy",function(){m.html("").removeData().remove(),m=null},!0),d.events.on("destroy",function(){m.removeData("instance").removeClass("fr-visible"),h("body").first().append(m),clearTimeout(r)},!0),d.events.$on(m,"mousemove",function(e){e.stopPropagation()},!0),d.events.bindClick(m,"a",g)}(),t=!1,d.events.$on(d.$win,"mousemove",a),d.events.$on(h(d.win),"scroll",s),d.events.on("popups.show.table.edit",s),d.events.on("commands.after",s),d.events.$on(h(d.win),"mousedown",c),d.events.$on(h(d.win),"mouseup",u)}}}}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/line_height.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(r){"use strict";r=r&&r.hasOwnProperty("default")?r["default"]:r,Object.assign(r.DEFAULTS,{lineHeights:{Default:"",Single:"1",1.15:"1.15",1.5:"1.5",Double:"2"}}),r.PLUGINS.lineHeight=function(a){var o=a.$;return{_init:function e(){},apply:function i(e){a.selection.save(),a.html.wrap(!0,!0,!0,!0),a.selection.restore();var t=a.selection.blocks();t.length&&o(t[0]).parent().is("td")&&a.format.applyStyle("line-height",e.toString()),a.selection.save();for(var n=0;n').concat(this.language.translate(t[n].label),"");else if(t instanceof Object)for(var a in t)t.hasOwnProperty(a)&&(e+='
  • ').concat(this.language.translate(a),"
  • "));return e+=""},title:"Line Height",callback:function(e,t){this.lineHeight.apply(t)},refreshOnShow:function(e,t){this.lineHeight.refreshOnShow(e,t)},plugin:"lineHeight"}),r.DefineIcon("lineHeight",{NAME:"arrows-v",FA5NAME:"arrows-alt-v",SVG_KEY:"lineHeight"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/paragraph_format.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(a,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(a.FroalaEditor)}(this,function(a){"use strict";a=a&&a.hasOwnProperty("default")?a["default"]:a,Object.assign(a.DEFAULTS,{paragraphFormat:{N:"Normal",H1:"Heading 1",H2:"Heading 2",H3:"Heading 3",H4:"Heading 4",PRE:"Code"},paragraphFormatSelection:!1,paragraphDefaultSelection:"Paragraph Format"}),a.PLUGINS.paragraphFormat=function(h){var g=h.$;function c(a,t){var e=h.html.defaultTag();if(t&&t.toLowerCase()!=e)if(0");a.prepend(r);for(var n=h.node.contents(a.get(0))[0];n&&["UL","OL"].indexOf(n.tagName)<0;){var o=n.nextSibling;r.append(n),n=o}}else a.html("<"+t+">"+a.html()+"")}return{apply:function u(a){"N"==a&&(a=h.html.defaultTag()),h.selection.save(),h.html.wrap(!0,!0,!h.opts.paragraphFormat.BLOCKQUOTE,!0,!0),h.selection.restore();var t,e,r,n,o,i,p,l,s=h.selection.blocks();h.selection.save(),h.$el.find("pre").attr("skip",!0);for(var m=0;m").html(i.html()));else if(0<=["TD","TH"].indexOf(s[m].parentNode.tagName))r=d,n=a,o=h.html.defaultTag(),n||(n='div class="fr-temp-div"'+(h.node.isEmpty(r.get(0),!0)?' data-empty="true"':"")),n.toLowerCase()==o?(h.node.isEmpty(r.get(0),!0)||r.append("
    "),r.replaceWith(r.html())):r.replaceWith(g("<"+n+">").html(r.html()));else{if("PRE"===a&&null===d[0].nextSibling){var f=g("
    ");d[0].after(f[0])}t=d,(e=a)||(e='div class="fr-temp-div"'+(h.node.isEmpty(t.get(0),!0)?' data-empty="true"':"")),("H1"==e||"H2"==e||"H3"==e||"H4"==e||"H5"==e)&&-1").html(t.html()).removeAttr("data-empty")):t.replaceWith(g("<"+e+" "+h.node.attributes(t.get(0))+">").html(t.html()).removeAttr("data-empty"))}}h.$el.find('pre:not([skip="true"]) + pre:not([skip="true"])').each(function(){g(this).prev().append("
    "+g(this).html()),g(this).remove()}),h.$el.find("pre").removeAttr("skip"),h.html.unwrap(),h.selection.restore()},refreshOnShow:function i(a,t){var e=h.selection.blocks();if(e.length){var r=e[0],n="N",o=h.html.defaultTag();r.tagName.toLowerCase()!=o&&r!=h.el&&(n=r.tagName),t.find('.fr-command[data-param1="'+n+'"]').addClass("fr-active").attr("aria-selected",!0)}else t.find('.fr-command[data-param1="N"]').addClass("fr-active").attr("aria-selected",!0)},refresh:function o(a){if(h.opts.paragraphFormatSelection){var t=h.selection.blocks();if(t.length){var e=t[0],r="N",n=h.html.defaultTag();e.tagName.toLowerCase()!=n&&e!=h.el&&(r=e.tagName),0<=["LI","TD","TH"].indexOf(r)&&(r="N"),a.find(">span").text(h.language.translate(h.opts.paragraphFormat[r]))}else a.find(">span").text(h.language.translate(h.opts.paragraphFormat.N))}}}},a.RegisterCommand("paragraphFormat",{type:"dropdown",displaySelection:function(a){return a.opts.paragraphFormatSelection},defaultSelection:function(a){return a.language.translate(a.opts.paragraphDefaultSelection)},displaySelectionWidth:80,html:function(){var a='"},title:"Paragraph Format",callback:function(a,t){this.paragraphFormat.apply(t)},refresh:function(a){this.paragraphFormat.refresh(a)},refreshOnShow:function(a,t){this.paragraphFormat.refreshOnShow(a,t)},plugin:"paragraphFormat"}),a.DefineIcon("paragraphFormat",{NAME:"paragraph",SVG_KEY:"paragraphFormat"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/paragraph_style.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(a,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],e):e(a.FroalaEditor)}(this,function(a){"use strict";a=a&&a.hasOwnProperty("default")?a["default"]:a,Object.assign(a.DEFAULTS,{paragraphStyles:{"fr-text-gray":"Gray","fr-text-bordered":"Bordered","fr-text-spaced":"Spaced","fr-text-uppercase":"Uppercase"},paragraphMultipleStyles:!0}),a.PLUGINS.paragraphStyle=function(i){var p=i.$;return{_init:function a(){},apply:function c(a,e,t){void 0===e&&(e=i.opts.paragraphStyles),void 0===t&&(t=i.opts.paragraphMultipleStyles);var r="";t||((r=Object.keys(e)).splice(r.indexOf(a),1),r=r.join(" ")),i.selection.save(),i.html.wrap(!0,!0,!0,!0),i.selection.restore();var l=i.selection.blocks();i.selection.save();for(var n=p(l[0]).hasClass(a),s=0;s");l[0].after(o[0])}i.html.unwrap(),i.selection.restore()},refreshOnShow:function l(a,e){var t=i.selection.blocks();if(t.length){var r=p(t[0]);e.find(".fr-command").each(function(){var a=p(this).data("param1"),e=r.hasClass(a);p(this).toggleClass("fr-active",e).attr("aria-selected",e)})}}}},a.RegisterCommand("paragraphStyle",{type:"dropdown",html:function(){var a='"},title:"Paragraph Style",callback:function(a,e){this.paragraphStyle.apply(e)},refreshOnShow:function(a,e){this.paragraphStyle.refreshOnShow(a,e)},plugin:"paragraphStyle"}),a.DefineIcon("paragraphStyle",{NAME:"magic",SVG_KEY:"paragraphStyle"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/print.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{html2pdf:window.html2pdf}),e.PLUGINS.print=function(a){return{run:function e(){!function l(e){var t=a.html.get(),n=null;a.shared.print_iframe?n=a.shared.print_iframe:((n=document.createElement("iframe")).name="fr-print",n.style.position="fixed",n.style.top="0",n.style.left="-9999px",n.style.height="100%",n.style.width="0",n.style.overflow="hidden",n.style["z-index"]="2147483647",n.style.tabIndex="-1",a.events.on("shared.destroy",function(){n.remove()}),a.shared.print_iframe=n);try{document.body.removeChild(n)}catch(d){}document.body.appendChild(n);var i=function(){e(),n.removeEventListener("load",i)};n.addEventListener("load",i);var o=n.contentWindow;o.document.open(),o.document.write(""+document.title+""),Array.prototype.forEach.call(document.querySelectorAll("style"),function(e){e=e.cloneNode(!0),o.document.write(e.outerHTML)});var r=document.querySelectorAll("link[rel=stylesheet]");Array.prototype.forEach.call(r,function(e){var t=document.createElement("link");t.rel=e.rel,t.href=e.href,t.media="print",t.type="text/css",t.media="all",o.document.write(t.outerHTML)}),o.document.write('
    '),o.document.write(t),o.document.write("
    "),o.document.close()}(function(){setTimeout(function(){a.events.disableBlur(),window.frames["fr-print"].focus(),window.frames["fr-print"].print(),a.$win.get(0).focus(),a.events.disableBlur(),a.events.focus()},0)})},toPDF:function t(){a.opts.html2pdf&&(a.$el.css("text-align","left"),a.opts.html2pdf().set({margin:[10,20],html2canvas:{useCORS:!0}}).from(a.el).save(),setTimeout(function(){a.$el.css("text-align","")},100))}}},e.DefineIcon("print",{NAME:"print",SVG_KEY:"print"}),e.RegisterCommand("print",{title:"Print",undo:!1,focus:!1,plugin:"print",callback:function(){this.print.run()}}),e.DefineIcon("getPDF",{NAME:"file-pdf-o",FA5NAME:"file-pdf",SVG_KEY:"pdfExport"}),e.RegisterCommand("getPDF",{title:"Download PDF",type:"button",focus:!1,undo:!1,callback:function(){this.print.toPDF()}})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/quick_insert.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(h){"use strict";h=h&&h.hasOwnProperty("default")?h["default"]:h,Object.assign(h.DEFAULTS,{quickInsertButtons:["image","video","embedly","table","ul","ol","hr"],quickInsertTags:["p","div","h1","h2","h3","h4","h5","h6","pre","blockquote"],quickInsertEnabled:!0}),h.QUICK_INSERT_BUTTONS={},h.DefineIcon("quickInsert",{SVG_KEY:"add",template:"svg"}),h.RegisterQuickInsertButton=function(e,t){h.QUICK_INSERT_BUTTONS[e]=Object.assign({undo:!0},t)},h.RegisterQuickInsertButton("image",{icon:"insertImage",requiredPlugin:"image",title:"Insert Image",undo:!1,callback:function(){var e=this,t=e.$;e.shared.$qi_image_input||(e.shared.$qi_image_input=t(document.createElement("input")).attr("accept","image/"+e.opts.imageAllowedTypes.join(", image/").toLowerCase()).attr("name","quickInsertImage".concat(this.id)).attr("style","display: none;").attr("type","file"),t("body").first().append(e.shared.$qi_image_input),e.events.$on(e.shared.$qi_image_input,"change",function(){var e=t(this).data("inst");this.files&&(e.quickInsert.hide(),e.image.upload(this.files)),t(this).val("")},!0)),e.$qi_image_input=e.shared.$qi_image_input,e.helpers.isMobile()&&e.selection.save(),e.events.disableBlur(),e.$qi_image_input.data("inst",e)[0].click()}}),h.RegisterQuickInsertButton("video",{icon:"insertVideo",requiredPlugin:"video",title:"Insert Video",undo:!1,callback:function(){var e=prompt(this.language.translate("Paste the URL of the video you want to insert."));e&&this.video.insertByURL(e)}}),h.RegisterQuickInsertButton("embedly",{icon:"embedly",requiredPlugin:"embedly",title:"Embed URL",undo:!1,callback:function(){var e=prompt(this.language.translate("Paste the URL of any web content you want to insert."));e&&this.embedly.add(e)}}),h.RegisterQuickInsertButton("table",{icon:"insertTable",requiredPlugin:"table",title:"Insert Table",callback:function(){this.table.insert(2,2)}}),h.RegisterQuickInsertButton("ol",{icon:"formatOL",requiredPlugin:"lists",title:"Ordered List",callback:function(){this.lists.format("OL")}}),h.RegisterQuickInsertButton("ul",{icon:"formatUL",requiredPlugin:"lists",title:"Unordered List",callback:function(){this.lists.format("UL")}}),h.RegisterQuickInsertButton("hr",{icon:"insertHR",title:"Insert Horizontal Line",callback:function(){this.commands.insertHR()}}),h.PLUGINS.quickInsert=function(r){var a,l,c=r.$,u=!1;function n(e){var t,n,i;(t=e.offset().top-r.$box.offset().top,n=(r.$iframe&&r.$iframe.offset().left||0)+e.offset().left-e.position().left-4').concat(r.icon.create("quickInsert"),"")));a=r.shared.$quick_insert,r.tooltip.bind(r.$box,".fr-quick-insert > a.fr-floating-btn"),r.events.on("destroy",function(){c("body").first().append(a.removeClass("fr-on")),l&&(f(),c("body").first().append(l.css("left",-9999).css("top",-9999)))},!0),r.events.on("shared.destroy",function(){a.html("").removeData().remove(),a=null,l&&(l.html("").removeData().remove(),l=null)},!0),r.events.on("commands.before",o),r.events.on("commands.after",function(){r.popups.areVisible()||i()}),r.events.bindClick(r.$box,".fr-quick-insert > a",d),r.events.bindClick(r.$box,".fr-qi-helper > a.fr-btn",function(e){var t=c(e.currentTarget).data("cmd");if(!1===r.events.trigger("quickInsert.commands.before",[t]))return!1;h.QUICK_INSERT_BUTTONS[t].callback.apply(r,[e.currentTarget]),h.QUICK_INSERT_BUTTONS[t].undo&&r.undo.saveStep(),r.events.trigger("quickInsert.commands.after",[t]),r.quickInsert.hide()}),r.events.$on(r.$wp,"scroll",p),r.events.$on(r.$tb,"transitionend",".fr-more-toolbar",p)}(),a.hasClass("fr-on")&&f(),r.$box.append(a),n(e),a.data("tag",e),a.addClass("fr-visible"))}function i(){if(r.core.hasFocus()){var e=r.selection.element();if(r.opts.enter==h.ENTER_BR||r.node.isBlock(e)||(e=r.node.blockParent(e)),r.opts.enter==h.ENTER_BR&&!r.node.isBlock(e)){var t=r.node.deepestParent(e);t&&(e=t)}var n=function n(){return r.opts.enter!=h.ENTER_BR&&r.node.isEmpty(e)&&0<=r.opts.quickInsertTags.indexOf(e.tagName.toLowerCase())},i=function i(){return r.opts.enter==h.ENTER_BR&&("BR"==e.tagName&&(!e.previousSibling||"BR"==e.previousSibling.tagName||r.node.isBlock(e.previousSibling))||r.node.isEmpty(e)&&(!e.previousSibling||"BR"==e.previousSibling.tagName||r.node.isBlock(e.previousSibling))&&(!e.nextSibling||"BR"==e.nextSibling.tagName||r.node.isBlock(e.nextSibling)))};e&&(n()||i())?a&&a.data("tag").is(c(e))&&a.hasClass("fr-on")?f():r.selection.isCollapsed()&&s(c(e)):o()}}function o(){a&&!u&&(a.hasClass("fr-on")&&f(),a.removeClass("fr-visible fr-on"),a.css("left",-9999).css("top",-9999))}function d(e){if(e&&e.preventDefault(),a.hasClass("fr-on")&&!a.hasClass("fr-hidden"))f();else{if(!r.shared.$qi_helper){for(var t=r.opts.quickInsertButtons,n='
    ',i=0,s=0;s').concat(r.icon.create(o.icon),""))}n+="
    ",r.shared.$qi_helper=c(n),r.tooltip.bind(r.shared.$qi_helper,"a.fr-btn"),r.events.$on(r.shared.$qi_helper,"mousedown",function(e){e.preventDefault()},!0)}l=r.shared.$qi_helper,r.$box.append(l),u=!0,setTimeout(function(){u=!1,l.css("top",parseFloat(a.css("top"))),l.css("left",parseFloat(a.css("left"))+a.outerWidth()),l.find("a").addClass("fr-size-1"),a.addClass("fr-on")},10)}}function f(){var t=r.$box.find(".fr-qi-helper");if(t.length){for(var n=t.find("a"),e=0;e').concat(this.language.translate(t[n])).concat(o?''.concat(o,""):"","")}return e+=""},callback:function(e,t){this.quote.apply(t)},plugin:"quote"}),e.DefineIcon("quote",{NAME:"quote-left",SVG_KEY:"blockquote"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/save.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{saveInterval:1e4,saveURL:null,saveParams:{},saveParam:"body",saveMethod:"POST"}),e.PLUGINS.save=function(i){var f=i.$,n=null,l=null,t=!1,v=1,c=2,s={};function u(e,t){i.events.trigger("save.error",[{code:e,message:s[e]},t])}function a(e){void 0===e&&(e=i.html.get());var n=e,t=i.events.trigger("save.before",[e]);if(!1===t)return!1;if("string"==typeof t&&(e=t),i.opts.saveURL){var s={};for(var a in i.opts.saveParams)if(i.opts.saveParams.hasOwnProperty(a)){var o=i.opts.saveParams[a];s[a]="function"==typeof o?o.call(this):o}var r={};r[i.opts.saveParam]=e,f(this).ajax({method:i.opts.saveMethod,url:i.opts.saveURL,data:Object.assign(r,s),crossDomain:i.opts.requestWithCORS,withCredentials:i.opts.requestWithCredentials,headers:i.opts.requestHeaders,done:function(e,t,s){l=n,i.events.trigger("save.after",[e])},fail:function(e){u(c,e.response||e.responseText)}})}else u(v)}function o(){clearTimeout(n),n=setTimeout(function(){var e=i.html.get();(l!=e||t)&&(t=!1,a(l=e))},0)}return s[v]="Missing saveURL option.",s[c]="Something went wrong during save.",{_init:function r(){if(i.opts.letteringClass)for(var e=i.opts.letteringClass,t=i.$el.find(".".concat(e)).length,s=0;s$1");i.opts.saveInterval&&(l=i.html.get(),i.events.on("contentChanged",function(){setTimeout(o,i.opts.saveInterval)}),i.events.on("keydown destroy",function(){clearTimeout(n)}))},save:a,reset:function e(){o(),t=!1},force:function d(){t=!0}}},e.DefineIcon("save",{NAME:"floppy-o",FA5NAME:"save"}),e.RegisterCommand("save",{title:"Save",undo:!1,focus:!1,refreshAfterCallback:!1,callback:function(){this.save.save()},plugin:"save"})}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/trim_video.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";(e=e&&e.hasOwnProperty("default")?e["default"]:e).PLUGINS.trimVideoPlugin=function(c){var o,d,s,l,u,m,f,v,r;function p(e){e.preventDefault(),null!=l&&l.abort(),l=null;var t=document.getElementById("videoTrimContainer");t.parentNode.removeChild(t),c.filesManager.setChildWindowState(!1)}function g(e){var t=parseInt(e,10),n=Math.floor(t/3600)?String(Math.floor(t/3600)):"00",a=Math.floor(t/60)%60?String(Math.floor(t/60)%60):"00",i=t%60?String(t%60):"00";return i=i.length<2?"0"+i:i,a=a.length<2?"0"+a:a,(n=n.length<2?"0"+n:n)+":"+a+":"+i}function y(e){e.preventDefault();var t=g(document.getElementById("startTime").value),n=g(document.getElementById("endTime").value);o.constructor===Blob&&(o=new File([o],o.name,{type:o.type||"",lastModified:o.lastModified}));var a=new FormData;a.append("startTime",t),a.append("endTime",n),a.append("file",o);var i=new XMLHttpRequest;document.getElementById("trim-file-loader").classList.add("fr-file-loader"),document.getElementsByClassName("fr-trim-button")[0].style.display="none",i.onload=function(){if(200==this.status){var e=new Blob([this.response],{type:this.response.type||""});e.name=o.name,e.lastModified=o.lastModified,e.lastModifiedDate=o.lastModifiedDate,r.set(d,e),c.filesManager.upload(e,[],null,d),document.getElementById("trim-file-loader").classList.remove("fr-file-loader"),document.getElementsByClassName("fr-trim-button")[0].style.display="block";var t=document.getElementById("videoTrimContainer");t.parentNode.removeChild(t),c.filesManager.setChildWindowState(!1)}},i.open("POST","http://localhost:3000/convert",!0),i.responseType="blob",(l=i).send(a)}return{_init:function e(){},trimVideo:function i(e,t,n){o=e,d=t,r=n,function a(){var e=URL.createObjectURL(o),t=c.o_doc.body,n=c.o_doc.createElement("div");n.setAttribute("id","videoTrimContainer"),n.style.cssText="position: fixed; top: 0;left: 0;padding: 0;overflow-y:auto;width: 100%;height: 100%;background: rgba(0,0,0,0.4);z-index: 9998;display:block",t.appendChild(n);var r=document.createElement("div");r.setAttribute("id","fr-form-container"),r.innerHTML='\n

    '.concat(o.name.replace(/\.[^.]*$/,""),"

    \n
    \n \n "),document.getElementById("videoTrimContainer").appendChild(r),document.getElementById("fr-video-edit").addEventListener("loadedmetadata",function(){s=document.getElementById("fr-video-edit").duration,r.innerHTML+=' \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n ");var t=document.getElementById("startTime"),e=document.getElementById("startTimeValue"),n=function n(){u=Number(100*(t.value-t.min)/(t.max-t.min)),m=10-.2*u,f=Number(100*(a.value-a.min)/(a.max-a.min)),v=10-.2*f,e.innerHTML="".concat(g(t.value),""),e.style.left="calc(".concat(u,"% + (").concat(m,"px))"),selectedRange.style.left=e.style.left,selectedRange.style.width="calc((".concat(f,"% + (").concat(v,"px)) - (").concat(u,"% + (").concat(m,"px)))"),selectedRange.style.backgroundColor="#03A9F4"};document.addEventListener("DOMContentLoaded",n);var a=document.getElementById("endTime"),i=document.getElementById("endTimeValue"),o=function o(){u=Number(100*(t.value-t.min)/(t.max-t.min)),m=10-.2*u,f=Number(100*(a.value-a.min)/(a.max-a.min)),v=10-.2*f,i.innerHTML="".concat(g(a.value),""),i.style.left="calc(".concat(f,"% + (").concat(v,"px))");var e=document.getElementById("selectedRange");e.style.left="calc(".concat(u,"% + (").concat(m,"px))"),e.style.width="calc((".concat(f,"% + (").concat(v,"px)) - (").concat(u,"% + (").concat(m,"px)))"),e.style.backgroundColor="#03A9F4"};document.addEventListener("DOMContentLoaded",o),document.getElementById("convert").addEventListener("click",y),document.getElementById("cancel").addEventListener("click",p);var d=document.getElementById("startTime"),l=document.getElementById("endTime");d.oninput=function(e){if(Number(d.value)>=Number(l.value))return e.preventDefault(),d.value=String(Number(l.value)-1),!1;n()},l.oninput=function(e){if(Number(l.value)<=Number(d.value))return e.preventDefault(),l.value=String(Number(d.value)+1),!1;o()}})}()}}}}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/url.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(r){"use strict";(r=r&&r.hasOwnProperty("default")?r["default"]:r).URLRegEx="(^| |\\u00A0)(".concat(r.LinkRegEx,"|([a-z0-9+-_.]{1,}@[a-z0-9+-_.]{1,}\\.[a-z0-9+-_]{1,}))$"),r.PLUGINS.url=function(u){var c=u.$,o=null;function t(e,t,n){for(var r="";n.length&&"."==n[n.length-1];)r+=".",n=n.substring(0,n.length-1);var a=n;if(u.opts.linkConvertEmailAddress)u.helpers.isEmail(a)&&!/^mailto:.*/i.test(a)&&(a="mailto:".concat(a));else if(u.helpers.isEmail(a))return t+n;return/^((http|https|ftp|ftps|mailto|tel|sms|notes|data)\:)/i.test(a)||(a="//".concat(a)),(t||"")+"').concat(n.replace(/&/g,"&").replace(/&/g,"&").replace(//g,">"),"").concat(r)}var d=function d(){return new RegExp(r.URLRegEx,"gi")};function g(e){return u.opts.linkAlwaysNoFollow&&(o="nofollow"),u.opts.linkAlwaysBlank&&(u.opts.linkNoOpener&&(o?o+=" noopener":o="noopener"),u.opts.linkNoReferrer&&(o?o+=" noreferrer":o="noreferrer")),e.replace(d(),t)}function h(e){var t=e.split(" ");return t[t.length-1]}function n(){var e=u.selection.ranges(0),t=e.startContainer;if(t.nodeType!==Node.TEXT_NODE)return!1;if(!t||e.startOffset!==(t.textContent||"").length){u.markers.insert();var n=u.$el.find(".fr-marker"),r=t.textContent.match(/(^| |\u00A0)(((([a-z\u0080-\u009f\u00a1-\uffff0-9-_\.]{1,})(\.(com|net|org|edu|mil|gov|co|biz|info|me|dev)))|((ftp|http|https):\/\/[a-z\u0080-\u009f\u00a1-\uffff0-9-_\.]{1,})|(www\.[a-z\u0080-\u009f\u00a1-\uffff0-9-_\.]{1,}\.[a-z0-9-]{2,24})|((ftp|http|https):\/\/[\u0021-\uffff]{1,}@[a-z\u0080-\u009f\u00a1-\uffff0-9-_\.]{1,}))((:[0-9]{1,5})|)(((\/|\?|#)[a-z\u00a1-\uffff0-9@?\|!^=%&\/~+#-\'*-_{}]*)|())|([a-z0-9+-_.]{1,}@[a-z0-9+-_.]{1,}\.[a-z0-9+-_]{1,}))$/gi);if(n.remove(),!r)return!1}if(function p(e){return!!e&&("A"===e.tagName||!(!e.parentNode||e.parentNode==u.el)&&p(e.parentNode))}(t))return!1;if(d().test(h(t.textContent))){var a,o=t.textContent.length;if(0').concat(e,"")}if(u.$el[0].getAttribute("plainpaste"))return function n(e){if("string"==typeof e)return(e=e.replace(/&/g,"&")).replace(/(?:https?|ftp|file):\/\/(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$])|www\.(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$])|([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gim,g)}(e)})}}}}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/plugins/word_counter.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(E){"use strict";E=E&&E.hasOwnProperty("default")?E["default"]:E,Object.assign(E.DEFAULTS,{wordCounterMax:-1,wordCounterCount:!0}),E.PLUGINS.wordCounter=function(C){var r,t=C.$;function f(){var e=C.el.innerText.toString();e=(e=(e=(e=(e=(e=(e=(e=e.replace(/(^\s*)|(\s*$)/gi," ")).replace(/\u00a0/g," ")).replace(/[ ]{2,}/gi," ")).replace(/\n /,"\n")).replace(/[\u200A\u200C-\u200D\uFEFF\u202F\u2000-\u2009\u205F\u3000\u1680\u00A0\u0020]/g," ")).replace(/[\u200B]/g,"")).replace(/\t+/g," ")).split(" ").join("\n");var t=C.$el.find(".fr-pagebreak"),r=e.split(/\r?\n/),n=0;return r.forEach(function(e){0<(e=e.replace(/\s/g,"")).length&&n++}),n-2*t.length}function e(e){var t=!1;if(C.opts.wordCounterMax<0)return!0;if(f()C.opts.wordCounterMax&&(C.keys.isCharacter(r)||r===E.KEYCODE.ENTER)&&(t=!0),!(!C.keys.ctrlKey(e)&&t||r===E.KEYCODE.IME)||(e.preventDefault(),e.stopPropagation(),C.events.trigger("wordCounter.exceeded"),!1)}function n(){if(C.opts.wordCounterCount){var e=f()+(0").html(e).text().split(" ").length+f()<=C.opts.wordCounterMax?e:(C.events.trigger("wordCounter.exceeded"),"")}return{_init:function a(){return!!C.$wp&&!!C.opts.wordCounterCount&&((r=t(document.createElement("span")).attr("class","fr-counter fr-wCounter")).css("bottom",C.$wp.css("border-bottom-width")),C.$second_tb?C.$second_tb.append(r):C.$wp.append(r),C.events.on("keydown",e,!0),C.events.on("paste.afterCleanup",o),C.events.on("keyup contentChanged input",function(){C.events.trigger("wordCounter.update")}),C.events.on("wordCounter.update",n),C.events.trigger("wordCounter.update"),void C.events.on("destroy",function(){t(C.o_win).off("resize.char".concat(C.id)),r.removeData().remove(),r=null}))},wordCount:f}}}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/third_party/image_tui.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";function v(e){return(v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}if(e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{imageTUIOptions:{includeUI:{theme:{"menu.normalIcon.path":"https://cdn.jsdelivr.net/npm/tui-image-editor@3.2.2/dist/svg/icon-d.svg","menu.activeIcon.path":"https://cdn.jsdelivr.net/npm/tui-image-editor@3.2.2/dist/svg/icon-b.svg","menu.disabledIcon.path":"https://cdn.jsdelivr.net/npm/tui-image-editor@3.2.2/dist/svg/icon-a.svg","menu.hoverIcon.path":"https://cdn.jsdelivr.net/npm/tui-image-editor@3.2.2/dist/svg/icon-c.svg","submenu.normalIcon.path":"https://cdn.jsdelivr.net/npm/tui-image-editor@3.2.2/dist/svg/icon-d.svg","submenu.normalIcon.name":"icon-d","submenu.activeIcon.path":"https://cdn.jsdelivr.net/npm/tui-image-editor@3.2.2/dist/svg/icon-c.svg","submenu.activeIcon.name":"icon-c"},initMenu:"filter",menuBarPosition:"left"}},tui:window.tui}),e.PLUGINS.imageTUI=function(c){var l=c.$,m=!0;function g(e,t){l("#tuieditor").remove(),e.style.display="none",m||t===undefined||t.filesManager.setChildWindowState(!1)}function p(e,t,i,n,o){for(var a=e.toDataURL(),d=atob(a.split(",")[1]),r=[],s=0;sCancel '),l(".tui-editor-cancel-btn")[0].addEventListener("click",function(e){g(d,t)}),l(".tui-editor-save-btn")[0].addEventListener("click",function(e){null!=n?p(s,t,o,i,n):p(s,t,o,i),g(d,t)})}}}},e.DefineIcon("imageTUI",{NAME:"sliders",FA5NAME:"sliders-h",SVG_KEY:"advancedImageEditor"}),e.RegisterCommand("imageTUI",{title:"Advanced Edit",undo:!1,focus:!1,callback:function(e,t){this.imageTUI.launch(this,!0)},plugin:"imageTUI"}),!e.PLUGINS.image)throw new Error("TUI image editor plugin requires image plugin.");e.DEFAULTS.imageEditButtons.push("imageTUI")}); -------------------------------------------------------------------------------- /froala_editor/static/froala_editor/js/third_party/spell_checker.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * froala_editor v4.5.2 (https://www.froala.com/wysiwyg-editor) 3 | * License https://froala.com/wysiwyg-editor/terms/ 4 | * Copyright 2014-2025 Froala Labs 5 | */ 6 | 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(p){"use strict";(p=p&&p.hasOwnProperty("default")?p["default"]:p).DEFAULT_SCAYT_OPTIONS={enableOnTouchDevices:!1,disableOptionsStorage:["all"],localization:"en",extraModules:"ui",DefaultSelection:"American English",spellcheckLang:"en_US",contextMenuSections:"suggest|moresuggest",serviceProtocol:"https",servicePort:"80",serviceHost:"svc.webspellchecker.net",servicePath:"spellcheck/script/ssrv.cgi",contextMenuForMisspelledOnly:!0,scriptPath:"https://svc.webspellchecker.net/spellcheck31/wscbundle/wscbundle.js"},Object.assign(p.DEFAULTS,{scaytAutoload:!1,scaytCustomerId:"1:ldogw1-MSDuT3-slyfO-0YJgB1-Wx7262-HIT741-MAMDv4-10qfb3-A4LDP-c60m3-hSQgd2-az2",scaytOptions:{}}),p.PLUGINS.spellChecker=function(s){var l;function e(e){if(l&&l.isDisabled){var t=!l.isDisabled();e.toggleClass("fr-active",t).attr("aria-pressed",t),s.$el.attr("spellcheck",s.opts.spellcheck&&!t)}}function t(e){l&&l.isDisabled&&!l.isDisabled()&&0<=["bold","italic","underline","strikeThrough","subscript","superscript","fontFamily","fontSize","html"].indexOf(e)&&l.removeMarkupInSelectionNode({removeInside:!0})}function o(e){l&&l.isDisabled&&!l.isDisabled()&&0<=["bold","italic","underline","strikeThrough","subscript","superscript","fontFamily","fontSize","html"].indexOf(e)&&l.reloadMarkup()}function a(e){l&&l.isDisabled&&!l.isDisabled()&&(e.which==p.KEYCODE.ENTER&&setTimeout(l.reloadMarkup,0))}function i(e){if(e&&e.getAttribute&&e.getAttribute("data-scayt-word"))e.outerHTML=e.innerHTML;else if(e&&e.nodeType==Node.ELEMENT_NODE)for(var t=e.querySelectorAll("[data-scayt-word], [data-spelling-word]"),s=0;s 73 | new FroalaEditor('#%s',%s) 74 | """ % (el_id, options) 75 | return str 76 | 77 | def _media(self): 78 | css = { 79 | 'all': ('froala_editor/css/froala_editor.min.css', 'froala_editor/css/froala_style.min.css', 80 | 'froala_editor/css/froala-django.css') 81 | } 82 | js = ('froala_editor/js/froala_editor.min.js', 'froala_editor/js/froala-django.js',) 83 | 84 | if self.theme: 85 | css['all'] += ('froala_editor/css/themes/' + self.theme + '.min.css',) 86 | 87 | if self.language: 88 | js += ('froala_editor/js/languages/' + self.language + '.js',) 89 | 90 | for plugin in self.plugins: 91 | js += ('froala_editor/js/plugins/' + plugin + '.min.js',) 92 | if plugin in PLUGINS_WITH_CSS: 93 | css['all'] += ('froala_editor/css/plugins/' + plugin + '.min.css',) 94 | for plugin in self.third_party: 95 | js += ('froala_editor/js/third_party/' + plugin + '.min.js',) 96 | if plugin in THIRD_PARTY_WITH_CSS: 97 | css['all'] += ('froala_editor/css/third_party/' + plugin + '.min.css',) 98 | 99 | return Media(css=css, js=js) 100 | 101 | media = property(_media) 102 | -------------------------------------------------------------------------------- /publish_package.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/bash 3 | 4 | if [ ${TRAVIS_PULL_REQUEST} != "false" ]; then echo "Not publishing a pull request !!!" && exit 0; fi 5 | 6 | export BRANCH_NAME=`echo "${TRAVIS_BRANCH}" | tr '[:upper:]' '[:lower:]'` 7 | case "${BRANCH_NAME}" in 8 | dev*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;; 9 | ao-dev*)echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;; 10 | qa*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;; 11 | qe*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;; 12 | rc*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;; 13 | release-master*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;; 14 | ft*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI" ;; 15 | bf*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI" ;; 16 | *) echo "Not a valid branch name for CI/CD" && exit -1;; 17 | esac 18 | 19 | echo $TRAVIS_BRANCH 20 | echo ${DEPLOYMENT_SERVER} 21 | export SHORT_COMMIT=`git rev-parse --short=7 ${TRAVIS_COMMIT}` 22 | echo "short commit $SHORT_COMMIT" 23 | sudo apt-get update && sudo apt-get install -y jq unzip zip 24 | PACKAGE_NAME=`jq '.name' version.json | tr -d '"'` 25 | PACKAGE_VERSION=`jq '.version' version.json | tr -d '"'` 26 | wget --timeout=10 --no-check-certificate --user ${NEXUS_USER} --password ${NEXUS_USER_PWD} https://nexus.tools.froala-infra.com/repository/Froala-npm/${PACKAGE_NAME}/-/${PACKAGE_NAME}-${PACKAGE_VERSION}.tgz 27 | if [ $? -ne 0 ]; then 28 | echo "Error pulling core library from nexus" 29 | exit -1 30 | fi 31 | tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tgz 32 | echo "Copying core library css & js to /webroot/js// & /webroot/css ......" 33 | /bin/cp -fr package/css/* froala_editor/static/froala_editor/css/ 34 | /bin/cp -fr package/js/* froala_editor/static/froala_editor/js/ 35 | echo "Done ..." 36 | rm -rf package/ ${PACKAGE_NAME}-${PACKAGE_VERSION}.tgz 37 | python setup.py sdist 38 | echo "DIST package name: " 39 | ls dist/ 40 | ARCHIVE_NAME="${BUILD_REPO_NAME}-${TRAVIS_BRANCH}-${PACKAGE_VERSION}.tar.gz" 41 | mv dist/*.tar.gz dist/${ARCHIVE_NAME} 42 | echo "new package name: " 43 | ls dist/ 44 | curl -k --user "${NEXUS_USER}:${NEXUS_USER_PWD}" --upload-file dist/${ARCHIVE_NAME} https://nexus.tools.froala-infra.com/repository/Froala-raw-repo/django/${ARCHIVE_NAME} 45 | exit $? 46 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup( 4 | name='django-froala-editor', 5 | version='4.5.2', 6 | author='Dipesh Acharya', 7 | author_email='dipesh@awecode.com', 8 | maintainer='Froala Labs', 9 | packages=['froala_editor'], 10 | url='http://github.com/froala/django-froala-editor/', 11 | license='BSD License', 12 | description='django-froala-editor package helps integrate Froala WYSIWYG HTML editor with Django.', 13 | long_description=open('README.rst').read(), 14 | include_package_data=True, 15 | zip_safe=False, 16 | keywords='froala,django,admin,wysiwyg,editor,text,html,editor,rich,web', 17 | classifiers=[ 18 | 'Environment :: Web Environment', 19 | 'Framework :: Django', 20 | 'Intended Audience :: Developers', 21 | 'License :: OSI Approved :: BSD License', 22 | 'Operating System :: OS Independent', 23 | 'Programming Language :: Python', 24 | 'Programming Language :: Python :: 2.7', 25 | 'Programming Language :: Python :: 3', 26 | 'Topic :: Internet :: WWW/HTTP', 27 | 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 28 | ], 29 | ) 30 | -------------------------------------------------------------------------------- /version.json: -------------------------------------------------------------------------------- 1 | { 2 | "comment-1": " Please update this file for any new branch with core libary name - package name and version uploaded to nexus", 3 | "name": "froala-editor-QA241122", 4 | "version": "4.0.16" 5 | } 6 | --------------------------------------------------------------------------------