From 6747298de790520bbb1784100677dc2c64062221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Mon, 28 Aug 2023 17:01:28 +0200 Subject: [PATCH 01/30] AV-2017: WIP porting custom avoindata ckeditor plugins to ckeditor5 --- docker/.env.nginx.local | 2 +- docker/README.md | 3 +- drupal/Dockerfile | 1 + drupal/composer.json | 3 +- drupal/composer.lock | 56 +- .../avoindata-ckeditor5-plugins/.gitignore | 1 + .../avoindata-ckeditor5-plugins/README.md | 22 + .../avoindata_ckeditor5_plugins.ckeditor5.yml | 117 + .../avoindata_ckeditor5_plugins.info.yml | 7 + .../avoindata_ckeditor5_plugins.libraries.yml | 35 + .../avoindata_ckeditor5_plugins.module | 29 + .../css/editor.css | 111 + .../avoindata-ckeditor5-plugins/css/style.css | 2 + .../css/toolbar-icons.css | 7 + .../icons/icon-expander.svg | 6 + .../icons/icon-hint.svg | 5 + .../icons/icon-info.svg | 5 + .../icons/icon-window.svg | 5 + .../js/avoindataExpander.js | 1 + .../js/avoindataHint.js | 1 + .../js/avoindataNote.js | 1 + .../js/externalLink.js | 1 + .../package-lock.json | 9117 +++++++++++++++++ .../avoindata-ckeditor5-plugins/package.json | 22 + .../avoindataExpander/avoindataExpander.js | 23 + .../avoindataExpanderEditing.js | 217 + .../avoindataExpander/avoindataExpanderUI.js | 36 + .../src/avoindataExpander/index.js | 13 + .../insertAvoindataExpanderCommand.js | 56 + .../src/avoindataHint/avoindataHint.js | 23 + .../src/avoindataHint/avoindataHintEditing.js | 294 + .../src/avoindataHint/avoindataHintUI.js | 36 + .../src/avoindataHint/index.js | 13 + .../insertAvoindataHintCommand.js | 60 + .../src/avoindataNote/avoindataNote.js | 23 + .../src/avoindataNote/avoindataNoteEditing.js | 292 + .../src/avoindataNote/avoindataNoteUI.js | 36 + .../src/avoindataNote/index.js | 13 + .../insertAvoindataNoteCommand.js | 60 + .../src/externalLink/externalLink.js | 70 + .../src/externalLink/index.js | 13 + .../webpack.config.js | 81 + drupal/scripts/init_drupal.sh | 53 +- .../src/less/drupal/custom-elements.less | 11 +- 44 files changed, 10937 insertions(+), 46 deletions(-) create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/.gitignore create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/README.md create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/css/editor.css create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/css/style.css create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/package-lock.json create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/package.json create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/index.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/index.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/index.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js diff --git a/docker/.env.nginx.local b/docker/.env.nginx.local index c137a442d7..6dae9572af 100644 --- a/docker/.env.nginx.local +++ b/docker/.env.nginx.local @@ -4,6 +4,6 @@ NGINX_ROOT=/var/www/html NGINX_MAX_BODY_SIZE=5000M NGINX_EXPIRES=1h NGINX_CSP_DEFAULT_SRC="" -NGINX_CSP_SCRIPT_SRC="platform.twitter.com syndication.twitter.com cdn.syndication.twimg.com https://www.google.com/recaptcha/ https://www.gstatic.com/ https://www.google.com cdn.matomo.cloud suomi.matomo.cloud browser.sentry-cdn.com" +NGINX_CSP_SCRIPT_SRC="platform.twitter.com syndication.twitter.com cdn.syndication.twimg.com https://www.google.com/recaptcha/ https://www.gstatic.com/ https://www.google.com cdn.matomo.cloud suomi.matomo.cloud browser.sentry-cdn.com https://unpkg.com/@ckeditor/ckeditor5-inspector/build/inspector.js" NGINX_CSP_STYLE_SRC="https://fonts.googleapis.com https://platform.twitter.com https://ton.twimg.com https://www.google.com https://ajax.googleapis.com https://www.gstatic.com" NGINX_CSP_FRAME_SRC="syndication.twitter.com https://platform.twitter.com https://www.google.com/recaptcha/" diff --git a/docker/README.md b/docker/README.md index e181324c29..f10e23fdd5 100644 --- a/docker/README.md +++ b/docker/README.md @@ -23,7 +23,7 @@ This folder contains dockerized versions of the opendata services. * ../ckan/ * ckan docker image * ../drupal - * drupal docker image + * drupal docker image ## Build requirements @@ -157,6 +157,7 @@ services: - ../drupal/modules/avoindata-guide/:/opt/drupal/web/modules/avoindata-guide - ../drupal/modules/avoindata-user/:/opt/drupal/web/modules/avoindata-user - ../drupal/modules/avoindata-ckeditor-plugins/:/opt/drupal/web/modules/avoindata-ckeditor-plugins + - ../drupal/modules/avoindata-ckeditor5-plugins/:/opt/drupal/web/modules/avoindata-ckeditor5-plugins - ../drupal/modules/avoindata-theme:/opt/drupal/web/themes/avoindata - ../opendata-assets:/opt/drupal/web/modules/opendata-assets - /opt/drupal/web/modules/opendata-assets/node_modules/ diff --git a/drupal/Dockerfile b/drupal/Dockerfile index b0b9a828eb..e48062a9cf 100644 --- a/drupal/Dockerfile +++ b/drupal/Dockerfile @@ -101,6 +101,7 @@ COPY modules/avoindata-ckeditor-plugins ${MOD_DIR}/avoindata-ckeditor-plugin COPY modules/avoindata-theme ${MOD_DIR}/avoindata-theme/ COPY modules/avoindata-appfeed ${MOD_DIR}/avoindata-appfeed/ COPY modules/avoindata-datasetlist ${MOD_DIR}/avoindata-datasetlist/ +COPY modules/avoindata-ckeditor5-plugins ${MOD_DIR}/avoindata-ckeditor5-plugins/ # diff --git a/drupal/composer.json b/drupal/composer.json index 2f35ada713..7fcc29ab91 100755 --- a/drupal/composer.json +++ b/drupal/composer.json @@ -139,9 +139,10 @@ }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "drupal/ckeditor5_dev": "^1.0", "drupal/core-dev": "^9.2", "drupal/devel": "^4.1", "kint-php/kint": "^5.0", "squizlabs/php_codesniffer": "^3.6" } -} +} \ No newline at end of file diff --git a/drupal/composer.lock b/drupal/composer.lock index 113c4d7fe0..24e95534c7 100755 --- a/drupal/composer.lock +++ b/drupal/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "05a771c8531c322adb4ea608d3c34e39", + "content-hash": "12b1945ef1d4746ec35720ad90f8958e", "packages": [ { "name": "alchemy/zippy", @@ -12727,6 +12727,58 @@ ], "time": "2020-06-20T12:56:16+00:00" }, + { + "name": "drupal/ckeditor5_dev", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/ckeditor5_dev.git", + "reference": "1.0.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/ckeditor5_dev-1.0.3.zip", + "reference": "1.0.3", + "shasum": "840390d0e8cebef30176d1c6060ad686fea06f4e" + }, + "require": { + "drupal/core": "^9 || ^10" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "1.0.3", + "datestamp": "1669111315", + "security-coverage": { + "status": "not-covered", + "message": "Project has not opted into security advisory coverage!" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "bnjmnm", + "homepage": "https://www.drupal.org/user/2369194" + }, + { + "name": "lauriii", + "homepage": "https://www.drupal.org/user/1078742" + }, + { + "name": "Wim Leers", + "homepage": "https://www.drupal.org/user/99777" + } + ], + "description": "Enables the CKEditor 5 Inspector and provides testing helpers.", + "homepage": "https://www.drupal.org/project/ckeditor5_dev", + "support": { + "source": "https://git.drupalcode.org/project/ckeditor5_dev" + } + }, { "name": "drupal/core-dev", "version": "9.5.8", @@ -15503,4 +15555,4 @@ "platform": [], "platform-dev": [], "plugin-api-version": "2.3.0" -} +} \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/.gitignore b/drupal/modules/avoindata-ckeditor5-plugins/.gitignore new file mode 100644 index 0000000000..b512c09d47 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/README.md b/drupal/modules/avoindata-ckeditor5-plugins/README.md new file mode 100644 index 0000000000..72fd12923b --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/README.md @@ -0,0 +1,22 @@ +## This module is modified from the [CKEditor 5 plugin development starter template](https://git.drupalcode.org/project/ckeditor5_dev/-/tree/1.0.3/ckeditor5_plugin_starter_template) + +To facilitate easier development of modules that provide CKEditor 5 plugins, +developers may copy the contents of this directory to the root of their module +directory. This provides the basic build tools and directory structure for +creating CKEditor 5 plugins within a contributed module, as well as a basic +working plugin based on the [CKEditor 5 block plugin tutorial](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/tutorials/implementing-a-block-widget.html) +but with additional documentation and minor changes for better integration +with Drupal. + +When Drupal updates to use newer versions of CKEditor 5, it may be necessary to +update any files copied from here to your module. + +Plugin source should be added to `src/{pluginNameDirectory}` and the build tools expect this directory to include an +`index.js` file that exports one or more CKEditor 5 plugins. + +In the module directory, run `npm install` to set up the necessary assets. The +initial run of `install` may take a few minutes, but subsequent builds will be +faster. + +After installing dependencies, plugins can be built with `npm build`. +They will be built to `js/{pluginNameDirectory}.js`. diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml new file mode 100644 index 0000000000..68a137db23 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml @@ -0,0 +1,117 @@ +# Example from https://git.drupalcode.org/project/ckeditor5_dev/-/blob/1.0.3/ckeditor5_plugin_starter_template/MODULE_NAME.ckeditor5.yml +# If using yml to configure plugins, rename this to {module_name}.ckeditor5.yml. +# If using annotations, this file can be removed. +# @see https://www.drupal.org/docs/drupal-apis/plugin-api/annotations-based-plugins +# For information on using annotations to define plugins. +# @see the CKEditor 5 module's README.md for more details regarding plugin +# configuration options. +# cSpell:ignore simplebox demobox + +#MODULE_NAME_demo_simplebox: +# # Use the provider: property for this plugin to depend on another module. +# +# # Configuration that will be sent to CKEditor 5 JavaScript plugins. +# ckeditor5: +# plugins: +# - demoPlugin.SimpleBox +# # *Additional configuration properties* +# # config: data sent to the constructor of any CKEditor 5 plugin +# # editorPluginName: +# # editorPluginProperty: editorPluginValue +# +# # Configuration that will be used directly by Drupal. +# drupal: +# label: Simple box demo +# # The library loaded while using the editor. +# library: MODULE_NAME/demobox +# # The library loaded when configuring the text format using this plugin. +# admin_library: MODULE_NAME/admin.demobox +# toolbar_items: +# # This should match the name of the corresponding plugin exported in the +# # plugin's index.js. +# simpleBox: +# label: Simple box demo +# # If the plugin does not provide elements, set this as +# # `elements: false` +# elements: +# # Note that it necessary for elements to separately provide both the tag +# # (f.e. `

`) and the attribute being added to the tag +# # (f.e. `

`). +# -

+# -

+# -
+# -
+# -
+# -
+# # *Additional configuration properties* +# # conditions: for setting additional criteria that must be met for the +# # plugin to be active. +# # class: Optional PHP class that makes it possible for the plugin to provide +# # dynamic values, or a configuration UI. + +avoindata_ckeditor5_plugins_externallink: + ckeditor5: + plugins: + - externalLink.ExternalLink + config: + link: + decorators: + isExternal: + mode: manual + label: Open in a new tab + attributes: + target: '_blank' + aria-label: 'Leads to external site' + classes: + - 'external-link' + drupal: + label: Link + library: avoindata_ckeditor5_plugins/externalLink + elements: + - + - + - + - + - + - + +avoindata_ckeditor5_plugins_avoindataexpander: + ckeditor5: + plugins: + - avoindataExpander.AvoindataExpander + drupal: + label: Avoindata Expander + library: avoindata_ckeditor5_plugins/avoindataExpander + admin_library: avoindata_ckeditor5_plugins/toolbarIcons + toolbar_items: + avoindataExpander: + label: Avoindata Expander + elements: + -
+ -
+ -
+ - + - + - + - + -
+ +avoindata_ckeditor5_plugins_avoindatanote: + ckeditor5: + plugins: + - avoindataNote.AvoindataNote + drupal: + label: Avoindata Note + library: avoindata_ckeditor5_plugins/avoindataNote + admin_library: avoindata_ckeditor5_plugins/toolbarIcons + toolbar_items: + avoindataNote: + label: Avoindata Note + elements: + -
+ -
+ -
+ - + - + -
+ -
\ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml new file mode 100644 index 0000000000..8ec32cf956 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml @@ -0,0 +1,7 @@ +name: Avoindata Drupal CKEditor 5 plugins +type: module +description: Adds several buttons for custom elements to CKEditor 5. +core_version_requirement: ^9 || ^10 +package: Custom +dependencies: + - drupal:ckeditor5 diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml new file mode 100644 index 0000000000..4cf28a31ce --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml @@ -0,0 +1,35 @@ +# This adds the plugin JavaScript to the page. + +externalLink: + js: + js/externalLink.js: { preprocess: false, minified: true } + dependencies: + - core/ckeditor5 + +avoindataExpander: + css: + theme: + css/editor.css: {} + js: + js/avoindataExpander.js: { preprocess: false, minified: false } + dependencies: + - core/ckeditor5 + +avoindataNote: + css: + theme: + - css/editor.css: {} + - css/style.css: {} + js: + js/avoindataNote.js: { preprocess: false, minified: false } + dependencies: + - core/ckeditor5 + +# Loaded in the text format configuration form to provide styling for the icon +# used in toolbar config. +toolbarIcons: + css: + theme: + css/toolbar-icons.css: {} + + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module new file mode 100644 index 0000000000..aa888bd2ee --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module @@ -0,0 +1,29 @@ +' . t('Avoindata CKEDitor 5 plugins') . '

'; + $output .= '

' . t('The module adds a number of buttons for custom elements to CKEditor 5 to be added to the toolbar in the content editor).') . '

'; + $output .= '

' . t('Uses') . '

'; + $output .= '
'; + $output .= '
' . t('Settings') . '
'; + $output .= '
' . t('In the text formats that use ckeditor 5, move the icon into the active toolbar.', [':text-formats' => Url::fromRoute('filter.admin_overview')->toString()]) . '
'; + $output .= '
'; + return $output; + + default: + } +} \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css new file mode 100644 index 0000000000..af003021d3 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css @@ -0,0 +1,111 @@ +.ck-content { + .avoindata-expander { + background:#f6f9fc; + border-radius:2px; + -webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1); + box-shadow:0 2px 4px 1px rgba(41,41,41,.1); + border:1px solid #ecedee; + margin:0 + } + + .avoindata-expander + .avoindata-expander { + margin-top:-1px + } + + .avoindata-note { + background: rgb(247, 247, 248); + border-radius: 0; + margin-top: 20px; + margin-bottom: 20px; + } + + .avoindata-note-header { + .avoindata-note-icon { + height: 24px; + width: 24px; + float: left; + margin: 24px 6px 0 20px; + } + + .avoindata-note-title { + font-size: 20px; + font-weight: 600; + line-height: 28px; + padding: 19px 0 13px 15px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 0; + margin-inline-end: 0; + + > *:last-child { + margin: 0; + } + } + } + + .avoindata-note-content { + font-size: 18px; + font-weight: normal; + line-height: 27px; + padding: 0 20px 15px 20px; + } + + .avoindata-expander-content p:last-of-type, + .avoindata-note-content p:last-of-type, + .avoindata-hint-content p:last-of-type { + margin-bottom: 0; + } + + .avoindata-hint { + margin: 20px 0; + } + + .avoindata-hint-image { + display: inline-block; + vertical-align: top; + height: 24px; + width: 24px; + margin-left: 20px; + } + + .avoindata-hint-content { + width: calc(100% - 45px); + display: inline-block; + font-size: 18px; + font-weight: normal; + line-height: 27px; + padding: 0 20px 15px 15px; + } + + .avoindata-example { + background: white; + border-radius: 2px; + border: 1.5px solid #2a6ebb; + border-left: 4.5px solid #2a6ebb; + margin-top: 20px; + margin-bottom: 20px; + } + + .avoindata-example-title { + font-size: 16px; + font-weight: 600; + line-height: 24px; + padding: 20px 20px 6px 20px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 0; + margin-inline-end: 0; + + > *:last-child { + margin: 0; + } + } + + .avoindata-example-content { + font-size: 16px; + font-weight: normal; + line-height: 24px; + padding: 0 20px 20px 20px; + } +} + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css new file mode 100644 index 0000000000..2c191543ff --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css @@ -0,0 +1,2 @@ +.avoindata-expander{background:#f6f9fc;border-radius:2px;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1);box-shadow:0 2px 4px 1px rgba(41,41,41,.1);border:1px solid #ecedee;margin:0}.avoindata-expander+.avoindata-expander{margin-top:-1px}.avoindata-expander.open{background:#fff}.avoindata-expander.open .avoindata-expander-content,.avoindata-expander.open .avoindata-expander-content.collapse{display:block}.avoindata-expander-header{cursor:pointer}.avoindata-expander-title{color:#2a6ebb;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:600;padding:20px 0 20px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block;max-width:90%}.avoindata-expander-content{display:none;padding:0 20px 15px 20px;color:#000;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px}.avoindata-expander-content.cke_widget_editable{display:block}.avoindata-expander-header .icon-wrapper{float:right;padding-right:20px;padding-top:24px}.avoindata-expander-header .icon-wrapper i{color:#2a6ebb}.avoindata-expander-group-toggler{text-decoration:none;color:#2a6ebb;cursor:pointer;margin-bottom:10px}.avoindata-note-header-image,.avoindata-note-icon{height:24px;width:24px;margin-left:20px;margin-top:auto}.avoindata-note{background:#f7f7f8;border-radius:0;margin-top:20px;margin-bottom:20px}.avoindata-note-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:20px;font-weight:600;line-height:28px;padding:19px 0 13px 15px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-note-title>:last-child{margin:0}.avoindata-note-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 20px}.avoindata-expander-content p:last-of-type,.avoindata-hint-content p:last-of-type,.avoindata-note-content p:last-of-type{margin-bottom:0}.avoindata-hint{margin:20px 0}.avoindata-hint-image{display:inline-block;vertical-align:top;height:24px;width:24px;margin-left:20px}.avoindata-hint-content{width:calc(100% - 45px);display:inline-block;color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 15px}.avoindata-example{background:#fff;border-radius:2px;border:1.5px solid #2a6ebb;border-left:4.5px solid #2a6ebb;margin-top:20px;margin-bottom:20px}.avoindata-example-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:600;line-height:24px;padding:20px 20px 6px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-example-title>:last-child{margin:0}.avoindata-example-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:0 20px 20px 20px}a.external-link::after{font-family:"Fontawesome webfont",sans-serif;content:"\f08e"}a.external-link svg{margin-bottom:-2px;margin-left:4px;width:16px;height:16px;fill:#2a6ebb}.avoindata-section{background-color:#fff;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.2);box-shadow:0 2px 4px 1px rgba(41,41,41,.2);border-top:4px solid #2a6ebb;border-radius:4px 4px 0 0;margin:45px 0;padding:30px 30px}.avoindata-section:first-of-type{margin-top:0}.avoindata-section .avoindata-section__title{margin-top:0;margin-bottom:20px;font-size:22px}table{border-collapse:collapse;text-align:left}table caption{color:#222;font-weight:600;text-align:left;padding:20px 0}table td,table th{padding:7px 15px;border:1px solid #c8cdd0}table th{background-color:#f7f7f8;color:#222;font-weight:600}table td{color:#292929} +/*# sourceMappingURL=maps/style.css.map */ diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css b/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css new file mode 100644 index 0000000000..35a8b6720a --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css @@ -0,0 +1,7 @@ +.ckeditor5-toolbar-button-avoindataExpander { + background-image: url(../icons/icon-expander.svg?source); +} + +.ckeditor5-toolbar-button-avoindataNote { + background-image: url(../icons/icon-info.svg?source); +} \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg new file mode 100644 index 0000000000..b71e0aa3a4 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg new file mode 100644 index 0000000000..f9f58d61e7 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg new file mode 100644 index 0000000000..67369da791 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg new file mode 100644 index 0000000000..0c6a62c965 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js new file mode 100644 index 0000000000..63d38142f6 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataExpander/avoindataExpander.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataExpander)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpanderEditing */ "./src/avoindataExpander/avoindataExpanderEditing.js");\n/* harmony import */ var _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataExpanderUI */ "./src/avoindataExpander/avoindataExpanderUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataExpanderUI and AvoindataExpanderEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataExpander extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that ExpanderEditing and ExpanderUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpander.js?')},"./src/avoindataExpander/avoindataExpanderEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataExpanderCommand */ \"./src/avoindataExpander/insertAvoindataExpanderCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *
\n
\n
Title
\n \n
\n
Content
\n
\n *\n * This file has the logic for defining the avoindataExpander model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataExpanderEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataExpanderCommand',\n new _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataExpander', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataExpanderTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within simpleBox.\n allowIn: 'avoindataExpander',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataExpanderContent', {\n isLimit: true,\n allowIn: 'avoindataExpander',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataExpander inside avoindataExpanderContent.\n if (\n (context.endsWith('avoindataExpanderContent') || context.endsWith('avoindataExpanderTitle')) &&\n childDefinition.name === 'avoindataExpander'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: {\n name: 'div',\n classes: 'avoindata-expander-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToStructure({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer }) => {\n return writer.createContainerElement('div', { class: 'avoindata-expander-header' }, [\n writer.createContainerElement('div', { class: 'avoindata-expander-title' }, [\n writer.createSlot()\n ]),\n writer.createContainerElement('span', { class: 'icon-wrapper pull-right' }, [\n writer.createEmptyElement('i', { class: 'fas fa-angle-down' })\n ])\n ])\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpander',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-expander',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Expander widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderEditing.js?")},"./src/avoindataExpander/avoindataExpanderUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-expander.svg?source */ \"./icons/icon-expander.svg?source\");\n/**\n * @file registers the avoindataExpander toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataExpanderUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataExpander toolbar button.\n editor.ui.componentFactory.add('avoindataExpander', (locale) => {\n const command = editor.commands.get('insertAvoindataExpanderCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Expander widget'),\n icon: _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataExpanderCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderUI.js?")},"./src/avoindataExpander/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpander */ "./src/avoindataExpander/avoindataExpander.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataExpander: _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/index.js?')},"./src/avoindataExpander/insertAvoindataExpanderCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataExpanderCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataExpanderCommand, which is executed when the avoindataExpander\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataExpanderCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataExpander(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataExpander is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataExpander',\n );\n\n // If the cursor is not in a location where a avoindataExpander can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataExpander(writer) {\n // Create instances of the three elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataExpander = writer.createElement('avoindataExpander');\n const avoindataExpanderTitle = writer.createElement('avoindataExpanderTitle');\n const avoindataExpanderContent = writer.createElement('avoindataExpanderContent');\n\n // Append the title and content elements to the avoindataExpander, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataExpanderTitle, avoindataExpander);\n writer.append(avoindataExpanderContent, avoindataExpander);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataExpanderTitle);\n writer.appendElement('paragraph', avoindataExpanderContent);\n\n // Return the element to be added to the editor.\n return avoindataExpander;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/insertAvoindataExpanderCommand.js?")},"./icons/icon-expander.svg?source":module=>{"use strict";eval('module.exports = "\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./icons/icon-expander.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,n)=>{for(var a in n)__webpack_require__.o(n,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataExpander/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js new file mode 100644 index 0000000000..20f7a805e8 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js @@ -0,0 +1 @@ +!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(n.CKEditor5=n.CKEditor5||{},n.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataHint/avoindataHint.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataHint)\n/* harmony export */ });\n/* harmony import */ var _avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHintEditing */ "./src/avoindataHint/avoindataHintEditing.js");\n/* harmony import */ var _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataHintUI */ "./src/avoindataHint/avoindataHintUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataHint extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHint.js?')},"./src/avoindataHint/avoindataHintEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataHintCommand */ \"./src/avoindataHint/insertAvoindataHintCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataHint model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataHintEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataHintCommand',\n new _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataHint', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataHintHeader', {\n // This is only to be used within avoindataHint.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataHint',\n allowChildren: ['avoindataHintIcon', 'avoindataHintTitle']\n });\n\n schema.register('avoindataHintIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHintHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataHintTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHintHeader',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataHintContent', {\n isLimit: true,\n allowIn: 'avoindataHint',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataHint inside avoindataHintContent.\n if (\n (context.endsWith('avoindataHintContent') || context.endsWith('avoindataHintTitle')) &&\n childDefinition.name === 'avoindataHint'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-icon',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintTitle',\n view: {\n name: 'div',\n classes: 'avoindata-hint-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: \"avoindata-hint-icon\", src: '/themes/avoindata/images/avoindata-hint-icon.svg' })\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintTitle',\n view: {\n name: 'div',\n classes: 'avoindata-hint-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHint',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-hint',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Hint widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-hint-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createUIElement('img', {\n class: 'avoindata-hint-icon',\n src: \"/themes/avoindata/images/avoindata-hint-icon.svg\",\n alt: \"Avoindata Hint icon\",\n });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintEditing.js?")},"./src/avoindataHint/avoindataHintUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-info.svg?source */ \"./icons/icon-info.svg?source\");\n/**\n * @file registers the avoindataHint toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataHintUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataHint toolbar button.\n editor.ui.componentFactory.add('avoindataHint', (locale) => {\n const command = editor.commands.get('insertAvoindataHintCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Hint widget'),\n icon: _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataHintCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintUI.js?")},"./src/avoindataHint/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataHint__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHint */ "./src/avoindataHint/avoindataHint.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataHint: _avoindataHint__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/index.js?')},"./src/avoindataHint/insertAvoindataHintCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataHintCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataHintCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataHint(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataHint is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataHint',\n );\n\n // If the cursor is not in a location where a avoindataHint can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataHint(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataHint = writer.createElement('avoindataHint');\n const avoindataHintHeader = writer.createElement('avoindataHintHeader');\n const avoindataHintIcon = writer.createElement('avoindataHintIcon');\n const avoindataHintTitle = writer.createElement('avoindataHintTitle');\n const avoindataHintContent = writer.createElement('avoindataHintContent');\n\n // Append the title and content elements to the avoindataHint, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataHintHeader, avoindataHint);\n writer.append(avoindataHintIcon, avoindataHintHeader);\n writer.append(avoindataHintTitle, avoindataHintHeader);\n writer.append(avoindataHintContent, avoindataHint);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataHintTitle);\n writer.appendElement('paragraph', avoindataHintContent);\n\n // Return the element to be added to the editor.\n return avoindataHint;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/insertAvoindataHintCommand.js?")},"./icons/icon-info.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./icons/icon-info.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":n=>{"use strict";n.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(n,e)=>{for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),__webpack_require__.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataHint/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js new file mode 100644 index 0000000000..d3ac9d3f80 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataNote/avoindataNote.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataNote)\n/* harmony export */ });\n/* harmony import */ var _avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNoteEditing */ "./src/avoindataNote/avoindataNoteEditing.js");\n/* harmony import */ var _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataNoteUI */ "./src/avoindataNote/avoindataNoteUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataNote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNote.js?')},"./src/avoindataNote/avoindataNoteEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataNoteCommand */ \"./src/avoindataNote/insertAvoindataNoteCommand.js\");\n/* harmony import */ var _icons_icon_info_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-info.svg */ \"./icons/icon-info.svg\");\n\n\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataNote model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataNoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataNoteCommand',\n new _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataNote', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataNoteHeader', {\n // This is only to be used within avoindataNote.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataNote',\n allowChildren: ['avoindataNoteIcon', 'avoindataNoteTitle']\n });\n\n schema.register('avoindataNoteIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataNoteTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataNoteContent', {\n isLimit: true,\n allowIn: 'avoindataNote',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataNote inside avoindataNoteContent.\n if (\n (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) &&\n childDefinition.name === 'avoindataNote'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-icon'\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_info_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNote',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-note',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Note widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-note-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToStructure({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_info_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteEditing.js?")},"./src/avoindataNote/avoindataNoteUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-info.svg?source */ \"./icons/icon-info.svg?source\");\n/**\n * @file registers the avoindataNote toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataNoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataNote toolbar button.\n editor.ui.componentFactory.add('avoindataNote', (locale) => {\n const command = editor.commands.get('insertAvoindataNoteCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Note'),\n icon: _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataNoteCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteUI.js?")},"./src/avoindataNote/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataNote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNote */ "./src/avoindataNote/avoindataNote.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataNote: _avoindataNote__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/index.js?')},"./src/avoindataNote/insertAvoindataNoteCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataNoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataNoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataNote(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataNote is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataNote',\n );\n\n // If the cursor is not in a location where a avoindataNote can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataNote(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataNote = writer.createElement('avoindataNote');\n const avoindataNoteHeader = writer.createElement('avoindataNoteHeader');\n const avoindataNoteIcon = writer.createElement('avoindataNoteIcon');\n const avoindataNoteTitle = writer.createElement('avoindataNoteTitle');\n const avoindataNoteContent = writer.createElement('avoindataNoteContent');\n\n // Append the title and content elements to the avoindataNote, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataNoteHeader, avoindataNote);\n writer.append(avoindataNoteIcon, avoindataNoteHeader);\n writer.append(avoindataNoteTitle, avoindataNoteHeader);\n writer.append(avoindataNoteContent, avoindataNote);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataNoteTitle);\n writer.appendElement('paragraph', avoindataNoteContent);\n\n // Return the element to be added to the editor.\n return avoindataNote;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/insertAvoindataNoteCommand.js?")},"./icons/icon-info.svg":module=>{"use strict";eval('module.exports = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRTk3MDI1IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iSWNvbnMvQmFzaWMtaWNvbnMvaW5mbyIgZmlsbD0iI0U5NzAyNSIgc3Ryb2tlLXdpZHRoPSIxIiA+CiAgICAgICAgPHBhdGggZD0iTTEyLC0xLjI0MzQ0OTc5ZS0xNCBDMTguNjE3LC0xLjI0MzQ0OTc5ZS0xNCAyNCw1LjM4MyAyNCwxMiBDMjQsMTguNjE3IDE4LjYxNywyNCAxMiwyNCBDNS4zODMsMjQgMi4xMzE2MjgyMWUtMTQsMTguNjE3IDIuMTMxNjI4MjFlLTE0LDEyIEMyLjEzMTYyODIxZS0xNCw1LjM4MyA1LjM4MywtMS4yNDM0NDk3OWUtMTQgMTIsLTEuMjQzNDQ5NzllLTE0IFogTTEyLDIgQzYuNDg2LDIgMiw2LjQ4NiAyLDEyIEMyLDE3LjUxNCA2LjQ4NiwyMiAxMiwyMiBDMTcuNTE0LDIyIDIyLDE3LjUxNCAyMiwxMiBDMjIsNi40ODYgMTcuNTE0LDIgMTIsMiBaIE0xMi4wMDI4NzUsMTAuMDAwMzY0NiBDMTIuNTU0ODY5MiwxMC4wMDAzNjQ2IDEzLjAwMjg2NDYsMTAuNDQ4MzU5OSAxMy4wMDI4NjQ2LDExLjAwMDM1NDIgTDEzLjAwMjg2NDYsMTcuMDAwMjkxNyBMMTQuMDAyODU0MSwxNy4wMDAyOTE3IEMxNC41NTQ4NDg0LDE3LjAwMDI5MTcgMTUuMDAyODQzNywxNy40NDgyODcgMTUuMDAyODQzNywxOC4wMDAyODEzIEMxNS4wMDI4NDM3LDE4LjU1MjI3NTUgMTQuNTU0ODQ4NCwxOS4wMDAyNzA4IDE0LjAwMjg1NDEsMTkuMDAwMjcwOCBMOS45OTk4OTU4MywxOS4wMDAyNzA4IEM5LjQ0NzkwMTU4LDE5LjAwMDI3MDggOC45OTk5MDYyNSwxOC41NTIyNzU1IDguOTk5OTA2MjUsMTguMDAwMjgxMyBDOC45OTk5MDYyNSwxNy40NDgyODcgOS40NDc5MDE1OCwxNy4wMDAyOTE3IDkuOTk5ODk1ODMsMTcuMDAwMjkxNyBMMTAuOTk5ODg1NCwxNy4wMDAyOTE3IEwxMC45OTk4ODU0LDEyLjAwMDM0MzggTDkuOTk5ODk1ODMsMTIuMDAwMzQzOCBDOS40NDc5MDE1OCwxMi4wMDAzNDM4IDguOTk5OTA2MjUsMTEuNTUyMzQ4NCA4Ljk5OTkwNjI1LDExLjAwMDM1NDIgQzguOTk5OTA2MjUsMTAuNDQ4MzU5OSA5LjQ0NzkwMTU4LDEwLjAwMDM2NDYgOS45OTk4OTU4MywxMC4wMDAzNjQ2IEwxMi4wMDI4NzUsMTAuMDAwMzY0NiBaIE0xMS41MDE4ODAyLDUuMDAwNDE2NjcgQzEyLjMzMTg3MTUsNS4wMDA0MTY2NyAxMy4wMDI4NjQ2LDUuNjcyNDA5NjcgMTMuMDAyODY0Niw2LjUwMDQwMTA0IEMxMy4wMDI4NjQ2LDcuMjc5Njg3MDQgMTIuNDA4NDkwMSw3LjkyMDc4NzYzIDExLjY0NjU5NDUsNy45OTM1MTQ3NCBMMTEuNTAxNzU1Miw4LjAwMDM4NTQyIEwxMS41MDE3NTUyLDguMDAwMzg1NDIgTDExLjQ5OTg4MDIsOC4wMDAzODU0MiBDMTAuNjcwODg4OCw4LjAwMDM4NTQyIDkuOTk5ODk1ODMsNy4zMjgzOTI0MiA5Ljk5OTg5NTgzLDYuNTAwNDAxMDQgQzkuOTk5ODk1ODMsNS42NzI0MDk2NyAxMC42NzA4ODg4LDUuMDAwNDE2NjcgMTEuNDk5ODgwMiw1LjAwMDQxNjY3IEwxMS41MDE4ODAyLDUuMDAwNDE2NjcgWiIgaWQ9InBhdGgiIGZpbGw9IiNFOTcwMjUiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-info.svg?')},"./icons/icon-info.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-info.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataNote/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js new file mode 100644 index 0000000000..2755708d3d --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.externalLink=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/externalLink/externalLink.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ExternalLink)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\nclass ExternalLink extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n\tinit() {\n\t\tconsole.log('ExternalLink loaded')\n\t\tconst editor = this.editor;\n\t\tconst { model } = editor;\n\n\t\t// `listenTo()` and `editor` are available thanks to `Plugin`.\n\t\t// By using `listenTo()` you will ensure that the listener is removed when\n\t\t// the plugin is destroyed.\n\t\tthis.listenTo(editor.data, 'ready', () => {\n\t\t\tconst linkCommand = editor.commands.get('link');\n\t\t\tconst decorator = linkCommand.manualDecorators.get('linkIsExternal')\n\t\t\tconst selection = editor.model.document.selection;\n\n\t\t\tconsole.log(decorator)\n\n\t\t\t// Override default link manual decorator conversion to add an icon after the link\n\t\t\teditor.conversion.for( 'downcast' ).attributeToElement( {\n\t\t\t\tmodel: 'linkIsExternal',\n\t\t\t\tview: ( manualDecoratorValue, { writer, schema }, { item } ) => {\n\t\t\t\t\t// Manual decorators for block links are handled e.g. in LinkImageEditing.\n\t\t\t\t\tif ( !( item.is( 'selection' ) || schema.isInline( item ) ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( manualDecoratorValue ) {\n\t\t\t\t\t\tconst element = writer.createAttributeElement( 'a', decorator.attributes, { priority: 5 } );\n\n\t\t\t\t\t\tif ( decorator.classes ) {\n\t\t\t\t\t\t\twriter.addClass( decorator.classes, element );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( const key in decorator.styles ) {\n\t\t\t\t\t\t\twriter.setStyle( key, decorator.styles[ key ], element );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twriter.setCustomProperty( 'link', true, element );\n\n\t\t\t\t\t\treturn element;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.listenTo(linkCommand, 'execute', (evt, params) => {\n\t\t\t\tconst linkIsExternal = params[1]['linkIsExternal']\n\t\t\t\tconsole.log(evt)\n\t\t\t\tconsole.log(params)\n\t\t\t\tconsole.log('linkIsExternal', linkIsExternal)\n\t\t\t\tconsole.log('source', evt.source)\n\n\t\t\t\tif (linkIsExternal) {\n\t\t\t\t\tconsole.log('external link')\n\t\t\t\t\tconsole.log(editor.model.schema)\n\t\t\t\t\teditor.model.change(writer => {\n\t\t\t\t\t\tconsole.log('foo')\n\t\t\t\t\t\twriter.appendText('test', selection)\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('not an external link')\n\t\t\t\t}\n\t\t\t})\n\t\t});\n\t}\n\n\tstatic get pluginName() {\n\t\treturn 'ExternalLink';\n\t}\n}\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/externalLink.js?")},"./src/externalLink/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _externalLink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalLink */ "./src/externalLink/externalLink.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n ExternalLink: _externalLink__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/index.js?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.externalLink/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":t=>{"use strict";t.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t](n,n.exports,__webpack_require__),n.exports}__webpack_require__.d=(t,e)=>{for(var n in e)__webpack_require__.o(e,n)&&!__webpack_require__.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/externalLink/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json b/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json new file mode 100644 index 0000000000..e7f18df65b --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json @@ -0,0 +1,9117 @@ +{ + "name": "drupal-ckeditor5", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "drupal-ckeditor5", + "version": "1.0.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "@ckeditor/ckeditor5-dev-utils": "^30.0.0", + "@ckeditor/ckeditor5-link": "^39.0.1", + "ckeditor5": "~34.1.0", + "file-loader": "^6.2.0", + "raw-loader": "^4.0.2", + "terser-webpack-plugin": "^5.2.0", + "webpack": "^5.51.1", + "webpack-cli": "^4.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-34.2.0.tgz", + "integrity": "sha512-OcdFj9yT7C5yKPHtTKWvjGMJLpigrkdJN4AZhdJJPigiuYG0c5mnCuTvOYxp2kVijFWRjhPlwIyPVTtDZ0vnzw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "@ckeditor/ckeditor5-widget": "^34.2.0", + "lodash-es": "^4.17.11" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-core": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-39.0.1.tgz", + "integrity": "sha512-3hva3sRdDS2TLDhQNKgnJmpdXhuaod5tooDI/vnaiK+kduqy3nPuWI0qHtFpMhe7dlQWPZSI9ZhS/7cfFQ4CUg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-utils": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-30.5.0.tgz", + "integrity": "sha512-R5oC9ka68X7NwafM5rFvIv6q0qT2kMsBkRikdEygx7cmGkV4dy7uM5HuOBUuIoLW7Md2o3QfkD3dnk6OdzuuJw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@ckeditor/ckeditor5-dev-webpack-plugin": "^30.5.0", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.6.1", + "cssnano": "^5.0.0", + "del": "^5.0.0", + "escodegen": "^1.9.0", + "fs-extra": "^8.1.0", + "is-interactive": "^1.0.0", + "javascript-stringify": "^1.6.0", + "pofile": "^1.0.9", + "postcss": "^8.4.12", + "postcss-import": "^14.1.0", + "postcss-loader": "^4.3.0", + "postcss-mixins": "^9.0.2", + "postcss-nesting": "^10.1.4", + "raw-loader": "^4.0.1", + "shelljs": "^0.8.1", + "style-loader": "^2.0.0", + "terser-webpack-plugin": "^4.2.3", + "through2": "^3.0.1", + "ts-loader": "^9.3.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "peerDependencies": { + "webpack": "^4.43.0 || ^5.24.0" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-utils/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-utils/node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-utils/node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-utils/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-webpack-plugin": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-webpack-plugin/-/ckeditor5-dev-webpack-plugin-30.5.0.tgz", + "integrity": "sha512-mErNKfGd8XBjJxB7K7yCDnNq4pLQKbEjwJHf9g2EW4gOD1U55rgPc1XpmgfxhMj44QQ8YOZXAQ/Y/55AN7GATA==", + "deprecated": "This package is no longer maintained. Please, read the migration path: https://github.com/ckeditor/ckeditor5-dev/releases/tag/v32.0.0.", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-dev-utils": "^30.5.0", + "chalk": "^4.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "webpack-sources": "^2.0.1" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "peerDependencies": { + "webpack": "^4.43.0 || ^5.24.0" + } + }, + "node_modules/@ckeditor/ckeditor5-dev-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ckeditor/ckeditor5-engine": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-39.0.1.tgz", + "integrity": "sha512-QWyx1vO7+UO3rVIx9o1M7q05ghu1T+E4ugnzlcjLx+TiRLBH280M5RmxZ5gE8HjTSIabGDK1M0kmskL+wl2nDw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-enter": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-34.2.0.tgz", + "integrity": "sha512-QxaT3jH0qsZaE0Egj1D19o6YBz/EJKs0am5ny5hDnd5sntvIUk9PNGEu/v3mRmNqZqrhRu4BuedvdRzYWseUjw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-enter/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-enter/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-enter/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-enter/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-39.0.1.tgz", + "integrity": "sha512-P9ZO7JihRhVUKyvE0rcBjEwlN4ZKFpBCeWimL5yM05L047FNb5yXQecmQfMDDpgYQl3Ggsm07QuWo/uG/0j/mQ==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-ui": "39.0.1", + "ckeditor5": "39.0.1", + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-clipboard": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-39.0.1.tgz", + "integrity": "sha512-OIlIvsiz6YTZM8o1Y1zG9eW9rUx06Bs3rMbMv37kNN1vq145D9h0OQt0iPKw1eXAG387Sk+SWZhO+Um+/O3eGw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "@ckeditor/ckeditor5-widget": "39.0.1", + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-enter": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-39.0.1.tgz", + "integrity": "sha512-4gF0CFbEgZowQGmcyKP9KKBKOk67bdQIP5y71QvDgP6rUdbOQ5NDAS3FKis6a2Aubhtg92BO4QC6tZADPiW3hA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-paragraph": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-39.0.1.tgz", + "integrity": "sha512-zKYtpka2X8uR6bTiCXecwl86XKQ8ngk7Hm3UkmptDSfBDOp9PpFCeA3i8m1soFvT2OcdxQYbuAcd9TwoV/HY0g==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-select-all": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-39.0.1.tgz", + "integrity": "sha512-Q4BwezfYmZEwODecoxXc2+2UNUkx/Gu5n7jZH/2kKNBVFwb3iVIun9tj5Q1+093FKjmLA46maYsG5HIG6eArTg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-typing": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-39.0.1.tgz", + "integrity": "sha512-bfMGH3IKj8LdhzfMpfOFUlnCPkpGQhl1HN2oF2g7EViOfuDKM4A2GboUIEqRP2C3tkwtHK5zM55Rdbd71DAQPQ==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-undo": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-39.0.1.tgz", + "integrity": "sha512-fgI5zNylzuiT2EitHm9ZVaAXB27JxOmONe51tSe9aUQoUkFLHau0HJfTNpKgHQTEPXMxhUPzH09xvj7QEc94Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-upload": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-39.0.1.tgz", + "integrity": "sha512-VVVWErIHRnw5kw00t8OYLxHDgSE1ywtoy/Zih0GJVxe882jIfajPj7KdZUjylfZuPeQnp1kAIpoe+WX3scvxFQ==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-widget": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-39.0.1.tgz", + "integrity": "sha512-rd4ojJcdZQJttrrDogycDa+sb/rtKu9sU7G0+QEoJZXD25WjxIEgjyOoIqfv2UZZrZDX/0u8dviGhPbcbQEEnw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-enter": "39.0.1", + "@ckeditor/ckeditor5-typing": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link/node_modules/ckeditor5": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-39.0.1.tgz", + "integrity": "sha512-KU6P0U9HQdsj7YBNZyG72ii+LNjIuWqxwdhlcd+QN11urQSDzoC6OjnqtDZ2Q3dQvwYf2aN9kDwUA9ElQ1krIg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "39.0.1", + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-enter": "39.0.1", + "@ckeditor/ckeditor5-paragraph": "39.0.1", + "@ckeditor/ckeditor5-select-all": "39.0.1", + "@ckeditor/ckeditor5-typing": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-undo": "39.0.1", + "@ckeditor/ckeditor5-upload": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "@ckeditor/ckeditor5-watchdog": "39.0.1", + "@ckeditor/ckeditor5-widget": "39.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-34.2.0.tgz", + "integrity": "sha512-xcXUsXz3PY355gJ8u+y0qFLWcScYo0CZPZSbs5YwDz7g9lV8foVVzzdW7ITYwr5/YIpJsjjxYC+dDUqsH6EpBQ==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-34.2.0.tgz", + "integrity": "sha512-/Va85RwNlmpgQ7vWxiAFLyzXhXrWiA5Pde7yCNcc6hJpqnaGcqvscOJoZLMk5oASTvMnPhQIgNSMDN/oq6ej0Q==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-typing": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-34.2.0.tgz", + "integrity": "sha512-Eq8mhb8M7RwUmeVUantN+PrqxDELXCvLCcpixy+ge/5lM8wxVcn/SonfUL9PLqs2eluRc4Bx+mstMQySglkVkw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-typing/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-typing/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-typing/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-typing/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-ui": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-39.0.1.tgz", + "integrity": "sha512-6mBZNfMVSjyNb3HHyjJFwrR2rvmTuH1JSc+ebuulw5knYQmDaeCaS4tiYmOVcGGz/WcrAYRQAtSGrfZmuLesMQ==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "color-convert": "2.0.1", + "color-parse": "1.4.2", + "lodash-es": "4.17.21", + "vanilla-colorful": "0.7.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-undo": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-34.2.0.tgz", + "integrity": "sha512-WW3f6ku36DpKhUxXACfNFm2DaKcJ2Rz0EFEkol0+offpOjltJnUEJ7LvfOthGdMvGz+5lmnySTbkvOvNruq1Ew==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-undo/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-undo/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-undo/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-undo/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-34.2.0.tgz", + "integrity": "sha512-HBJr0/wFE+R13aIXRF/xJVQqo6Yh34EgbnrNYYhlNiHG40Vr6079eCuoZrnY3vwEsjtFNnTRQ433+RqxJ652zw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-utils": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-39.0.1.tgz", + "integrity": "sha512-lQ+1h4FgUScEdk547uCzfdvajFigVt4u0mRw1m9TtJ3B2GiatwRvst8TZEuWl8aFrIHjQ/gho66QIElJi/6+CA==", + "dev": true, + "dependencies": { + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-watchdog": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-39.0.1.tgz", + "integrity": "sha512-f5Uo0RdcbeKGs0gmBm8Y8c+Z9YgcjqX7ai4vdcw8HIEc0vCeEanPt816V53nLZ3LbPgez8LeWluR7VlzoxKO+g==", + "dev": true, + "dependencies": { + "lodash-es": "4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-widget": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-34.2.0.tgz", + "integrity": "sha512-h2iF/RRK+GjvVHb6VY7+slnIV+IdWdLfZS83OECQNYp2e+6kN/JZp+PxiyYC4asPTraL43zJGzlgT53Jof77vw==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-enter": "^34.2.0", + "@ckeditor/ckeditor5-typing": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-widget/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-widget/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-widget/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@ckeditor/ckeditor5-widget/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ckeditor5": { + "version": "34.1.0", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-34.1.0.tgz", + "integrity": "sha512-bWcmXEx4C7AC+FywiTrhbs63mUc8vwEualSDzyJIZLd5HULLznqJwjeON/icKtzCiBLEeUFoeDHLC5yWAEj8sA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "^34.1.0", + "@ckeditor/ckeditor5-core": "^34.1.0", + "@ckeditor/ckeditor5-engine": "^34.1.0", + "@ckeditor/ckeditor5-enter": "^34.1.0", + "@ckeditor/ckeditor5-paragraph": "^34.1.0", + "@ckeditor/ckeditor5-select-all": "^34.1.0", + "@ckeditor/ckeditor5-typing": "^34.1.0", + "@ckeditor/ckeditor5-ui": "^34.1.0", + "@ckeditor/ckeditor5-undo": "^34.1.0", + "@ckeditor/ckeditor5-upload": "^34.1.0", + "@ckeditor/ckeditor5-utils": "^34.1.0", + "@ckeditor/ckeditor5-widget": "^34.1.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/ckeditor5/node_modules/@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/ckeditor5/node_modules/@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/ckeditor5/node_modules/@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "dependencies": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/ckeditor5/node_modules/@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.15" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-parse": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz", + "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "dependencies": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.499", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz", + "integrity": "sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-mixins": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-9.0.4.tgz", + "integrity": "sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "postcss-js": "^4.0.0", + "postcss-simple-vars": "^7.0.0", + "sugarss": "^4.0.1" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-simple-vars": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz", + "integrity": "sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==", + "dev": true, + "engines": { + "node": ">=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.1" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sugarss": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", + "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vanilla-colorful": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz", + "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "requires": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@ckeditor/ckeditor5-clipboard": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-34.2.0.tgz", + "integrity": "sha512-OcdFj9yT7C5yKPHtTKWvjGMJLpigrkdJN4AZhdJJPigiuYG0c5mnCuTvOYxp2kVijFWRjhPlwIyPVTtDZ0vnzw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "@ckeditor/ckeditor5-widget": "^34.2.0", + "lodash-es": "^4.17.11" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-core": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-39.0.1.tgz", + "integrity": "sha512-3hva3sRdDS2TLDhQNKgnJmpdXhuaod5tooDI/vnaiK+kduqy3nPuWI0qHtFpMhe7dlQWPZSI9ZhS/7cfFQ4CUg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + } + }, + "@ckeditor/ckeditor5-dev-utils": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-30.5.0.tgz", + "integrity": "sha512-R5oC9ka68X7NwafM5rFvIv6q0qT2kMsBkRikdEygx7cmGkV4dy7uM5HuOBUuIoLW7Md2o3QfkD3dnk6OdzuuJw==", + "dev": true, + "requires": { + "@babel/parser": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@ckeditor/ckeditor5-dev-webpack-plugin": "^30.5.0", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.6.1", + "cssnano": "^5.0.0", + "del": "^5.0.0", + "escodegen": "^1.9.0", + "fs-extra": "^8.1.0", + "is-interactive": "^1.0.0", + "javascript-stringify": "^1.6.0", + "pofile": "^1.0.9", + "postcss": "^8.4.12", + "postcss-import": "^14.1.0", + "postcss-loader": "^4.3.0", + "postcss-mixins": "^9.0.2", + "postcss-nesting": "^10.1.4", + "raw-loader": "^4.0.1", + "shelljs": "^0.8.1", + "style-loader": "^2.0.0", + "terser-webpack-plugin": "^4.2.3", + "through2": "^3.0.1", + "ts-loader": "^9.3.0" + }, + "dependencies": { + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "@ckeditor/ckeditor5-dev-webpack-plugin": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-webpack-plugin/-/ckeditor5-dev-webpack-plugin-30.5.0.tgz", + "integrity": "sha512-mErNKfGd8XBjJxB7K7yCDnNq4pLQKbEjwJHf9g2EW4gOD1U55rgPc1XpmgfxhMj44QQ8YOZXAQ/Y/55AN7GATA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-dev-utils": "^30.5.0", + "chalk": "^4.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "webpack-sources": "^2.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-39.0.1.tgz", + "integrity": "sha512-QWyx1vO7+UO3rVIx9o1M7q05ghu1T+E4ugnzlcjLx+TiRLBH280M5RmxZ5gE8HjTSIabGDK1M0kmskL+wl2nDw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + } + }, + "@ckeditor/ckeditor5-enter": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-34.2.0.tgz", + "integrity": "sha512-QxaT3jH0qsZaE0Egj1D19o6YBz/EJKs0am5ny5hDnd5sntvIUk9PNGEu/v3mRmNqZqrhRu4BuedvdRzYWseUjw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-link": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-39.0.1.tgz", + "integrity": "sha512-P9ZO7JihRhVUKyvE0rcBjEwlN4ZKFpBCeWimL5yM05L047FNb5yXQecmQfMDDpgYQl3Ggsm07QuWo/uG/0j/mQ==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-ui": "39.0.1", + "ckeditor5": "39.0.1", + "lodash-es": "4.17.21" + }, + "dependencies": { + "@ckeditor/ckeditor5-clipboard": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-39.0.1.tgz", + "integrity": "sha512-OIlIvsiz6YTZM8o1Y1zG9eW9rUx06Bs3rMbMv37kNN1vq145D9h0OQt0iPKw1eXAG387Sk+SWZhO+Um+/O3eGw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "@ckeditor/ckeditor5-widget": "39.0.1", + "lodash-es": "4.17.21" + } + }, + "@ckeditor/ckeditor5-enter": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-39.0.1.tgz", + "integrity": "sha512-4gF0CFbEgZowQGmcyKP9KKBKOk67bdQIP5y71QvDgP6rUdbOQ5NDAS3FKis6a2Aubhtg92BO4QC6tZADPiW3hA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + } + }, + "@ckeditor/ckeditor5-paragraph": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-39.0.1.tgz", + "integrity": "sha512-zKYtpka2X8uR6bTiCXecwl86XKQ8ngk7Hm3UkmptDSfBDOp9PpFCeA3i8m1soFvT2OcdxQYbuAcd9TwoV/HY0g==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + } + }, + "@ckeditor/ckeditor5-select-all": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-39.0.1.tgz", + "integrity": "sha512-Q4BwezfYmZEwODecoxXc2+2UNUkx/Gu5n7jZH/2kKNBVFwb3iVIun9tj5Q1+093FKjmLA46maYsG5HIG6eArTg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + } + }, + "@ckeditor/ckeditor5-typing": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-39.0.1.tgz", + "integrity": "sha512-bfMGH3IKj8LdhzfMpfOFUlnCPkpGQhl1HN2oF2g7EViOfuDKM4A2GboUIEqRP2C3tkwtHK5zM55Rdbd71DAQPQ==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + } + }, + "@ckeditor/ckeditor5-undo": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-39.0.1.tgz", + "integrity": "sha512-fgI5zNylzuiT2EitHm9ZVaAXB27JxOmONe51tSe9aUQoUkFLHau0HJfTNpKgHQTEPXMxhUPzH09xvj7QEc94Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1" + } + }, + "@ckeditor/ckeditor5-upload": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-39.0.1.tgz", + "integrity": "sha512-VVVWErIHRnw5kw00t8OYLxHDgSE1ywtoy/Zih0GJVxe882jIfajPj7KdZUjylfZuPeQnp1kAIpoe+WX3scvxFQ==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1" + } + }, + "@ckeditor/ckeditor5-widget": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-39.0.1.tgz", + "integrity": "sha512-rd4ojJcdZQJttrrDogycDa+sb/rtKu9sU7G0+QEoJZXD25WjxIEgjyOoIqfv2UZZrZDX/0u8dviGhPbcbQEEnw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-enter": "39.0.1", + "@ckeditor/ckeditor5-typing": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "lodash-es": "4.17.21" + } + }, + "ckeditor5": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-39.0.1.tgz", + "integrity": "sha512-KU6P0U9HQdsj7YBNZyG72ii+LNjIuWqxwdhlcd+QN11urQSDzoC6OjnqtDZ2Q3dQvwYf2aN9kDwUA9ElQ1krIg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-clipboard": "39.0.1", + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-engine": "39.0.1", + "@ckeditor/ckeditor5-enter": "39.0.1", + "@ckeditor/ckeditor5-paragraph": "39.0.1", + "@ckeditor/ckeditor5-select-all": "39.0.1", + "@ckeditor/ckeditor5-typing": "39.0.1", + "@ckeditor/ckeditor5-ui": "39.0.1", + "@ckeditor/ckeditor5-undo": "39.0.1", + "@ckeditor/ckeditor5-upload": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "@ckeditor/ckeditor5-watchdog": "39.0.1", + "@ckeditor/ckeditor5-widget": "39.0.1" + } + } + } + }, + "@ckeditor/ckeditor5-paragraph": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-34.2.0.tgz", + "integrity": "sha512-xcXUsXz3PY355gJ8u+y0qFLWcScYo0CZPZSbs5YwDz7g9lV8foVVzzdW7ITYwr5/YIpJsjjxYC+dDUqsH6EpBQ==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-select-all": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-34.2.0.tgz", + "integrity": "sha512-/Va85RwNlmpgQ7vWxiAFLyzXhXrWiA5Pde7yCNcc6hJpqnaGcqvscOJoZLMk5oASTvMnPhQIgNSMDN/oq6ej0Q==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-typing": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-34.2.0.tgz", + "integrity": "sha512-Eq8mhb8M7RwUmeVUantN+PrqxDELXCvLCcpixy+ge/5lM8wxVcn/SonfUL9PLqs2eluRc4Bx+mstMQySglkVkw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-39.0.1.tgz", + "integrity": "sha512-6mBZNfMVSjyNb3HHyjJFwrR2rvmTuH1JSc+ebuulw5knYQmDaeCaS4tiYmOVcGGz/WcrAYRQAtSGrfZmuLesMQ==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "39.0.1", + "@ckeditor/ckeditor5-utils": "39.0.1", + "color-convert": "2.0.1", + "color-parse": "1.4.2", + "lodash-es": "4.17.21", + "vanilla-colorful": "0.7.2" + } + }, + "@ckeditor/ckeditor5-undo": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-34.2.0.tgz", + "integrity": "sha512-WW3f6ku36DpKhUxXACfNFm2DaKcJ2Rz0EFEkol0+offpOjltJnUEJ7LvfOthGdMvGz+5lmnySTbkvOvNruq1Ew==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-upload": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-34.2.0.tgz", + "integrity": "sha512-HBJr0/wFE+R13aIXRF/xJVQqo6Yh34EgbnrNYYhlNiHG40Vr6079eCuoZrnY3vwEsjtFNnTRQ433+RqxJ652zw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-39.0.1.tgz", + "integrity": "sha512-lQ+1h4FgUScEdk547uCzfdvajFigVt4u0mRw1m9TtJ3B2GiatwRvst8TZEuWl8aFrIHjQ/gho66QIElJi/6+CA==", + "dev": true, + "requires": { + "lodash-es": "4.17.21" + } + }, + "@ckeditor/ckeditor5-watchdog": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-39.0.1.tgz", + "integrity": "sha512-f5Uo0RdcbeKGs0gmBm8Y8c+Z9YgcjqX7ai4vdcw8HIEc0vCeEanPt816V53nLZ3LbPgez8LeWluR7VlzoxKO+g==", + "dev": true, + "requires": { + "lodash-es": "4.17.21" + } + }, + "@ckeditor/ckeditor5-widget": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-34.2.0.tgz", + "integrity": "sha512-h2iF/RRK+GjvVHb6VY7+slnIV+IdWdLfZS83OECQNYp2e+6kN/JZp+PxiyYC4asPTraL43zJGzlgT53Jof77vw==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-enter": "^34.2.0", + "@ckeditor/ckeditor5-typing": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "dev": true, + "requires": {} + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/node": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ckeditor5": { + "version": "34.1.0", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-34.1.0.tgz", + "integrity": "sha512-bWcmXEx4C7AC+FywiTrhbs63mUc8vwEualSDzyJIZLd5HULLznqJwjeON/icKtzCiBLEeUFoeDHLC5yWAEj8sA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-clipboard": "^34.1.0", + "@ckeditor/ckeditor5-core": "^34.1.0", + "@ckeditor/ckeditor5-engine": "^34.1.0", + "@ckeditor/ckeditor5-enter": "^34.1.0", + "@ckeditor/ckeditor5-paragraph": "^34.1.0", + "@ckeditor/ckeditor5-select-all": "^34.1.0", + "@ckeditor/ckeditor5-typing": "^34.1.0", + "@ckeditor/ckeditor5-ui": "^34.1.0", + "@ckeditor/ckeditor5-undo": "^34.1.0", + "@ckeditor/ckeditor5-upload": "^34.1.0", + "@ckeditor/ckeditor5-utils": "^34.1.0", + "@ckeditor/ckeditor5-widget": "^34.1.0" + }, + "dependencies": { + "@ckeditor/ckeditor5-core": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-34.2.0.tgz", + "integrity": "sha512-6K0aToibRt28sCVYpMqdSKGvMifjwziqxLxyEh38CyDZJBUf7QPEAPlEpKAFTisHNEmC4471tr8UPpvNgqUXGA==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-engine": "^34.2.0", + "@ckeditor/ckeditor5-ui": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-34.2.0.tgz", + "integrity": "sha512-9/i6TZ+Sy5T6hnuCtmeLTfwLSY8LaS7qFkW6gsM9NEB+LSSu930GP0Ss30Nw6dYo/JmYiQEpkiRJzKYIjrH8Pg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-34.2.0.tgz", + "integrity": "sha512-XL561G/e3b1YLGHNjLxS9IgoVn4BSugHmidEXYNUTMLATRCKld1XMUKFsB/wm3DwLBUfWn4d2j3qdcO2CnDuBg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^34.2.0", + "@ckeditor/ckeditor5-utils": "^34.2.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-34.2.0.tgz", + "integrity": "sha512-jHJV2S8DzmpVvd3jdercY6HsGRAwpm/MK79Rs/Mrc3NNYKzN9SVFs/NLbrELNoMZeJ1WKt5BwKgBY+PEOpfyLw==", + "dev": true, + "requires": { + "lodash-es": "^4.17.15" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-parse": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz", + "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, + "requires": {} + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "electron-to-chromium": { + "version": "1.4.499", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz", + "integrity": "sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true + }, + "postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "requires": {} + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + } + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-mixins": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-9.0.4.tgz", + "integrity": "sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "postcss-js": "^4.0.0", + "postcss-simple-vars": "^7.0.0", + "sugarss": "^4.0.1" + } + }, + "postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-simple-vars": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz", + "integrity": "sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==", + "dev": true, + "requires": {} + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "sugarss": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", + "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", + "dev": true, + "requires": {} + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + } + } + }, + "terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-loader": { + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "peer": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vanilla-colorful": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz", + "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==", + "dev": true + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + } + } + }, + "webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/package.json b/drupal/modules/avoindata-ckeditor5-plugins/package.json new file mode 100644 index 0000000000..3b1ae22b2c --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/package.json @@ -0,0 +1,22 @@ +{ + "name": "drupal-ckeditor5", + "version": "1.0.0", + "description": "Drupal CKEditor 5 integration", + "author": "", + "license": "GPL-2.0-or-later", + "scripts": { + "watch": "webpack --mode development --watch", + "build": "webpack" + }, + "devDependencies": { + "@ckeditor/ckeditor5-dev-utils": "^30.0.0", + "ckeditor5": "~34.1.0", + "file-loader": "^6.2.0", + "raw-loader": "^4.0.2", + "terser-webpack-plugin": "^5.2.0", + "webpack": "^5.51.1", + "webpack-cli": "^4.4.0" + }, + "dependencies": { + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js new file mode 100644 index 0000000000..7a4846aba6 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js @@ -0,0 +1,23 @@ +/** + * @file This is what CKEditor refers to as a master (glue) plugin. Its role is + * just to load the “editing” and “UI” components of this Plugin. Those + * components could be included in this file, but + * + * I.e, this file's purpose is to integrate all the separate parts of the plugin + * before it's made discoverable via index.js. + */ + +// The contents of AvoindataExpanderUI and AvoindataExpanderEditing could be included in this +// file, but it is recommended to separate these concerns in different files. +import AvoindataExpanderEditing from './avoindataExpanderEditing'; +import AvoindataExpanderUI from './avoindataExpanderUI'; +import { Plugin } from 'ckeditor5/src/core'; + +export default class AvoindataExpander extends Plugin { + // Note that ExpanderEditing and ExpanderUI also extend `Plugin`, but these + // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only + // discover the plugins explicitly exported in index.js. + static get requires() { + return [AvoindataExpanderEditing, AvoindataExpanderUI]; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js new file mode 100644 index 0000000000..d47aeb3e74 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js @@ -0,0 +1,217 @@ +import { Plugin } from 'ckeditor5/src/core'; +import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; +import { Widget } from 'ckeditor5/src/widget'; +import InsertAvoindataExpanderCommand from './insertAvoindataExpanderCommand'; + +/** + * CKEditor 5 plugins do not work directly with the DOM. They are defined as + * plugin-specific data models that are then converted to markup that + * is inserted in the DOM. + * + * CKEditor 5 internally interacts with expander as this model: + * + * + * + * + * + * Which is converted for the browser/user as this markup + *

+
+
Title
+ +
+
Content
+
+ * + * This file has the logic for defining the avoindataExpander model, and for how it is + * converted to standard DOM markup. + */ +export default class AvoindataExpanderEditing extends Plugin { + static get requires() { + return [Widget]; + } + + init() { + this._defineSchema(); + this._defineConverters(); + this.editor.commands.add( + 'insertAvoindataExpanderCommand', + new InsertAvoindataExpanderCommand(this.editor), + ); + } + + /* + * This registers the structure that will be seen by CKEditor 5 as + * + * + * + * + * + * The logic in _defineConverters() will determine how this is converted to + * markup. + */ + _defineSchema() { + // Schemas are registered via the central `editor` object. + const schema = this.editor.model.schema; + + schema.register('avoindataExpander', { + // Behaves like a self-contained object (e.g. an image). + isObject: true, + // Allow in places where other blocks are allowed (e.g. directly in the root). + allowWhere: '$block', + }); + + schema.register('avoindataExpanderTitle', { + // This creates a boundary for external actions such as clicking and + // and keypress. For example, when the cursor is inside this box, the + // keyboard shortcut for "select all" will be limited to the contents of + // the box. + isLimit: true, + // This is only to be used within simpleBox. + allowIn: 'avoindataExpander', + // Allow content that is allowed in blocks (e.g. text with attributes). + allowContentOf: '$root', + }); + + schema.register('avoindataExpanderContent', { + isLimit: true, + allowIn: 'avoindataExpander', + allowContentOf: '$root', + }); + + schema.addChildCheck((context, childDefinition) => { + // Disallow avoindataExpander inside avoindataExpanderContent. + if ( + (context.endsWith('avoindataExpanderContent') || context.endsWith('avoindataExpanderTitle')) && + childDefinition.name === 'avoindataExpander' + ) { + return false; + } + }); + } + + /** + * Converters determine how CKEditor 5 models are converted into markup and + * vice-versa. + */ + _defineConverters() { + // Converters are registered via the central editor object. + const { conversion } = this.editor; + + // Upcast Converters: determine how existing HTML is interpreted by the + // editor. These trigger when an editor instance loads. + // + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model. + conversion.for('upcast').elementToElement({ + model: 'avoindataExpander', + view: { + name: 'div', + classes: 'avoindata-expander', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of , + // as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataExpanderTitle', + view: { + name: 'div', + classes: 'avoindata-expander-title', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of + // , as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataExpanderContent', + view: { + name: 'div', + classes: 'avoindata-expander-content', + }, + }); + + // Data Downcast Converters: converts stored model data into HTML. + // These trigger when content is saved. + // + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataExpander', + view: { + name: 'div', + classes: 'avoindata-expander', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToStructure({ + model: 'avoindataExpanderTitle', + view: (modelElement, { writer }) => { + return writer.createContainerElement('div', { class: 'avoindata-expander-header' }, [ + writer.createContainerElement('div', { class: 'avoindata-expander-title' }, [ + writer.createSlot() + ]), + writer.createContainerElement('span', { class: 'icon-wrapper pull-right' }, [ + writer.createEmptyElement('i', { class: 'fas fa-angle-down' }) + ]) + ]) + } + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataExpanderContent', + view: { + name: 'div', + classes: 'avoindata-expander-content', + }, + }); + + // Editing Downcast Converters. These render the content to the user for + // editing, i.e. this determines what gets seen in the editor. These trigger + // after the Data Upcast Converters, and are re-triggered any time there + // are changes to any of the models' properties. + // + // Convert the model into a container widget in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataExpander', + view: (modelElement, { writer: viewWriter }) => { + const section = viewWriter.createContainerElement('div', { + class: 'avoindata-expander', + }); + + return toWidget(section, viewWriter, { label: 'Avoindata Expander widget' }); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataExpanderTitle', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-expander-title', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataExpanderContent', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-expander-content', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js new file mode 100644 index 0000000000..fdd778d37a --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js @@ -0,0 +1,36 @@ +/** + * @file registers the avoindataExpander toolbar button and binds functionality to it. + */ + +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import icon from '../../icons/icon-expander.svg?source'; + +export default class AvoindataExpanderUI extends Plugin { + init() { + const editor = this.editor; + + // This will register the avoindataExpander toolbar button. + editor.ui.componentFactory.add('avoindataExpander', (locale) => { + const command = editor.commands.get('insertAvoindataExpanderCommand'); + const buttonView = new ButtonView(locale); + + // Create the toolbar button. + buttonView.set({ + label: editor.t('Avoindata Expander widget'), + icon, + tooltip: true, + }); + + // Bind the state of the button to the command. + buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + + // Execute the command when the button is clicked (executed). + this.listenTo(buttonView, 'execute', () => + editor.execute('insertAvoindataExpanderCommand'), + ); + + return buttonView; + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/index.js new file mode 100644 index 0000000000..33139fa089 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import AvoindataExpander from './avoindataExpander'; + +export default { + AvoindataExpander, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js new file mode 100644 index 0000000000..44e7656db6 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js @@ -0,0 +1,56 @@ +/** + * @file defines InsertAvoindataExpanderCommand, which is executed when the avoindataExpander + * toolbar button is pressed. + */ + +import { Command } from 'ckeditor5/src/core'; + +export default class InsertAvoindataExpanderCommand extends Command { + execute() { + const { model } = this.editor; + + model.change((writer) => { + // Insert * at the current selection position + // in a way that will result in creating a valid model structure. + model.insertContent(createAvoindataExpander(writer)); + }); + } + + refresh() { + const { model } = this.editor; + const { selection } = model.document; + + // Determine if the cursor (selection) is in a position where adding a + // avoindataExpander is permitted. This is based on the schema of the model(s) + // currently containing the cursor. + const allowedIn = model.schema.findAllowedParent( + selection.getFirstPosition(), + 'avoindataExpander', + ); + + // If the cursor is not in a location where a avoindataExpander can be added, return + // null so the addition doesn't happen. + this.isEnabled = allowedIn !== null; + } +} + +function createAvoindataExpander(writer) { + // Create instances of the three elements registered with the editor in + // avoindataexpanderediting.js. + const avoindataExpander = writer.createElement('avoindataExpander'); + const avoindataExpanderTitle = writer.createElement('avoindataExpanderTitle'); + const avoindataExpanderContent = writer.createElement('avoindataExpanderContent'); + + // Append the title and content elements to the avoindataExpander, which matches + // the parent/child relationship as defined in their schemas. + writer.append(avoindataExpanderTitle, avoindataExpander); + writer.append(avoindataExpanderContent, avoindataExpander); + + // The text content will automatically be wrapped in a + // `

`. + writer.appendElement('paragraph', avoindataExpanderTitle); + writer.appendElement('paragraph', avoindataExpanderContent); + + // Return the element to be added to the editor. + return avoindataExpander; +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js new file mode 100644 index 0000000000..95e443a6a1 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js @@ -0,0 +1,23 @@ +/** + * @file This is what CKEditor refers to as a master (glue) plugin. Its role is + * just to load the “editing” and “UI” components of this Plugin. Those + * components could be included in this file, but + * + * I.e, this file's purpose is to integrate all the separate parts of the plugin + * before it's made discoverable via index.js. + */ + +// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this +// file, but it is recommended to separate these concerns in different files. +import AvoindataHintEditing from './avoindataHintEditing'; +import AvoindataHintUI from './avoindataHintUI'; +import { Plugin } from 'ckeditor5/src/core'; + +export default class AvoindataHint extends Plugin { + // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these + // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only + // discover the plugins explicitly exported in index.js. + static get requires() { + return [AvoindataHintEditing, AvoindataHintUI]; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js new file mode 100644 index 0000000000..8b1c581748 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js @@ -0,0 +1,294 @@ +import { Plugin } from 'ckeditor5/src/core'; +import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; +import { Widget } from 'ckeditor5/src/widget'; +import InsertAvoindataHintCommand from './insertAvoindataHintCommand'; + +/** + * CKEditor 5 plugins do not work directly with the DOM. They are defined as + * plugin-specific data models that are then converted to markup that + * is inserted in the DOM. + * + * CKEditor 5 internally interacts with expander as this model: + * + * + * + * + * + * + * + * + * Which is converted for the browser/user as this markup + *

+ *
+ * + *
Title
+ *
+ *
Content
+ *
+ * + * This file has the logic for defining the avoindataHint model, and for how it is + * converted to standard DOM markup. + */ +export default class AvoindataHintEditing extends Plugin { + static get requires() { + return [Widget]; + } + + init() { + this._defineSchema(); + this._defineConverters(); + this.editor.commands.add( + 'insertAvoindataHintCommand', + new InsertAvoindataHintCommand(this.editor), + ); + } + + /* + * This registers the structure that will be seen by CKEditor 5 as + * + * + * + * + * + * + * + * + * The logic in _defineConverters() will determine how this is converted to + * markup. + */ + _defineSchema() { + // Schemas are registered via the central `editor` object. + const schema = this.editor.model.schema; + + schema.register('avoindataHint', { + // Behaves like a self-contained object (e.g. an image). + isObject: true, + // Allow in places where other blocks are allowed (e.g. directly in the root). + allowWhere: '$block', + }); + + schema.register('avoindataHintHeader', { + // This is only to be used within avoindataHint. + isObject: true, + isSelectable: false, + allowIn: 'avoindataHint', + allowChildren: ['avoindataHintIcon', 'avoindataHintTitle'] + }); + + schema.register('avoindataHintIcon', { + isObject: true, + isContent: true, + isInline: true, + isBlock: false, + isSelectable: false, + isLimit: false, + // This is only to be used within avoindataHint. + allowIn: 'avoindataHintHeader', + allowAttributes: ['src', 'alt', 'class'] + }); + + schema.register('avoindataHintTitle', { + // This creates a boundary for external actions such as clicking and + // and keypress. For example, when the cursor is inside this box, the + // keyboard shortcut for "select all" will be limited to the contents of + // the box. + isLimit: true, + // This is only to be used within avoindataHint. + allowIn: 'avoindataHintHeader', + // Allow content that is allowed in blocks (e.g. text with attributes). + allowContentOf: '$root', + }); + + schema.register('avoindataHintContent', { + isLimit: true, + allowIn: 'avoindataHint', + allowContentOf: '$root', + }); + + schema.addChildCheck((context, childDefinition) => { + // Disallow avoindataHint inside avoindataHintContent. + if ( + (context.endsWith('avoindataHintContent') || context.endsWith('avoindataHintTitle')) && + childDefinition.name === 'avoindataHint' + ) { + return false; + } + }); + } + + /** + * Converters determine how CKEditor 5 models are converted into markup and + * vice-versa. + */ + _defineConverters() { + // Converters are registered via the central editor object. + const { conversion } = this.editor; + + // Upcast Converters: determine how existing HTML is interpreted by the + // editor. These trigger when an editor instance loads. + // + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model. + conversion.for('upcast').elementToElement({ + model: 'avoindataHint', + view: { + name: 'div', + classes: 'avoindata-hint', + }, + }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataHintHeader', + view: { + name: 'div', + classes: 'avoindata-hint-header', + }, + }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataHintIcon', + view: { + name: 'img', + classes: 'avoindata-hint-icon', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of , + // as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataHintTitle', + view: { + name: 'div', + classes: 'avoindata-hint-title', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of + // , as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataHintContent', + view: { + name: 'div', + classes: 'avoindata-hint-content', + }, + }); + + // Data Downcast Converters: converts stored model data into HTML. + // These trigger when content is saved. + // + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataHint', + view: { + name: 'div', + classes: 'avoindata-hint', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataHintHeader', + view: { + name: 'div', + classes: 'avoindata-hint-header', + }, + }); + + // Instances of are saved as + // Avoindata Hint icon
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataHintIcon', + view: (modelElement, { writer }) => { + return writer.createUIElement('img', { class: "avoindata-hint-icon", src: '/themes/avoindata/images/avoindata-hint-icon.svg' }) + } + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataHintTitle', + view: { + name: 'div', + classes: 'avoindata-hint-title', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataHintContent', + view: { + name: 'div', + classes: 'avoindata-hint-content', + }, + }); + + // Editing Downcast Converters. These render the content to the user for + // editing, i.e. this determines what gets seen in the editor. These trigger + // after the Data Upcast Converters, and are re-triggered any time there + // are changes to any of the models' properties. + // + // Convert the model into a container widget in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataHint', + view: (modelElement, { writer: viewWriter }) => { + const section = viewWriter.createContainerElement('div', { + class: 'avoindata-hint', + }); + + return toWidget(section, viewWriter, { label: 'Avoindata Hint widget' }); + }, + }); + + // Convert the model into a container element in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataHintHeader', + view: (modelElement, { writer: viewWriter }) => { + return viewWriter.createContainerElement('div', { + class: 'avoindata-hint-header', + }); + }, + }); + + // Convert the model into an UI element in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataHintIcon', + view: (modelElement, { writer: viewWriter }) => { + return viewWriter.createUIElement('img', { + class: 'avoindata-hint-icon', + src: "/themes/avoindata/images/avoindata-hint-icon.svg", + alt: "Avoindata Hint icon", + }); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataHintTitle', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-hint-title', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataHintContent', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-hint-content', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js new file mode 100644 index 0000000000..149164848f --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js @@ -0,0 +1,36 @@ +/** + * @file registers the avoindataHint toolbar button and binds functionality to it. + */ + +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import icon from '../../icons/icon-info.svg?source'; + +export default class AvoindataHintUI extends Plugin { + init() { + const editor = this.editor; + + // This will register the avoindataHint toolbar button. + editor.ui.componentFactory.add('avoindataHint', (locale) => { + const command = editor.commands.get('insertAvoindataHintCommand'); + const buttonView = new ButtonView(locale); + + // Create the toolbar button. + buttonView.set({ + label: editor.t('Avoindata Hint widget'), + icon, + tooltip: true, + }); + + // Bind the state of the button to the command. + buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + + // Execute the command when the button is clicked (executed). + this.listenTo(buttonView, 'execute', () => + editor.execute('insertAvoindataHintCommand'), + ); + + return buttonView; + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/index.js new file mode 100644 index 0000000000..d49c10a688 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import AvoindataHint from './avoindataHint'; + +export default { + AvoindataHint, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js new file mode 100644 index 0000000000..c80724ffec --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js @@ -0,0 +1,60 @@ +/** + * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint + * toolbar button is pressed. + */ + +import { Command } from 'ckeditor5/src/core'; + +export default class InsertAvoindataHintCommand extends Command { + execute() { + const { model } = this.editor; + + model.change((writer) => { + // Insert * at the current selection position + // in a way that will result in creating a valid model structure. + model.insertContent(createAvoindataHint(writer)); + }); + } + + refresh() { + const { model } = this.editor; + const { selection } = model.document; + + // Determine if the cursor (selection) is in a position where adding a + // avoindataHint is permitted. This is based on the schema of the model(s) + // currently containing the cursor. + const allowedIn = model.schema.findAllowedParent( + selection.getFirstPosition(), + 'avoindataHint', + ); + + // If the cursor is not in a location where a avoindataHint can be added, return + // null so the addition doesn't happen. + this.isEnabled = allowedIn !== null; + } +} + +function createAvoindataHint(writer) { + // Create instances of the elements registered with the editor in + // avoindataexpanderediting.js. + const avoindataHint = writer.createElement('avoindataHint'); + const avoindataHintHeader = writer.createElement('avoindataHintHeader'); + const avoindataHintIcon = writer.createElement('avoindataHintIcon'); + const avoindataHintTitle = writer.createElement('avoindataHintTitle'); + const avoindataHintContent = writer.createElement('avoindataHintContent'); + + // Append the title and content elements to the avoindataHint, which matches + // the parent/child relationship as defined in their schemas. + writer.append(avoindataHintHeader, avoindataHint); + writer.append(avoindataHintIcon, avoindataHintHeader); + writer.append(avoindataHintTitle, avoindataHintHeader); + writer.append(avoindataHintContent, avoindataHint); + + // The text content will automatically be wrapped in a + // `

`. + writer.appendElement('paragraph', avoindataHintTitle); + writer.appendElement('paragraph', avoindataHintContent); + + // Return the element to be added to the editor. + return avoindataHint; +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js new file mode 100644 index 0000000000..00aee81a4d --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js @@ -0,0 +1,23 @@ +/** + * @file This is what CKEditor refers to as a master (glue) plugin. Its role is + * just to load the “editing” and “UI” components of this Plugin. Those + * components could be included in this file, but + * + * I.e, this file's purpose is to integrate all the separate parts of the plugin + * before it's made discoverable via index.js. + */ + +// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this +// file, but it is recommended to separate these concerns in different files. +import AvoindataNoteEditing from './avoindataNoteEditing'; +import AvoindataNoteUI from './avoindataNoteUI'; +import { Plugin } from 'ckeditor5/src/core'; + +export default class AvoindataNote extends Plugin { + // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these + // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only + // discover the plugins explicitly exported in index.js. + static get requires() { + return [AvoindataNoteEditing, AvoindataNoteUI]; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js new file mode 100644 index 0000000000..8a2c320553 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js @@ -0,0 +1,292 @@ +import { Plugin } from 'ckeditor5/src/core'; +import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; +import { Widget } from 'ckeditor5/src/widget'; +import InsertAvoindataNoteCommand from './insertAvoindataNoteCommand'; +import icon from '../../icons/icon-info.svg'; + + +/** + * CKEditor 5 plugins do not work directly with the DOM. They are defined as + * plugin-specific data models that are then converted to markup that + * is inserted in the DOM. + * + * CKEditor 5 internally interacts with expander as this model: + * + * + * + * + * + * + * + * + * Which is converted for the browser/user as this markup + *

+ *
+ * + *
Title
+ *
+ *
Content
+ *
+ * + * This file has the logic for defining the avoindataNote model, and for how it is + * converted to standard DOM markup. + */ +export default class AvoindataNoteEditing extends Plugin { + static get requires() { + return [Widget]; + } + + init() { + this._defineSchema(); + this._defineConverters(); + this.editor.commands.add( + 'insertAvoindataNoteCommand', + new InsertAvoindataNoteCommand(this.editor), + ); + } + + /* + * This registers the structure that will be seen by CKEditor 5 as + * + * + * + * + * + * + * + * + * The logic in _defineConverters() will determine how this is converted to + * markup. + */ + _defineSchema() { + // Schemas are registered via the central `editor` object. + const schema = this.editor.model.schema; + + schema.register('avoindataNote', { + // Behaves like a self-contained object (e.g. an image). + isObject: true, + // Allow in places where other blocks are allowed (e.g. directly in the root). + allowWhere: '$block', + }); + + schema.register('avoindataNoteHeader', { + // This is only to be used within avoindataNote. + isObject: true, + isSelectable: false, + allowIn: 'avoindataNote', + allowChildren: ['avoindataNoteIcon', 'avoindataNoteTitle'] + }); + + schema.register('avoindataNoteIcon', { + isObject: true, + isContent: true, + isInline: true, + isBlock: false, + isSelectable: false, + isLimit: false, + // This is only to be used within avoindataNote. + allowIn: 'avoindataNoteHeader', + allowAttributes: ['src', 'alt', 'class'] + }); + + schema.register('avoindataNoteTitle', { + // This creates a boundary for external actions such as clicking and + // and keypress. For example, when the cursor is inside this box, the + // keyboard shortcut for "select all" will be limited to the contents of + // the box. + isLimit: true, + // This is only to be used within avoindataNote. + allowIn: 'avoindataNoteHeader', + // Allow content that is allowed in blocks (e.g. text with attributes). + allowContentOf: '$root', + }); + + schema.register('avoindataNoteContent', { + isLimit: true, + allowIn: 'avoindataNote', + allowContentOf: '$root', + }); + + schema.addChildCheck((context, childDefinition) => { + // Disallow avoindataNote inside avoindataNoteContent. + if ( + (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) && + childDefinition.name === 'avoindataNote' + ) { + return false; + } + }); + } + + /** + * Converters determine how CKEditor 5 models are converted into markup and + * vice-versa. + */ + _defineConverters() { + // Converters are registered via the central editor object. + const { conversion } = this.editor; + + // Upcast Converters: determine how existing HTML is interpreted by the + // editor. These trigger when an editor instance loads. + // + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model. + conversion.for('upcast').elementToElement({ + model: 'avoindataNote', + view: { + name: 'div', + classes: 'avoindata-note', + }, + }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataNoteHeader', + view: { + name: 'div', + classes: 'avoindata-note-header', + }, + }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataNoteIcon', + view: { + name: 'img', + classes: 'avoindata-note-icon' + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of , + // as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataNoteTitle', + view: { + name: 'div', + classes: 'avoindata-note-title', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of + // , as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataNoteContent', + view: { + name: 'div', + classes: 'avoindata-note-content', + }, + }); + + // Data Downcast Converters: converts stored model data into HTML. + // These trigger when content is saved. + // + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataNote', + view: { + name: 'div', + classes: 'avoindata-note', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataNoteHeader', + view: { + name: 'div', + classes: 'avoindata-note-header', + }, + }); + + // Instances of are saved as + // Avoindata Note icon
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataNoteIcon', + view: (modelElement, { writer }) => { + return writer.createUIElement('img', { class: 'avoindata-note-icon', src: icon, alt: "Avoindata Note icon" }); + } + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataNoteTitle', + view: { + name: 'div', + classes: 'avoindata-note-title', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataNoteContent', + view: { + name: 'div', + classes: 'avoindata-note-content', + }, + }); + + // Editing Downcast Converters. These render the content to the user for + // editing, i.e. this determines what gets seen in the editor. These trigger + // after the Data Upcast Converters, and are re-triggered any time there + // are changes to any of the models' properties. + // + // Convert the model into a container widget in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataNote', + view: (modelElement, { writer: viewWriter }) => { + const section = viewWriter.createContainerElement('div', { + class: 'avoindata-note', + }); + + return toWidget(section, viewWriter, { label: 'Avoindata Note widget' }); + }, + }); + + // Convert the model into a container element in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataNoteHeader', + view: (modelElement, { writer: viewWriter }) => { + return viewWriter.createContainerElement('div', { + class: 'avoindata-note-header', + }); + }, + }); + + // Convert the model into an UI element in the editor UI. + conversion.for('editingDowncast').elementToStructure({ + model: 'avoindataNoteIcon', + view: (modelElement, { writer }) => { + return writer.createUIElement('img', { class: 'avoindata-note-icon', src: icon, alt: "Avoindata Note icon" }); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataNoteTitle', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-note-title', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataNoteContent', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-note-content', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js new file mode 100644 index 0000000000..910e8a6e21 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js @@ -0,0 +1,36 @@ +/** + * @file registers the avoindataNote toolbar button and binds functionality to it. + */ + +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import icon from '../../icons/icon-info.svg?source'; + +export default class AvoindataNoteUI extends Plugin { + init() { + const editor = this.editor; + + // This will register the avoindataNote toolbar button. + editor.ui.componentFactory.add('avoindataNote', (locale) => { + const command = editor.commands.get('insertAvoindataNoteCommand'); + const buttonView = new ButtonView(locale); + + // Create the toolbar button. + buttonView.set({ + label: editor.t('Avoindata Note'), + icon, + tooltip: true, + }); + + // Bind the state of the button to the command. + buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + + // Execute the command when the button is clicked (executed). + this.listenTo(buttonView, 'execute', () => + editor.execute('insertAvoindataNoteCommand'), + ); + + return buttonView; + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/index.js new file mode 100644 index 0000000000..8094004d07 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import AvoindataNote from './avoindataNote'; + +export default { + AvoindataNote, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js new file mode 100644 index 0000000000..636dd4bd00 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js @@ -0,0 +1,60 @@ +/** + * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote + * toolbar button is pressed. + */ + +import { Command } from 'ckeditor5/src/core'; + +export default class InsertAvoindataNoteCommand extends Command { + execute() { + const { model } = this.editor; + + model.change((writer) => { + // Insert * at the current selection position + // in a way that will result in creating a valid model structure. + model.insertContent(createAvoindataNote(writer)); + }); + } + + refresh() { + const { model } = this.editor; + const { selection } = model.document; + + // Determine if the cursor (selection) is in a position where adding a + // avoindataNote is permitted. This is based on the schema of the model(s) + // currently containing the cursor. + const allowedIn = model.schema.findAllowedParent( + selection.getFirstPosition(), + 'avoindataNote', + ); + + // If the cursor is not in a location where a avoindataNote can be added, return + // null so the addition doesn't happen. + this.isEnabled = allowedIn !== null; + } +} + +function createAvoindataNote(writer) { + // Create instances of the elements registered with the editor in + // avoindataexpanderediting.js. + const avoindataNote = writer.createElement('avoindataNote'); + const avoindataNoteHeader = writer.createElement('avoindataNoteHeader'); + const avoindataNoteIcon = writer.createElement('avoindataNoteIcon'); + const avoindataNoteTitle = writer.createElement('avoindataNoteTitle'); + const avoindataNoteContent = writer.createElement('avoindataNoteContent'); + + // Append the title and content elements to the avoindataNote, which matches + // the parent/child relationship as defined in their schemas. + writer.append(avoindataNoteHeader, avoindataNote); + writer.append(avoindataNoteIcon, avoindataNoteHeader); + writer.append(avoindataNoteTitle, avoindataNoteHeader); + writer.append(avoindataNoteContent, avoindataNote); + + // The text content will automatically be wrapped in a + // `

`. + writer.appendElement('paragraph', avoindataNoteTitle); + writer.appendElement('paragraph', avoindataNoteContent); + + // Return the element to be added to the editor. + return avoindataNote; +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js new file mode 100644 index 0000000000..ebe0510358 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js @@ -0,0 +1,70 @@ +import { Plugin } from 'ckeditor5/src/core'; + +export default class ExternalLink extends Plugin { + init() { + console.log('ExternalLink loaded') + const editor = this.editor; + const { model } = editor; + + // `listenTo()` and `editor` are available thanks to `Plugin`. + // By using `listenTo()` you will ensure that the listener is removed when + // the plugin is destroyed. + this.listenTo(editor.data, 'ready', () => { + const linkCommand = editor.commands.get('link'); + const decorator = linkCommand.manualDecorators.get('linkIsExternal') + const selection = editor.model.document.selection; + + console.log(decorator) + + // Override default link manual decorator conversion to add an icon after the link + editor.conversion.for( 'downcast' ).attributeToElement( { + model: 'linkIsExternal', + view: ( manualDecoratorValue, { writer, schema }, { item } ) => { + // Manual decorators for block links are handled e.g. in LinkImageEditing. + if ( !( item.is( 'selection' ) || schema.isInline( item ) ) ) { + return; + } + + if ( manualDecoratorValue ) { + const element = writer.createAttributeElement( 'a', decorator.attributes, { priority: 5 } ); + + if ( decorator.classes ) { + writer.addClass( decorator.classes, element ); + } + + for ( const key in decorator.styles ) { + writer.setStyle( key, decorator.styles[ key ], element ); + } + + writer.setCustomProperty( 'link', true, element ); + + return element; + } + } + } ); + + this.listenTo(linkCommand, 'execute', (evt, params) => { + const linkIsExternal = params[1]['linkIsExternal'] + console.log(evt) + console.log(params) + console.log('linkIsExternal', linkIsExternal) + console.log('source', evt.source) + + if (linkIsExternal) { + console.log('external link') + console.log(editor.model.schema) + editor.model.change(writer => { + console.log('foo') + writer.appendText('test', selection) + }); + } else { + console.log('not an external link') + } + }) + }); + } + + static get pluginName() { + return 'ExternalLink'; + } +} \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js new file mode 100644 index 0000000000..b0e2d65cb1 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import ExternalLink from './externalLink'; + +export default { + ExternalLink, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js new file mode 100644 index 0000000000..bdadee20ec --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js @@ -0,0 +1,81 @@ +const path = require('path'); +const fs = require('fs'); +const webpack = require('webpack'); +const { styles, builds } = require('@ckeditor/ckeditor5-dev-utils'); +const TerserPlugin = require('terser-webpack-plugin'); + +function getDirectories(srcpath) { + return fs + .readdirSync(srcpath) + .filter((item) => fs.statSync(path.join(srcpath, item)).isDirectory()); +} + +module.exports = []; +// Loop through every subdirectory in src, each a different plugin, and build +// each one in ./build. +getDirectories('./src').forEach((dir) => { + console.log(dir) + const bc = { + mode: 'production', + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + terserOptions: { + format: { + comments: false, + }, + }, + test: /\.js(\?.*)?$/i, + extractComments: false, + }), + ], + moduleIds: 'named', + }, + entry: { + path: path.resolve( + __dirname, + 'src', + dir, + 'index.js', + ), + }, + output: { + path: path.resolve(__dirname, './js'), + filename: `${dir}.js`, + library: ['CKEditor5', dir], + libraryTarget: 'umd', + libraryExport: 'default' + }, + plugins: [ + // It is possible to require the ckeditor5-dll.manifest.json used in + // core/node_modules rather than having to install CKEditor 5 here. + // However, that requires knowing the location of that file relative to + // where your module code is located. + new webpack.DllReferencePlugin({ + manifest: require('ckeditor5/build/ckeditor5-dll.manifest.json'), // eslint-disable-line global-require, import/no-unresolved + scope: 'ckeditor5/src', + name: 'CKEditor5.dll', + }), + ], + module: { + rules: [ + { + oneOf: [ + { + test: /\.svg$/, + resourceQuery: /source/, + type: 'asset/source' + }, + { + test: /\.svg$/, + type: "asset/inline", + }, + ] + }] + + }, + }; + + module.exports.push(bc); +}); diff --git a/drupal/scripts/init_drupal.sh b/drupal/scripts/init_drupal.sh index 2e606c8aa5..a4060c426d 100644 --- a/drupal/scripts/init_drupal.sh +++ b/drupal/scripts/init_drupal.sh @@ -60,33 +60,6 @@ drush language:default -y "fi" # enable base theme drush theme:enable -y bootstrap -# remove some configurations -# NOTE: ansible role skips errors with this condition: -# result.rc == 1 and 'Config {{ item }} does not exist' not in result.stderr -echo "delete configurations.." -drush config:delete easy_breadcrumb.settings || true -drush config:delete node.type.page || true -drush config:delete core.entity_form_display.node.page.default || true -drush config:delete core.entity_view_display.node.page.default || true -drush config:delete pathauto.settings || true -drush config:delete captcha.captcha_point.contact_message_feedback_form || true -drush config:delete core.base_field_override.node.article.promote || true -drush config:delete editor.editor.full_html || true -drush config:delete block.block.avoindata_collapsiblesearch || true -drush config:delete block.block.avoindata_infobox || true -drush config:delete disqus.settings || true -drush config:delete field.field.node.avoindata_guide_page.field_guide_comments || true -drush config:delete field.field.node.avoindata_article.field_article_comments || true -drush config:delete field.field.node.avoindata_event.field_event_comments || true -drush config:delete field.storage.node.field_article_comments || true -drush config:delete field.storage.node.field_basic_page_comments || true -drush config:delete field.storage.node.field_event_comments || true -drush config:delete field.storage.node.field_guide_comments || true -drush config:delete core.entity_view_display.node.page.search_index || true -drush config:delete core.entity_view_display.node.page.search_result || true -drush config:delete core.entity_view_display.node.page.teaser || true -drush config:delete field.field.node.page.field_basic_page_comments || true -drush config:delete field.storage.node.field_basic_page_comments || true # uninstall modules echo "uninstall modules.." @@ -94,9 +67,6 @@ echo "uninstall modules.." [[ "$MODULE_INFO" == *"contextual"* ]] && drush pm:uninstall -y contextual [[ "$MODULE_INFO" == *"page_cache"* ]] && drush pm:uninstall -y page_cache [[ "$MODULE_INFO" == *"protected_submissions"* ]] && drush pm:uninstall -y protected_submissions -[[ "$MODULE_INFO" == *"avoindata_datasetlist"* ]] && drush pm:uninstall -y avoindata_datasetlist -[[ "$MODULE_INFO" == *"avoindata_appfeed"* ]] && drush pm:uninstall -y avoindata_appfeed -[[ "$MODULE_INFO" == *"disqus"* ]] && drush pm:uninstall -y disqus # enable modules echo "enable modules.." @@ -116,7 +86,7 @@ echo "enable modules.." [[ "$MODULE_INFO" != *"ape"* ]] && drush pm:enable -y ape [[ "$MODULE_INFO" != *"honeypot"* ]] && drush pm:enable -y honeypot [[ "$MODULE_INFO" != *"domain_registration"* ]] && drush pm:enable -y domain_registration -[[ "$MODULE_INFO" != *"protected_forms"* ]] && drush pm:enable -y protected_forms +[[ "$MODULE_INFO" != *"protected_forms"* ]] && drush pm:enable -y protected_forms [[ "$MODULE_INFO" != *"recaptcha"* ]] && drush pm:enable -y recaptcha [[ "$MODULE_INFO" != *"unpublished_node_permissions"* ]] && drush pm:enable -y unpublished_node_permissions [[ "$MODULE_INFO" != *"menu_item_role_access"* ]] && drush pm:enable -y menu_item_role_access @@ -130,6 +100,19 @@ echo "enable modules.." [[ "$MODULE_INFO" != *"raven"* ]] && drush pm:enable -y raven [[ "$MODULE_INFO" != *"menu_link_attributes"* ]] && drush pm:enable -y menu_link_attributes +# remove some configurations +# NOTE: ansible role skips errors with this condition: +# result.rc == 1 and 'Config {{ item }} does not exist' not in result.stderr +echo "delete configurations.." +drush config:delete easy_breadcrumb.settings || true +drush config:delete node.type.page || true +drush config:delete core.entity_form_display.node.page.default || true +drush config:delete core.entity_view_display.node.page.default || true +drush config:delete pathauto.settings || true +drush config:delete captcha.captcha_point.contact_message_feedback_form || true +drush config:delete core.base_field_override.node.article.promote || true +drush config:delete editor.editor.full_html + # enable custom modules echo "enable custom modules.." [[ "$MODULE_INFO" != *"avoindata_header"* ]] && drush pm:enable -y avoindata_header @@ -157,18 +140,10 @@ drush config:import -y --partial --source ${THEME_DIR}/avoindata/config/install # result.rc == 1 and 'The source directory does not exist. The source is not a directory.' not in result.stderr and 'already exists' not in result.stderr echo "import module configurations.." drush config:import -y --partial --source ${MOD_DIR}/avoindata-header/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-servicemessage/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-hero/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-categories/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-infobox/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-explore/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-newsfeed/config/install || true drush config:import -y --partial --source ${MOD_DIR}/avoindata-footer/config/install || true drush config:import -y --partial --source ${MOD_DIR}/avoindata-articles/config/install || true drush config:import -y --partial --source ${MOD_DIR}/avoindata-events/config/install || true drush config:import -y --partial --source ${MOD_DIR}/avoindata-guide/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-user/config/install || true -drush config:import -y --partial --source ${MOD_DIR}/avoindata-ckeditor-plugins/config/install || true # apply jinja2 templates jinja2 --format=yaml ${TEMPLATE_DIR}/site_config/matomo.settings.yml.j2 -o ${APP_DIR}/site_config/matomo.settings.yml diff --git a/opendata-assets/src/less/drupal/custom-elements.less b/opendata-assets/src/less/drupal/custom-elements.less index e86795fc31..804b3e74ea 100644 --- a/opendata-assets/src/less/drupal/custom-elements.less +++ b/opendata-assets/src/less/drupal/custom-elements.less @@ -70,7 +70,8 @@ margin-bottom: @padding-y--small; } -.avoindata-note-header-image { +.avoindata-note-header-image, +.avoindata-note-icon { height: 24px; width: 24px; margin-left: 20px; @@ -176,7 +177,12 @@ padding: 0 20px 20px 20px; } -a.external { +a.external-link { + &::after { + font-family: @font-family-icon; + content: "\f08e"; + } + svg { margin-bottom: -2px; margin-left: 4px; @@ -232,3 +238,4 @@ table { color: @color--black; } } + From 0e9c86d3aee560152a58af941919d2937085283d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Sun, 1 Oct 2023 16:00:50 +0200 Subject: [PATCH 02/30] AV-2017: Rest of the plugins --- .../avoindata_ckeditor5_plugins.ckeditor5.yml | 59 +++- .../avoindata_ckeditor5_plugins.info.yml | 4 +- .../avoindata_ckeditor5_plugins.libraries.yml | 30 ++ .../avoindata_ckeditor5_plugins.module | 29 -- .../css/editor.css | 275 ++++++++++++------ .../css/toolbar-icons.css | 16 +- .../icons/icon-example.svg | 8 + .../icons/icon-expander.svg | 4 +- .../icons/icon-hint.svg | 8 +- .../icons/{icon-info.svg => icon-note.svg} | 2 +- .../{icon-window.svg => icon-section.svg} | 7 +- .../js/avoindataExample.js | 1 + .../js/avoindataExpander.js | 2 +- .../js/avoindataHint.js | 2 +- .../js/avoindataNote.js | 2 +- .../js/avoindataSection.js | 1 + .../src/avoindataExample/avoindataExample.js | 23 ++ .../avoindataExampleEditing.js | 210 +++++++++++++ .../avoindataExample/avoindataExampleUI.js | 36 +++ .../src/avoindataExample/index.js | 13 + .../insertAvoindataExampleCommand.js | 56 ++++ .../src/avoindataHint/avoindataHintEditing.js | 58 +--- .../src/avoindataHint/avoindataHintUI.js | 2 +- .../insertAvoindataHintCommand.js | 5 +- .../src/avoindataNote/avoindataNoteEditing.js | 6 +- .../src/avoindataNote/avoindataNoteUI.js | 2 +- .../src/avoindataSection/avoindataSection.js | 23 ++ .../avoindataSectionEditing.js | 220 ++++++++++++++ .../avoindataSection/avoindataSectionUI.js | 121 ++++++++ .../avoindataSection/avoindataSectionView.js | 87 ++++++ .../src/avoindataSection/index.js | 13 + .../insertAvoindataSectionCommand.js | 68 +++++ .../webpack.config.js | 4 + drupal/scripts/init_drupal.sh | 1 + .../src/less/drupal/custom-elements.less | 11 +- 35 files changed, 1214 insertions(+), 195 deletions(-) delete mode 100644 drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/icons/icon-example.svg rename drupal/modules/avoindata-ckeditor5-plugins/icons/{icon-info.svg => icon-note.svg} (99%) rename drupal/modules/avoindata-ckeditor5-plugins/icons/{icon-window.svg => icon-section.svg} (68%) create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/index.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionView.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/index.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/insertAvoindataSectionCommand.js diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml index 68a137db23..f7d805e173 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml @@ -114,4 +114,61 @@ avoindata_ckeditor5_plugins_avoindatanote: - - -

- -
\ No newline at end of file + -
+ +avoindata_ckeditor5_plugins_avoindatahint: + ckeditor5: + plugins: + - avoindataHint.AvoindataHint + drupal: + label: Avoindata Hint + library: avoindata_ckeditor5_plugins/avoindataHint + admin_library: avoindata_ckeditor5_plugins/toolbarIcons + toolbar_items: + avoindataHint: + label: Avoindata Hint + elements: + -
+ -
+ -
+ - + - + -
+ +avoindata_ckeditor5_plugins_avoindataexample: + ckeditor5: + plugins: + - avoindataExample.AvoindataExample + drupal: + label: Avoindata Example + library: avoindata_ckeditor5_plugins/avoindataExample + admin_library: avoindata_ckeditor5_plugins/toolbarIcons + toolbar_items: + avoindataExample: + label: Avoindata Example + elements: + -
+ -
+ -
+ -
+ -
+ +avoindata_ckeditor5_plugins_avoindatasection: + ckeditor5: + plugins: + - avoindataSection.AvoindataSection + drupal: + label: Avoindata Example + library: avoindata_ckeditor5_plugins/avoindataSection + admin_library: avoindata_ckeditor5_plugins/toolbarIcons + toolbar_items: + avoindataSection: + label: Avoindata Section + elements: + -
+ -
+ -
+ -
+ -
+ -
+ -
diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml index 8ec32cf956..c9ebebc411 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.info.yml @@ -1,6 +1,6 @@ -name: Avoindata Drupal CKEditor 5 plugins +name: Avoindata Drupal CKEditor5 plugins type: module -description: Adds several buttons for custom elements to CKEditor 5. +description: Adds Expander, Note, Hint, Example and Section custom elements to CKEditor5. core_version_requirement: ^9 || ^10 package: Custom dependencies: diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml index 4cf28a31ce..aa484a39cb 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml @@ -25,6 +25,36 @@ avoindataNote: dependencies: - core/ckeditor5 +avoindataHint: + css: + theme: + - css/editor.css: {} + - css/style.css: {} + js: + js/avoindataHint.js: { preprocess: false, minified: false } + dependencies: + - core/ckeditor5 + +avoindataExample: + css: + theme: + - css/editor.css: {} + - css/style.css: {} + js: + js/avoindataExample.js: { preprocess: false, minified: false } + dependencies: + - core/ckeditor5 + +avoindataSection: + css: + theme: + - css/editor.css: {} + - css/style.css: {} + js: + js/avoindataSection.js: { preprocess: false, minified: false } + dependencies: + - core/ckeditor5 + # Loaded in the text format configuration form to provide styling for the icon # used in toolbar config. toolbarIcons: diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module deleted file mode 100644 index aa888bd2ee..0000000000 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.module +++ /dev/null @@ -1,29 +0,0 @@ -' . t('Avoindata CKEDitor 5 plugins') . ''; - $output .= '

' . t('The module adds a number of buttons for custom elements to CKEditor 5 to be added to the toolbar in the content editor).') . '

'; - $output .= '

' . t('Uses') . '

'; - $output .= '
'; - $output .= '
' . t('Settings') . '
'; - $output .= '
' . t('In the text formats that use ckeditor 5, move the icon into the active toolbar.', [':text-formats' => Url::fromRoute('filter.admin_overview')->toString()]) . '
'; - $output .= '
'; - return $output; - - default: - } -} \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css index af003021d3..ee4c5377bd 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css @@ -1,111 +1,216 @@ .ck-content { - .avoindata-expander { - background:#f6f9fc; - border-radius:2px; - -webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1); - box-shadow:0 2px 4px 1px rgba(41,41,41,.1); - border:1px solid #ecedee; - margin:0 + .avoindata-expander { + background:#f6f9fc; + border-radius:2px; + -webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1); + box-shadow:0 2px 4px 1px rgba(41,41,41,.1); + border:1px solid #ecedee; + margin:0; + + .avoindata-expander-title { + font-size: 18px; + font-weight: 600; + line-height: 27px; + padding: 0 20px 5px 20px; + color: #2a6ebb; } - .avoindata-expander + .avoindata-expander { - margin-top:-1px + .avoindata-expander-content { + padding: 0 20px 15px 20px; } + } - .avoindata-note { - background: rgb(247, 247, 248); - border-radius: 0; - margin-top: 20px; - margin-bottom: 20px; - } + .avoindata-expander + .avoindata-expander { + margin-top:-1px + } + + .avoindata-note { + background: rgb(247, 247, 248); + border-radius: 0; + margin-top: 20px; + margin-bottom: 20px; + } - .avoindata-note-header { - .avoindata-note-icon { - height: 24px; - width: 24px; - float: left; - margin: 24px 6px 0 20px; - } - - .avoindata-note-title { - font-size: 20px; - font-weight: 600; - line-height: 28px; - padding: 19px 0 13px 15px; - margin-block-start: 0; - margin-block-end: 0; - margin-inline-start: 0; - margin-inline-end: 0; - - > *:last-child { - margin: 0; - } - } + .avoindata-note-header { + .avoindata-note-icon { + height: 24px; + width: 24px; + float: left; + margin: 24px 6px 0 20px; } - .avoindata-note-content { - font-size: 18px; - font-weight: normal; - line-height: 27px; - padding: 0 20px 15px 20px; - } + .avoindata-note-title { + font-size: 20px; + font-weight: 600; + line-height: 28px; + padding: 19px 0 13px 60px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 0; + margin-inline-end: 0; - .avoindata-expander-content p:last-of-type, - .avoindata-note-content p:last-of-type, - .avoindata-hint-content p:last-of-type { - margin-bottom: 0; + > *:last-child { + margin: 0; } + } + } - .avoindata-hint { - margin: 20px 0; - } + .avoindata-note-content { + font-size: 18px; + font-weight: normal; + line-height: 27px; + padding: 0 20px 15px 20px; + } - .avoindata-hint-image { - display: inline-block; - vertical-align: top; + .avoindata-expander-content p:last-of-type, + .avoindata-note-content p:last-of-type, + .avoindata-hint-content p:last-of-type { + margin-bottom: 0; + } + + .avoindata-hint { + margin: 20px 0; + } + + .avoindata-hint-header { + display: flex; + .avoindata-hint-icon { height: 24px; width: 24px; - margin-left: 20px; + float: left; + margin: 20px 6px 0 20px; + } + } + + .avoindata-hint-content { + flex-grow: 2; + font-size: 18px; + font-weight: normal; + line-height: 27px; + padding: 0 20px 15px 15px; + } + + .avoindata-example { + background: white; + border-radius: 2px; + border: 1.5px solid #2a6ebb; + border-left: 4.5px solid #2a6ebb; + margin-top: 20px; + margin-bottom: 20px; + } + + .avoindata-example-title { + font-size: 16px; + font-weight: 600; + line-height: 24px; + padding: 20px 20px 6px 20px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 0; + margin-inline-end: 0; + + > *:last-child { + margin: 0; + } + } + + .avoindata-example-content { + font-size: 16px; + font-weight: normal; + line-height: 24px; + padding: 0 20px 20px 20px; + } + + .avoindata-section { + background-color: #fff; + box-shadow: 0 2px 4px 1px rgba(41,41,41,.2); + border-top: 4px solid #2a6ebb; + border-radius: 4px 4px 0 0; + margin: 45px 0; + padding: 30px 30px; + + &:first-of-type { + margin-top: 0; + } + + .avoindata-section-title { + margin-top: 0; + margin-bottom: 20px; + + &>p { + margin: 0; + font-size: 22px; + line-height: 34px; + font-weight: 600; } + } - .avoindata-hint-content { - width: calc(100% - 45px); - display: inline-block; + .avoindata-section-content { + &>p { + margin: 0; font-size: 18px; - font-weight: normal; line-height: 27px; - padding: 0 20px 15px 15px; + font-weight: 400; } + } + } +} - .avoindata-example { - background: white; - border-radius: 2px; - border: 1.5px solid #2a6ebb; - border-left: 4.5px solid #2a6ebb; - margin-top: 20px; - margin-bottom: 20px; - } - .avoindata-example-title { - font-size: 16px; - font-weight: 600; - line-height: 24px; - padding: 20px 20px 6px 20px; - margin-block-start: 0; - margin-block-end: 0; - margin-inline-start: 0; - margin-inline-end: 0; - - > *:last-child { - margin: 0; - } +.avoindata-section-id-form { + padding: 8px; + + .title { + padding: 6px; + padding-bottom: 12px; + font-size: 16px; + font-weight: 600; + } + + .ck-labeled-field-view { + padding: 6px; + } + + .ck.ck-button.btn { + text-align: center; + vertical-align: middle; + cursor: pointer; + user-select: none; + padding: 10px 20px; + display: inline-flex; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 2px; + line-height: 1; + height: 40px; + width: fit-content; + font-weight: bold; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + margin: 12px 6px; + + &.btn-primary { + background: linear-gradient(0deg,#225a99 0,#2a6dbb 100%); + color: white; + border-color: #206b82; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + + &:hover { + background: linear-gradient(0deg,#2a6dbb 0,#2e77cb 100%); } + } - .avoindata-example-content { - font-size: 16px; - font-weight: normal; - line-height: 24px; - padding: 0 20px 20px 20px; + &.btn-secondary { + color: #2a6dbb; + border: 1px solid #2a6dbb; + background: 0 0; + box-shadow: none; + letter-spacing: .4px; + + &:hover { + background: linear-gradient(to top,white 0,gray 300%); } + } + } } diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css b/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css index 35a8b6720a..f0461929ce 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css @@ -3,5 +3,17 @@ } .ckeditor5-toolbar-button-avoindataNote { - background-image: url(../icons/icon-info.svg?source); -} \ No newline at end of file + background-image: url(../icons/icon-note.svg?source); +} + +.ckeditor5-toolbar-button-avoindataHint { + background-image: url(../icons/icon-hint.svg?source); +} + +.ckeditor5-toolbar-button-avoindataExample { + background-image: url(../icons/icon-example.svg?source); +} + +.ckeditor5-toolbar-button-avoindataSection { + background-image: url(../icons/icon-section.svg?source); +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-example.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-example.svg new file mode 100644 index 0000000000..1b4f350c02 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-example.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg index b71e0aa3a4..c72f5b5175 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-expander.svg @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg index f9f58d61e7..55e9842949 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-hint.svg @@ -1,5 +1,5 @@ - - - + + + - \ No newline at end of file + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-note.svg similarity index 99% rename from drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg rename to drupal/modules/avoindata-ckeditor5-plugins/icons/icon-note.svg index 67369da791..219c516b9b 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-info.svg +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-note.svg @@ -2,4 +2,4 @@ - \ No newline at end of file + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-section.svg similarity index 68% rename from drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg rename to drupal/modules/avoindata-ckeditor5-plugins/icons/icon-section.svg index 0c6a62c965..1c2492ebf0 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-window.svg +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-section.svg @@ -1,5 +1,6 @@ - - + + + - \ No newline at end of file + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js new file mode 100644 index 0000000000..d60b4bf4f9 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExample=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataExample/avoindataExample.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataExample)\n/* harmony export */ });\n/* harmony import */ var _avoindataExampleEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExampleEditing */ "./src/avoindataExample/avoindataExampleEditing.js");\n/* harmony import */ var _avoindataExampleUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataExampleUI */ "./src/avoindataExample/avoindataExampleUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataExampleUI and AvoindataExampleEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataExample extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataExampleEditing and AvoindataExampleUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataExampleEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataExampleUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/avoindataExample.js?')},"./src/avoindataExample/avoindataExampleEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExampleEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataExampleCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataExampleCommand */ \"./src/avoindataExample/insertAvoindataExampleCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *
\n *
\n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataExample model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataExampleEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataExampleCommand',\n new _insertAvoindataExampleCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataExample', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataExampleTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataExample.\n allowIn: 'avoindataExample',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataExampleContent', {\n isLimit: true,\n allowIn: 'avoindataExample',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataExample inside avoindataExampleContent.\n if (\n (context.endsWith('avoindataExampleContent') || context.endsWith('avoindataExampleTitle')) &&\n childDefinition.name === 'avoindataExample'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExample',\n view: {\n name: 'div',\n classes: 'avoindata-example',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExampleTitle',\n view: {\n name: 'div',\n classes: 'avoindata-example-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExampleContent',\n view: {\n name: 'div',\n classes: 'avoindata-example-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExample',\n view: {\n name: 'div',\n classes: 'avoindata-example',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExampleTitle',\n view: {\n name: 'div',\n classes: 'avoindata-example-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExampleContent',\n view: {\n name: 'div',\n classes: 'avoindata-example-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExample',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-example',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Example widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExampleTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-example-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExampleContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-example-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/avoindataExampleEditing.js?")},"./src/avoindataExample/avoindataExampleUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExampleUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_example_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-example.svg?source */ \"./icons/icon-example.svg?source\");\n/**\n * @file registers the avoindataExample toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataExampleUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataExample toolbar button.\n editor.ui.componentFactory.add('avoindataExample', (locale) => {\n const command = editor.commands.get('insertAvoindataExampleCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Example widget'),\n icon: _icons_icon_example_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataExampleCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/avoindataExampleUI.js?")},"./src/avoindataExample/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataExample__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExample */ "./src/avoindataExample/avoindataExample.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataExample: _avoindataExample__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/index.js?')},"./src/avoindataExample/insertAvoindataExampleCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataExampleCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataExampleCommand, which is executed when the avoindataExample\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataExampleCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataExample(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataExample is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataExample',\n );\n\n // If the cursor is not in a location where a avoindataExample can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataExample(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataExample = writer.createElement('avoindataExample');\n const avoindataExampleTitle = writer.createElement('avoindataExampleTitle');\n const avoindataExampleContent = writer.createElement('avoindataExampleContent');\n\n // Append the title and content elements to the avoindataExample, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataExampleTitle, avoindataExample);\n writer.append(avoindataExampleContent, avoindataExample);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataExampleTitle);\n writer.appendElement('paragraph', avoindataExampleContent);\n\n // Return the element to be added to the editor.\n return avoindataExample;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/insertAvoindataExampleCommand.js?")},"./icons/icon-example.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./icons/icon-example.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,n)=>{for(var a in n)__webpack_require__.o(n,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataExample/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js index 63d38142f6..22b9460c48 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataExpander/avoindataExpander.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataExpander)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpanderEditing */ "./src/avoindataExpander/avoindataExpanderEditing.js");\n/* harmony import */ var _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataExpanderUI */ "./src/avoindataExpander/avoindataExpanderUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataExpanderUI and AvoindataExpanderEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataExpander extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that ExpanderEditing and ExpanderUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpander.js?')},"./src/avoindataExpander/avoindataExpanderEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataExpanderCommand */ \"./src/avoindataExpander/insertAvoindataExpanderCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n
\n
Title
\n \n
\n
Content
\n
\n *\n * This file has the logic for defining the avoindataExpander model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataExpanderEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataExpanderCommand',\n new _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataExpander', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataExpanderTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within simpleBox.\n allowIn: 'avoindataExpander',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataExpanderContent', {\n isLimit: true,\n allowIn: 'avoindataExpander',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataExpander inside avoindataExpanderContent.\n if (\n (context.endsWith('avoindataExpanderContent') || context.endsWith('avoindataExpanderTitle')) &&\n childDefinition.name === 'avoindataExpander'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: {\n name: 'div',\n classes: 'avoindata-expander-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToStructure({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer }) => {\n return writer.createContainerElement('div', { class: 'avoindata-expander-header' }, [\n writer.createContainerElement('div', { class: 'avoindata-expander-title' }, [\n writer.createSlot()\n ]),\n writer.createContainerElement('span', { class: 'icon-wrapper pull-right' }, [\n writer.createEmptyElement('i', { class: 'fas fa-angle-down' })\n ])\n ])\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpander',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-expander',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Expander widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderEditing.js?")},"./src/avoindataExpander/avoindataExpanderUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-expander.svg?source */ \"./icons/icon-expander.svg?source\");\n/**\n * @file registers the avoindataExpander toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataExpanderUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataExpander toolbar button.\n editor.ui.componentFactory.add('avoindataExpander', (locale) => {\n const command = editor.commands.get('insertAvoindataExpanderCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Expander widget'),\n icon: _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataExpanderCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderUI.js?")},"./src/avoindataExpander/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpander */ "./src/avoindataExpander/avoindataExpander.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataExpander: _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/index.js?')},"./src/avoindataExpander/insertAvoindataExpanderCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataExpanderCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataExpanderCommand, which is executed when the avoindataExpander\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataExpanderCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataExpander(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataExpander is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataExpander',\n );\n\n // If the cursor is not in a location where a avoindataExpander can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataExpander(writer) {\n // Create instances of the three elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataExpander = writer.createElement('avoindataExpander');\n const avoindataExpanderTitle = writer.createElement('avoindataExpanderTitle');\n const avoindataExpanderContent = writer.createElement('avoindataExpanderContent');\n\n // Append the title and content elements to the avoindataExpander, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataExpanderTitle, avoindataExpander);\n writer.append(avoindataExpanderContent, avoindataExpander);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataExpanderTitle);\n writer.appendElement('paragraph', avoindataExpanderContent);\n\n // Return the element to be added to the editor.\n return avoindataExpander;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/insertAvoindataExpanderCommand.js?")},"./icons/icon-expander.svg?source":module=>{"use strict";eval('module.exports = "\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./icons/icon-expander.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,n)=>{for(var a in n)__webpack_require__.o(n,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataExpander/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataExpander/avoindataExpander.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataExpander)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpanderEditing */ "./src/avoindataExpander/avoindataExpanderEditing.js");\n/* harmony import */ var _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataExpanderUI */ "./src/avoindataExpander/avoindataExpanderUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataExpanderUI and AvoindataExpanderEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataExpander extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that ExpanderEditing and ExpanderUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpander.js?')},"./src/avoindataExpander/avoindataExpanderEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataExpanderCommand */ \"./src/avoindataExpander/insertAvoindataExpanderCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n
\n
Title
\n \n
\n
Content
\n
\n *\n * This file has the logic for defining the avoindataExpander model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataExpanderEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataExpanderCommand',\n new _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataExpander', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataExpanderTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within simpleBox.\n allowIn: 'avoindataExpander',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataExpanderContent', {\n isLimit: true,\n allowIn: 'avoindataExpander',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataExpander inside avoindataExpanderContent.\n if (\n (context.endsWith('avoindataExpanderContent') || context.endsWith('avoindataExpanderTitle')) &&\n childDefinition.name === 'avoindataExpander'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: {\n name: 'div',\n classes: 'avoindata-expander-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToStructure({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer }) => {\n return writer.createContainerElement('div', { class: 'avoindata-expander-header' }, [\n writer.createContainerElement('div', { class: 'avoindata-expander-title' }, [\n writer.createSlot()\n ]),\n writer.createContainerElement('span', { class: 'icon-wrapper pull-right' }, [\n writer.createEmptyElement('i', { class: 'fas fa-angle-down' })\n ])\n ])\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpander',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-expander',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Expander widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderEditing.js?")},"./src/avoindataExpander/avoindataExpanderUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-expander.svg?source */ \"./icons/icon-expander.svg?source\");\n/**\n * @file registers the avoindataExpander toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataExpanderUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataExpander toolbar button.\n editor.ui.componentFactory.add('avoindataExpander', (locale) => {\n const command = editor.commands.get('insertAvoindataExpanderCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Expander widget'),\n icon: _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataExpanderCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderUI.js?")},"./src/avoindataExpander/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpander */ "./src/avoindataExpander/avoindataExpander.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataExpander: _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/index.js?')},"./src/avoindataExpander/insertAvoindataExpanderCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataExpanderCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataExpanderCommand, which is executed when the avoindataExpander\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataExpanderCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataExpander(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataExpander is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataExpander',\n );\n\n // If the cursor is not in a location where a avoindataExpander can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataExpander(writer) {\n // Create instances of the three elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataExpander = writer.createElement('avoindataExpander');\n const avoindataExpanderTitle = writer.createElement('avoindataExpanderTitle');\n const avoindataExpanderContent = writer.createElement('avoindataExpanderContent');\n\n // Append the title and content elements to the avoindataExpander, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataExpanderTitle, avoindataExpander);\n writer.append(avoindataExpanderContent, avoindataExpander);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataExpanderTitle);\n writer.appendElement('paragraph', avoindataExpanderContent);\n\n // Return the element to be added to the editor.\n return avoindataExpander;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/insertAvoindataExpanderCommand.js?")},"./icons/icon-expander.svg?source":module=>{"use strict";eval('module.exports = "\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./icons/icon-expander.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,n)=>{for(var a in n)__webpack_require__.o(n,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataExpander/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js index 20f7a805e8..785ce8932a 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js @@ -1 +1 @@ -!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(n.CKEditor5=n.CKEditor5||{},n.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataHint/avoindataHint.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataHint)\n/* harmony export */ });\n/* harmony import */ var _avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHintEditing */ "./src/avoindataHint/avoindataHintEditing.js");\n/* harmony import */ var _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataHintUI */ "./src/avoindataHint/avoindataHintUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataHint extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHint.js?')},"./src/avoindataHint/avoindataHintEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataHintCommand */ \"./src/avoindataHint/insertAvoindataHintCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataHint model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataHintEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataHintCommand',\n new _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataHint', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataHintHeader', {\n // This is only to be used within avoindataHint.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataHint',\n allowChildren: ['avoindataHintIcon', 'avoindataHintTitle']\n });\n\n schema.register('avoindataHintIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHintHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataHintTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHintHeader',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataHintContent', {\n isLimit: true,\n allowIn: 'avoindataHint',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataHint inside avoindataHintContent.\n if (\n (context.endsWith('avoindataHintContent') || context.endsWith('avoindataHintTitle')) &&\n childDefinition.name === 'avoindataHint'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-icon',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintTitle',\n view: {\n name: 'div',\n classes: 'avoindata-hint-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: \"avoindata-hint-icon\", src: '/themes/avoindata/images/avoindata-hint-icon.svg' })\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintTitle',\n view: {\n name: 'div',\n classes: 'avoindata-hint-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHint',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-hint',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Hint widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-hint-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createUIElement('img', {\n class: 'avoindata-hint-icon',\n src: \"/themes/avoindata/images/avoindata-hint-icon.svg\",\n alt: \"Avoindata Hint icon\",\n });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintEditing.js?")},"./src/avoindataHint/avoindataHintUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-info.svg?source */ \"./icons/icon-info.svg?source\");\n/**\n * @file registers the avoindataHint toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataHintUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataHint toolbar button.\n editor.ui.componentFactory.add('avoindataHint', (locale) => {\n const command = editor.commands.get('insertAvoindataHintCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Hint widget'),\n icon: _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataHintCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintUI.js?")},"./src/avoindataHint/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataHint__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHint */ "./src/avoindataHint/avoindataHint.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataHint: _avoindataHint__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/index.js?')},"./src/avoindataHint/insertAvoindataHintCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataHintCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataHintCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataHint(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataHint is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataHint',\n );\n\n // If the cursor is not in a location where a avoindataHint can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataHint(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataHint = writer.createElement('avoindataHint');\n const avoindataHintHeader = writer.createElement('avoindataHintHeader');\n const avoindataHintIcon = writer.createElement('avoindataHintIcon');\n const avoindataHintTitle = writer.createElement('avoindataHintTitle');\n const avoindataHintContent = writer.createElement('avoindataHintContent');\n\n // Append the title and content elements to the avoindataHint, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataHintHeader, avoindataHint);\n writer.append(avoindataHintIcon, avoindataHintHeader);\n writer.append(avoindataHintTitle, avoindataHintHeader);\n writer.append(avoindataHintContent, avoindataHint);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataHintTitle);\n writer.appendElement('paragraph', avoindataHintContent);\n\n // Return the element to be added to the editor.\n return avoindataHint;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/insertAvoindataHintCommand.js?")},"./icons/icon-info.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./icons/icon-info.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":n=>{"use strict";n.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(n,e)=>{for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),__webpack_require__.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataHint/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(n.CKEditor5=n.CKEditor5||{},n.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataHint/avoindataHint.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataHint)\n/* harmony export */ });\n/* harmony import */ var _avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHintEditing */ "./src/avoindataHint/avoindataHintEditing.js");\n/* harmony import */ var _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataHintUI */ "./src/avoindataHint/avoindataHintUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataHint extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHint.js?')},"./src/avoindataHint/avoindataHintEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataHintCommand */ \"./src/avoindataHint/insertAvoindataHintCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataHint model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataHintEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataHintCommand',\n new _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataHint', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataHintHeader', {\n // This is only to be used within avoindataHint.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataHint',\n allowChildren: ['avoindataHintIcon', 'avoindataHintContent']\n });\n\n schema.register('avoindataHintIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHintHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataHintContent', {\n isLimit: true,\n allowIn: 'avoindataHintHeader',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataHint inside avoindataHintContent.\n if (\n context.endsWith('avoindataHintContent') &&\n childDefinition.name === 'avoindataHint'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-icon',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: \"avoindata-hint-icon\", src: '/themes/avoindata/images/avoindata-hint-icon.svg' })\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHint',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-hint',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Hint widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-hint-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createUIElement('img', {\n class: 'avoindata-hint-icon',\n src: \"/themes/avoindata/images/avoindata-hint-icon.svg\",\n alt: \"Avoindata Hint icon\",\n });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintEditing.js?")},"./src/avoindataHint/avoindataHintUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-hint.svg?source */ \"./icons/icon-hint.svg?source\");\n/**\n * @file registers the avoindataHint toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataHintUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataHint toolbar button.\n editor.ui.componentFactory.add('avoindataHint', (locale) => {\n const command = editor.commands.get('insertAvoindataHintCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Hint widget'),\n icon: _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataHintCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintUI.js?")},"./src/avoindataHint/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataHint__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHint */ "./src/avoindataHint/avoindataHint.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataHint: _avoindataHint__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/index.js?')},"./src/avoindataHint/insertAvoindataHintCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataHintCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataHintCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataHint(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataHint is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataHint',\n );\n\n // If the cursor is not in a location where a avoindataHint can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataHint(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataHint = writer.createElement('avoindataHint');\n const avoindataHintHeader = writer.createElement('avoindataHintHeader');\n const avoindataHintIcon = writer.createElement('avoindataHintIcon');\n const avoindataHintContent = writer.createElement('avoindataHintContent');\n\n // Append the title and content elements to the avoindataHint, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataHintHeader, avoindataHint);\n writer.append(avoindataHintIcon, avoindataHintHeader);\n writer.append(avoindataHintContent, avoindataHintHeader);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataHintContent);\n\n // Return the element to be added to the editor.\n return avoindataHint;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/insertAvoindataHintCommand.js?")},"./icons/icon-hint.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./icons/icon-hint.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":n=>{"use strict";n.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(n,e)=>{for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),__webpack_require__.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataHint/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js index d3ac9d3f80..a968e1872e 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataNote/avoindataNote.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataNote)\n/* harmony export */ });\n/* harmony import */ var _avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNoteEditing */ "./src/avoindataNote/avoindataNoteEditing.js");\n/* harmony import */ var _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataNoteUI */ "./src/avoindataNote/avoindataNoteUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataNote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNote.js?')},"./src/avoindataNote/avoindataNoteEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataNoteCommand */ \"./src/avoindataNote/insertAvoindataNoteCommand.js\");\n/* harmony import */ var _icons_icon_info_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-info.svg */ \"./icons/icon-info.svg\");\n\n\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataNote model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataNoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataNoteCommand',\n new _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataNote', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataNoteHeader', {\n // This is only to be used within avoindataNote.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataNote',\n allowChildren: ['avoindataNoteIcon', 'avoindataNoteTitle']\n });\n\n schema.register('avoindataNoteIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataNoteTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataNoteContent', {\n isLimit: true,\n allowIn: 'avoindataNote',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataNote inside avoindataNoteContent.\n if (\n (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) &&\n childDefinition.name === 'avoindataNote'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-icon'\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_info_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNote',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-note',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Note widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-note-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToStructure({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_info_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteEditing.js?")},"./src/avoindataNote/avoindataNoteUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-info.svg?source */ \"./icons/icon-info.svg?source\");\n/**\n * @file registers the avoindataNote toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataNoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataNote toolbar button.\n editor.ui.componentFactory.add('avoindataNote', (locale) => {\n const command = editor.commands.get('insertAvoindataNoteCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Note'),\n icon: _icons_icon_info_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataNoteCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteUI.js?")},"./src/avoindataNote/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataNote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNote */ "./src/avoindataNote/avoindataNote.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataNote: _avoindataNote__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/index.js?')},"./src/avoindataNote/insertAvoindataNoteCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataNoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataNoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataNote(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataNote is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataNote',\n );\n\n // If the cursor is not in a location where a avoindataNote can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataNote(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataNote = writer.createElement('avoindataNote');\n const avoindataNoteHeader = writer.createElement('avoindataNoteHeader');\n const avoindataNoteIcon = writer.createElement('avoindataNoteIcon');\n const avoindataNoteTitle = writer.createElement('avoindataNoteTitle');\n const avoindataNoteContent = writer.createElement('avoindataNoteContent');\n\n // Append the title and content elements to the avoindataNote, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataNoteHeader, avoindataNote);\n writer.append(avoindataNoteIcon, avoindataNoteHeader);\n writer.append(avoindataNoteTitle, avoindataNoteHeader);\n writer.append(avoindataNoteContent, avoindataNote);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataNoteTitle);\n writer.appendElement('paragraph', avoindataNoteContent);\n\n // Return the element to be added to the editor.\n return avoindataNote;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/insertAvoindataNoteCommand.js?")},"./icons/icon-info.svg":module=>{"use strict";eval('module.exports = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRTk3MDI1IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iSWNvbnMvQmFzaWMtaWNvbnMvaW5mbyIgZmlsbD0iI0U5NzAyNSIgc3Ryb2tlLXdpZHRoPSIxIiA+CiAgICAgICAgPHBhdGggZD0iTTEyLC0xLjI0MzQ0OTc5ZS0xNCBDMTguNjE3LC0xLjI0MzQ0OTc5ZS0xNCAyNCw1LjM4MyAyNCwxMiBDMjQsMTguNjE3IDE4LjYxNywyNCAxMiwyNCBDNS4zODMsMjQgMi4xMzE2MjgyMWUtMTQsMTguNjE3IDIuMTMxNjI4MjFlLTE0LDEyIEMyLjEzMTYyODIxZS0xNCw1LjM4MyA1LjM4MywtMS4yNDM0NDk3OWUtMTQgMTIsLTEuMjQzNDQ5NzllLTE0IFogTTEyLDIgQzYuNDg2LDIgMiw2LjQ4NiAyLDEyIEMyLDE3LjUxNCA2LjQ4NiwyMiAxMiwyMiBDMTcuNTE0LDIyIDIyLDE3LjUxNCAyMiwxMiBDMjIsNi40ODYgMTcuNTE0LDIgMTIsMiBaIE0xMi4wMDI4NzUsMTAuMDAwMzY0NiBDMTIuNTU0ODY5MiwxMC4wMDAzNjQ2IDEzLjAwMjg2NDYsMTAuNDQ4MzU5OSAxMy4wMDI4NjQ2LDExLjAwMDM1NDIgTDEzLjAwMjg2NDYsMTcuMDAwMjkxNyBMMTQuMDAyODU0MSwxNy4wMDAyOTE3IEMxNC41NTQ4NDg0LDE3LjAwMDI5MTcgMTUuMDAyODQzNywxNy40NDgyODcgMTUuMDAyODQzNywxOC4wMDAyODEzIEMxNS4wMDI4NDM3LDE4LjU1MjI3NTUgMTQuNTU0ODQ4NCwxOS4wMDAyNzA4IDE0LjAwMjg1NDEsMTkuMDAwMjcwOCBMOS45OTk4OTU4MywxOS4wMDAyNzA4IEM5LjQ0NzkwMTU4LDE5LjAwMDI3MDggOC45OTk5MDYyNSwxOC41NTIyNzU1IDguOTk5OTA2MjUsMTguMDAwMjgxMyBDOC45OTk5MDYyNSwxNy40NDgyODcgOS40NDc5MDE1OCwxNy4wMDAyOTE3IDkuOTk5ODk1ODMsMTcuMDAwMjkxNyBMMTAuOTk5ODg1NCwxNy4wMDAyOTE3IEwxMC45OTk4ODU0LDEyLjAwMDM0MzggTDkuOTk5ODk1ODMsMTIuMDAwMzQzOCBDOS40NDc5MDE1OCwxMi4wMDAzNDM4IDguOTk5OTA2MjUsMTEuNTUyMzQ4NCA4Ljk5OTkwNjI1LDExLjAwMDM1NDIgQzguOTk5OTA2MjUsMTAuNDQ4MzU5OSA5LjQ0NzkwMTU4LDEwLjAwMDM2NDYgOS45OTk4OTU4MywxMC4wMDAzNjQ2IEwxMi4wMDI4NzUsMTAuMDAwMzY0NiBaIE0xMS41MDE4ODAyLDUuMDAwNDE2NjcgQzEyLjMzMTg3MTUsNS4wMDA0MTY2NyAxMy4wMDI4NjQ2LDUuNjcyNDA5NjcgMTMuMDAyODY0Niw2LjUwMDQwMTA0IEMxMy4wMDI4NjQ2LDcuMjc5Njg3MDQgMTIuNDA4NDkwMSw3LjkyMDc4NzYzIDExLjY0NjU5NDUsNy45OTM1MTQ3NCBMMTEuNTAxNzU1Miw4LjAwMDM4NTQyIEwxMS41MDE3NTUyLDguMDAwMzg1NDIgTDExLjQ5OTg4MDIsOC4wMDAzODU0MiBDMTAuNjcwODg4OCw4LjAwMDM4NTQyIDkuOTk5ODk1ODMsNy4zMjgzOTI0MiA5Ljk5OTg5NTgzLDYuNTAwNDAxMDQgQzkuOTk5ODk1ODMsNS42NzI0MDk2NyAxMC42NzA4ODg4LDUuMDAwNDE2NjcgMTEuNDk5ODgwMiw1LjAwMDQxNjY3IEwxMS41MDE4ODAyLDUuMDAwNDE2NjcgWiIgaWQ9InBhdGgiIGZpbGw9IiNFOTcwMjUiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-info.svg?')},"./icons/icon-info.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-info.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataNote/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataNote/avoindataNote.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataNote)\n/* harmony export */ });\n/* harmony import */ var _avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNoteEditing */ "./src/avoindataNote/avoindataNoteEditing.js");\n/* harmony import */ var _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataNoteUI */ "./src/avoindataNote/avoindataNoteUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataNote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNote.js?')},"./src/avoindataNote/avoindataNoteEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataNoteCommand */ \"./src/avoindataNote/insertAvoindataNoteCommand.js\");\n/* harmony import */ var _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-note.svg */ \"./icons/icon-note.svg\");\n\n\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataNote model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataNoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataNoteCommand',\n new _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataNote', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataNoteHeader', {\n // This is only to be used within avoindataNote.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataNote',\n allowChildren: ['avoindataNoteIcon', 'avoindataNoteTitle']\n });\n\n schema.register('avoindataNoteIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataNoteTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataNoteContent', {\n isLimit: true,\n allowIn: 'avoindataNote',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataNote inside avoindataNoteContent.\n if (\n (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) &&\n childDefinition.name === 'avoindataNote'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-icon'\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNote',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-note',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Note widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-note-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToStructure({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteEditing.js?")},"./src/avoindataNote/avoindataNoteUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-note.svg?source */ \"./icons/icon-note.svg?source\");\n/**\n * @file registers the avoindataNote toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataNoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataNote toolbar button.\n editor.ui.componentFactory.add('avoindataNote', (locale) => {\n const command = editor.commands.get('insertAvoindataNoteCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Note'),\n icon: _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataNoteCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteUI.js?")},"./src/avoindataNote/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataNote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNote */ "./src/avoindataNote/avoindataNote.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataNote: _avoindataNote__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/index.js?')},"./src/avoindataNote/insertAvoindataNoteCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataNoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataNoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataNote(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataNote is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataNote',\n );\n\n // If the cursor is not in a location where a avoindataNote can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataNote(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataNote = writer.createElement('avoindataNote');\n const avoindataNoteHeader = writer.createElement('avoindataNoteHeader');\n const avoindataNoteIcon = writer.createElement('avoindataNoteIcon');\n const avoindataNoteTitle = writer.createElement('avoindataNoteTitle');\n const avoindataNoteContent = writer.createElement('avoindataNoteContent');\n\n // Append the title and content elements to the avoindataNote, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataNoteHeader, avoindataNote);\n writer.append(avoindataNoteIcon, avoindataNoteHeader);\n writer.append(avoindataNoteTitle, avoindataNoteHeader);\n writer.append(avoindataNoteContent, avoindataNote);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataNoteTitle);\n writer.appendElement('paragraph', avoindataNoteContent);\n\n // Return the element to be added to the editor.\n return avoindataNote;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/insertAvoindataNoteCommand.js?")},"./icons/icon-note.svg":module=>{"use strict";eval('module.exports = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRTk3MDI1IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iSWNvbnMvQmFzaWMtaWNvbnMvaW5mbyIgZmlsbD0iI0U5NzAyNSIgc3Ryb2tlLXdpZHRoPSIxIiA+CiAgICAgICAgPHBhdGggZD0iTTEyLC0xLjI0MzQ0OTc5ZS0xNCBDMTguNjE3LC0xLjI0MzQ0OTc5ZS0xNCAyNCw1LjM4MyAyNCwxMiBDMjQsMTguNjE3IDE4LjYxNywyNCAxMiwyNCBDNS4zODMsMjQgMi4xMzE2MjgyMWUtMTQsMTguNjE3IDIuMTMxNjI4MjFlLTE0LDEyIEMyLjEzMTYyODIxZS0xNCw1LjM4MyA1LjM4MywtMS4yNDM0NDk3OWUtMTQgMTIsLTEuMjQzNDQ5NzllLTE0IFogTTEyLDIgQzYuNDg2LDIgMiw2LjQ4NiAyLDEyIEMyLDE3LjUxNCA2LjQ4NiwyMiAxMiwyMiBDMTcuNTE0LDIyIDIyLDE3LjUxNCAyMiwxMiBDMjIsNi40ODYgMTcuNTE0LDIgMTIsMiBaIE0xMi4wMDI4NzUsMTAuMDAwMzY0NiBDMTIuNTU0ODY5MiwxMC4wMDAzNjQ2IDEzLjAwMjg2NDYsMTAuNDQ4MzU5OSAxMy4wMDI4NjQ2LDExLjAwMDM1NDIgTDEzLjAwMjg2NDYsMTcuMDAwMjkxNyBMMTQuMDAyODU0MSwxNy4wMDAyOTE3IEMxNC41NTQ4NDg0LDE3LjAwMDI5MTcgMTUuMDAyODQzNywxNy40NDgyODcgMTUuMDAyODQzNywxOC4wMDAyODEzIEMxNS4wMDI4NDM3LDE4LjU1MjI3NTUgMTQuNTU0ODQ4NCwxOS4wMDAyNzA4IDE0LjAwMjg1NDEsMTkuMDAwMjcwOCBMOS45OTk4OTU4MywxOS4wMDAyNzA4IEM5LjQ0NzkwMTU4LDE5LjAwMDI3MDggOC45OTk5MDYyNSwxOC41NTIyNzU1IDguOTk5OTA2MjUsMTguMDAwMjgxMyBDOC45OTk5MDYyNSwxNy40NDgyODcgOS40NDc5MDE1OCwxNy4wMDAyOTE3IDkuOTk5ODk1ODMsMTcuMDAwMjkxNyBMMTAuOTk5ODg1NCwxNy4wMDAyOTE3IEwxMC45OTk4ODU0LDEyLjAwMDM0MzggTDkuOTk5ODk1ODMsMTIuMDAwMzQzOCBDOS40NDc5MDE1OCwxMi4wMDAzNDM4IDguOTk5OTA2MjUsMTEuNTUyMzQ4NCA4Ljk5OTkwNjI1LDExLjAwMDM1NDIgQzguOTk5OTA2MjUsMTAuNDQ4MzU5OSA5LjQ0NzkwMTU4LDEwLjAwMDM2NDYgOS45OTk4OTU4MywxMC4wMDAzNjQ2IEwxMi4wMDI4NzUsMTAuMDAwMzY0NiBaIE0xMS41MDE4ODAyLDUuMDAwNDE2NjcgQzEyLjMzMTg3MTUsNS4wMDA0MTY2NyAxMy4wMDI4NjQ2LDUuNjcyNDA5NjcgMTMuMDAyODY0Niw2LjUwMDQwMTA0IEMxMy4wMDI4NjQ2LDcuMjc5Njg3MDQgMTIuNDA4NDkwMSw3LjkyMDc4NzYzIDExLjY0NjU5NDUsNy45OTM1MTQ3NCBMMTEuNTAxNzU1Miw4LjAwMDM4NTQyIEwxMS41MDE3NTUyLDguMDAwMzg1NDIgTDExLjQ5OTg4MDIsOC4wMDAzODU0MiBDMTAuNjcwODg4OCw4LjAwMDM4NTQyIDkuOTk5ODk1ODMsNy4zMjgzOTI0MiA5Ljk5OTg5NTgzLDYuNTAwNDAxMDQgQzkuOTk5ODk1ODMsNS42NzI0MDk2NyAxMC42NzA4ODg4LDUuMDAwNDE2NjcgMTEuNDk5ODgwMiw1LjAwMDQxNjY3IEwxMS41MDE4ODAyLDUuMDAwNDE2NjcgWiIgaWQ9InBhdGgiIGZpbGw9IiNFOTcwMjUiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"./icons/icon-note.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataNote/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js new file mode 100644 index 0000000000..38999b6d92 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataSection/avoindataSection.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataSection)\n/* harmony export */ });\n/* harmony import */ var _avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSectionEditing */ "./src/avoindataSection/avoindataSectionEditing.js");\n/* harmony import */ var _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataSectionUI */ "./src/avoindataSection/avoindataSectionUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataSectionUI and AvoindataSectionEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataSection extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataSectionEditing and AvoindataSectionUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSection.js?')},"./src/avoindataSection/avoindataSectionEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataSectionCommand */ \"./src/avoindataSection/insertAvoindataSectionCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with section as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
Title
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataSection model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataSectionEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataSectionCommand',\n new _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataSection', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n allowAttributes: ['avoindataSectionId']\n });\n\n schema.register('avoindataSectionTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For section, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataSection.\n allowIn: 'avoindataSection',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataSectionContent', {\n isLimit: true,\n allowIn: 'avoindataSection',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataSection inside avoindataSectionContent.\n if (\n (context.endsWith('avoindataSectionContent') || context.endsWith('avoindataSectionTitle')) &&\n childDefinition.name === 'avoindataSection'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: (viewElement, { writer }) => {\n return writer.createElement('avoindataSection', { avoindataSectionId: viewElement.getAttribute('id') });\n },\n view: {\n name: 'div',\n classes: 'avoindata-section',\n attributes: ['id']\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer }) => {\n return writer.createContainerElement(\n 'div', { class: 'avoindata-section', id: modelElement.getAttribute('avoindataSectionId') }\n );\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-section',\n id: modelElement.getAttribute('avoindataSectionId')\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Section widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionEditing.js?")},"./src/avoindataSection/avoindataSectionUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./avoindataSectionView */ \"./src/avoindataSection/avoindataSectionView.js\");\n/* harmony import */ var _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-section.svg?source */ \"./icons/icon-section.svg?source\");\n/**\n * @file registers the avoindataSection toolbar button and binds functionality to it.\n */\n\n\n\n\n\n\nclass AvoindataSectionUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon];\n }\n\n init() {\n const editor = this.editor;\n // Create the balloon and the form view.\n this._balloon = editor.plugins.get(ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon);\n this.formView = this._createFormView();\n const command = editor.commands.get('insertAvoindataSectionCommand');\n\n // This will register the avoindataSection toolbar button.\n editor.ui.componentFactory.add('avoindataSection', (locale) => {\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Section widget'),\n icon: _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__,\n tooltip: true\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n /* this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataSectionCommand'),\n ); */\n\n // Show the UI on button click.\n this.listenTo(buttonView, 'execute', () => {\n this._showUI();\n });\n\n return buttonView;\n });\n }\n\n _createFormView() {\n const editor = this.editor;\n const formView = new _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__[\"default\"](editor.locale);\n\n // Execute the command after clicking the \"Save\" button.\n this.listenTo(formView, 'submit', () => {\n // Grab values from the input fields.\n const id = formView.idInputView.fieldView.element.value;\n\n editor.model.change(writer => {\n editor.execute('insertAvoindataSectionCommand', id);\n });\n\n // Hide the form view after submit.\n this._hideUI();\n });\n\n // Hide the form view after clicking the \"Cancel\" button.\n this.listenTo(formView, 'cancel', () => {\n this._hideUI();\n });\n\n // Hide the form view when clicking outside the balloon.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.clickOutsideHandler)({\n emitter: formView,\n activator: () => this._balloon.visibleView === formView,\n contextElements: [this._balloon.view.element],\n callback: () => this._hideUI()\n });\n\n return formView;\n }\n\n _showUI() {\n const selection = this.editor.model.document.selection;\n\n this._balloon.add({\n view: this.formView,\n position: this._getBalloonPositionData()\n });\n\n const id = selection.getSelectedElement()?.getAttribute('avoindataSectionId') || '';\n this.formView.idInputView.fieldView.value = id;\n\n this.formView.focus();\n }\n\n _hideUI() {\n // Clear the input field values and reset the form.\n this.formView.idInputView.fieldView.value = '';\n this.formView.element.reset();\n\n this._balloon.remove(this.formView);\n\n // Focus the editing view after inserting the abbreviation so the user can start typing the content\n // right away and keep the editor focused.\n this.editor.editing.view.focus();\n }\n\n _getBalloonPositionData() {\n const view = this.editor.editing.view;\n const viewDocument = view.document;\n let target = null;\n\n // Set a target position by converting view selection range to DOM\n target = () => view.domConverter.viewRangeToDom(viewDocument.selection.getFirstRange());\n\n return {\n target\n };\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionUI.js?")},"./src/avoindataSection/avoindataSectionView.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormView)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\n\nclass FormView extends ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.View {\n constructor(locale) {\n super(locale);\n\n this.heading = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabelView(this.locale);\n this.heading.setTemplate({\n tag: 'div',\n attributes: {\n class: ['title']\n },\n children: ['Avoindata section']\n })\n\n this.idInputView = this._createInput('Id');\n\n this.saveButtonView = this._createButton('Save', null, 'btn btn-primary');\n // Submit type of the button will trigger the submit event on entire form when clicked\n // (see submitHandler() in render() below).\n this.saveButtonView.type = 'submit';\n\n this.cancelButtonView = this._createButton('Cancel', null, 'btn btn-secondary');\n\n // Delegate ButtonView#execute to FormView#cancel\n this.cancelButtonView.delegate('execute').to(this, 'cancel');\n\n this.childViews = this.createCollection([\n this.heading,\n this.idInputView,\n this.saveButtonView,\n this.cancelButtonView\n ]);\n\n this.setTemplate({\n tag: 'form',\n attributes: {\n class: ['ck', 'ck-reset_all-excluded', 'avoindata-section-id-form'],\n tabindex: '-1'\n },\n children: this.childViews\n });\n }\n\n render() {\n super.render();\n\n // Submit the form when the user clicked the save button or pressed enter in the input.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.submitHandler)({\n view: this\n });\n }\n\n focus() {\n this.childViews.get(1).focus();\n }\n\n _createInput(label) {\n const labeledInput = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabeledFieldView(this.locale, ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.createLabeledInputText);\n\n labeledInput.label = label;\n\n return labeledInput;\n }\n\n _createButton(label, icon, className) {\n const button = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.ButtonView();\n\n button.set({\n label,\n icon,\n tooltip: true,\n class: className,\n withText: true,\n });\n\n return button;\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionView.js?")},"./src/avoindataSection/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataSection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSection */ "./src/avoindataSection/avoindataSection.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataSection: _avoindataSection__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/index.js?')},"./src/avoindataSection/insertAvoindataSectionCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataSectionCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataSectionCommand, which is executed when the avoindataSection\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataSectionCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute(id) {\n const { model } = this.editor;\n\n model.change((writer) => {\n const existingElement = writer.model.document.selection?.getSelectedElement();\n\n if (existingElement && existingElement.name == 'avoindataSection') {\n writer.setAttribute('avoindataSectionId', id, existingElement);\n } else {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n const avoindataSection = createAvoindataSection(writer, id);\n model.insertContent(avoindataSection);\n const selection = writer.createSelection(avoindataSection.getChild(0), 'in');\n writer.setSelection(selection)\n }\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataSection is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataSection',\n );\n\n // If the cursor is not in a location where a avoindataSection can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataSection(writer, id) {\n // Create instances of the elements registered with the editor in avoindataexpanderediting.js.\n const avoindataSection = writer.createElement('avoindataSection', { avoindataSectionId: id });\n const avoindataSectionTitle = writer.createElement('avoindataSectionTitle');\n const avoindataSectionContent = writer.createElement('avoindataSectionContent');\n\n // Append the title and content elements to the avoindataSection, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataSectionTitle, avoindataSection);\n writer.append(avoindataSectionContent, avoindataSection);\n\n // The text content will automatically be wrapped in a\n // `

`.\n const title = writer.createElement('paragraph');\n writer.insertText('Title', title, 0);\n writer.append(title, avoindataSectionTitle);\n const content = writer.createElement('paragraph');\n writer.insertText('Content', content, 0);\n writer.append(content, avoindataSectionContent);\n\n // Return the element to be added to the editor.\n return avoindataSection;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/insertAvoindataSectionCommand.js?")},"./icons/icon-section.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./icons/icon-section.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataSection/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js new file mode 100644 index 0000000000..ae0c1cfbf9 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js @@ -0,0 +1,23 @@ +/** + * @file This is what CKEditor refers to as a master (glue) plugin. Its role is + * just to load the “editing” and “UI” components of this Plugin. Those + * components could be included in this file, but + * + * I.e, this file's purpose is to integrate all the separate parts of the plugin + * before it's made discoverable via index.js. + */ + +// The contents of AvoindataExampleUI and AvoindataExampleEditing could be included in this +// file, but it is recommended to separate these concerns in different files. +import AvoindataExampleEditing from './avoindataExampleEditing'; +import AvoindataExampleUI from './avoindataExampleUI'; +import { Plugin } from 'ckeditor5/src/core'; + +export default class AvoindataExample extends Plugin { + // Note that AvoindataExampleEditing and AvoindataExampleUI also extend `Plugin`, but these + // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only + // discover the plugins explicitly exported in index.js. + static get requires() { + return [AvoindataExampleEditing, AvoindataExampleUI]; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js new file mode 100644 index 0000000000..394b0cac1c --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js @@ -0,0 +1,210 @@ +import { Plugin } from 'ckeditor5/src/core'; +import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; +import { Widget } from 'ckeditor5/src/widget'; +import InsertAvoindataExampleCommand from './insertAvoindataExampleCommand'; + +/** + * CKEditor 5 plugins do not work directly with the DOM. They are defined as + * plugin-specific data models that are then converted to markup that + * is inserted in the DOM. + * + * CKEditor 5 internally interacts with expander as this model: + * + * + * + * + * + * Which is converted for the browser/user as this markup + *

+ *
+ *
Title
+ *
+ *
Content
+ *
+ * + * This file has the logic for defining the avoindataExample model, and for how it is + * converted to standard DOM markup. + */ +export default class AvoindataExampleEditing extends Plugin { + static get requires() { + return [Widget]; + } + + init() { + this._defineSchema(); + this._defineConverters(); + this.editor.commands.add( + 'insertAvoindataExampleCommand', + new InsertAvoindataExampleCommand(this.editor), + ); + } + + /* + * This registers the structure that will be seen by CKEditor 5 as + * + * + * + * + * + * The logic in _defineConverters() will determine how this is converted to + * markup. + */ + _defineSchema() { + // Schemas are registered via the central `editor` object. + const schema = this.editor.model.schema; + + schema.register('avoindataExample', { + // Behaves like a self-contained object (e.g. an image). + isObject: true, + // Allow in places where other blocks are allowed (e.g. directly in the root). + allowWhere: '$block', + }); + + schema.register('avoindataExampleTitle', { + // This creates a boundary for external actions such as clicking and + // and keypress. For example, when the cursor is inside this box, the + // keyboard shortcut for "select all" will be limited to the contents of + // the box. + isLimit: true, + // This is only to be used within avoindataExample. + allowIn: 'avoindataExample', + // Allow content that is allowed in blocks (e.g. text with attributes). + allowContentOf: '$root', + }); + + schema.register('avoindataExampleContent', { + isLimit: true, + allowIn: 'avoindataExample', + allowContentOf: '$root', + }); + + schema.addChildCheck((context, childDefinition) => { + // Disallow avoindataExample inside avoindataExampleContent. + if ( + (context.endsWith('avoindataExampleContent') || context.endsWith('avoindataExampleTitle')) && + childDefinition.name === 'avoindataExample' + ) { + return false; + } + }); + } + + /** + * Converters determine how CKEditor 5 models are converted into markup and + * vice-versa. + */ + _defineConverters() { + // Converters are registered via the central editor object. + const { conversion } = this.editor; + + // Upcast Converters: determine how existing HTML is interpreted by the + // editor. These trigger when an editor instance loads. + // + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model. + conversion.for('upcast').elementToElement({ + model: 'avoindataExample', + view: { + name: 'div', + classes: 'avoindata-example', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of , + // as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataExampleTitle', + view: { + name: 'div', + classes: 'avoindata-example-title', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of + // , as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataExampleContent', + view: { + name: 'div', + classes: 'avoindata-example-content', + }, + }); + + // Data Downcast Converters: converts stored model data into HTML. + // These trigger when content is saved. + // + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataExample', + view: { + name: 'div', + classes: 'avoindata-example', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataExampleTitle', + view: { + name: 'div', + classes: 'avoindata-example-title', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataExampleContent', + view: { + name: 'div', + classes: 'avoindata-example-content', + }, + }); + + // Editing Downcast Converters. These render the content to the user for + // editing, i.e. this determines what gets seen in the editor. These trigger + // after the Data Upcast Converters, and are re-triggered any time there + // are changes to any of the models' properties. + // + // Convert the model into a container widget in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataExample', + view: (modelElement, { writer: viewWriter }) => { + const section = viewWriter.createContainerElement('div', { + class: 'avoindata-example', + }); + + return toWidget(section, viewWriter, { label: 'Avoindata Example widget' }); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataExampleTitle', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-example-title', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataExampleContent', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-example-content', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js new file mode 100644 index 0000000000..1f119ef030 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js @@ -0,0 +1,36 @@ +/** + * @file registers the avoindataExample toolbar button and binds functionality to it. + */ + +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import icon from '../../icons/icon-example.svg?source'; + +export default class AvoindataExampleUI extends Plugin { + init() { + const editor = this.editor; + + // This will register the avoindataExample toolbar button. + editor.ui.componentFactory.add('avoindataExample', (locale) => { + const command = editor.commands.get('insertAvoindataExampleCommand'); + const buttonView = new ButtonView(locale); + + // Create the toolbar button. + buttonView.set({ + label: editor.t('Avoindata Example widget'), + icon, + tooltip: true, + }); + + // Bind the state of the button to the command. + buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + + // Execute the command when the button is clicked (executed). + this.listenTo(buttonView, 'execute', () => + editor.execute('insertAvoindataExampleCommand'), + ); + + return buttonView; + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/index.js new file mode 100644 index 0000000000..1d922c7019 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import AvoindataExample from './avoindataExample'; + +export default { + AvoindataExample, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js new file mode 100644 index 0000000000..14ead525cb --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js @@ -0,0 +1,56 @@ +/** + * @file defines InsertAvoindataExampleCommand, which is executed when the avoindataExample + * toolbar button is pressed. + */ + +import { Command } from 'ckeditor5/src/core'; + +export default class InsertAvoindataExampleCommand extends Command { + execute() { + const { model } = this.editor; + + model.change((writer) => { + // Insert * at the current selection position + // in a way that will result in creating a valid model structure. + model.insertContent(createAvoindataExample(writer)); + }); + } + + refresh() { + const { model } = this.editor; + const { selection } = model.document; + + // Determine if the cursor (selection) is in a position where adding a + // avoindataExample is permitted. This is based on the schema of the model(s) + // currently containing the cursor. + const allowedIn = model.schema.findAllowedParent( + selection.getFirstPosition(), + 'avoindataExample', + ); + + // If the cursor is not in a location where a avoindataExample can be added, return + // null so the addition doesn't happen. + this.isEnabled = allowedIn !== null; + } +} + +function createAvoindataExample(writer) { + // Create instances of the elements registered with the editor in + // avoindataexpanderediting.js. + const avoindataExample = writer.createElement('avoindataExample'); + const avoindataExampleTitle = writer.createElement('avoindataExampleTitle'); + const avoindataExampleContent = writer.createElement('avoindataExampleContent'); + + // Append the title and content elements to the avoindataExample, which matches + // the parent/child relationship as defined in their schemas. + writer.append(avoindataExampleTitle, avoindataExample); + writer.append(avoindataExampleContent, avoindataExample); + + // The text content will automatically be wrapped in a + // `

`. + writer.appendElement('paragraph', avoindataExampleTitle); + writer.appendElement('paragraph', avoindataExampleContent); + + // Return the element to be added to the editor. + return avoindataExample; +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js index 8b1c581748..3f276dd0fd 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js @@ -20,7 +20,7 @@ import InsertAvoindataHintCommand from './insertAvoindataHintCommand'; * Which is converted for the browser/user as this markup *

*
- * + * *
Title
*
*
Content
@@ -48,9 +48,8 @@ export default class AvoindataHintEditing extends Plugin { * * * - * - * * + * * * * The logic in _defineConverters() will determine how this is converted to @@ -72,7 +71,7 @@ export default class AvoindataHintEditing extends Plugin { isObject: true, isSelectable: false, allowIn: 'avoindataHint', - allowChildren: ['avoindataHintIcon', 'avoindataHintTitle'] + allowChildren: ['avoindataHintIcon', 'avoindataHintContent'] }); schema.register('avoindataHintIcon', { @@ -87,28 +86,16 @@ export default class AvoindataHintEditing extends Plugin { allowAttributes: ['src', 'alt', 'class'] }); - schema.register('avoindataHintTitle', { - // This creates a boundary for external actions such as clicking and - // and keypress. For example, when the cursor is inside this box, the - // keyboard shortcut for "select all" will be limited to the contents of - // the box. - isLimit: true, - // This is only to be used within avoindataHint. - allowIn: 'avoindataHintHeader', - // Allow content that is allowed in blocks (e.g. text with attributes). - allowContentOf: '$root', - }); - schema.register('avoindataHintContent', { isLimit: true, - allowIn: 'avoindataHint', + allowIn: 'avoindataHintHeader', allowContentOf: '$root', }); schema.addChildCheck((context, childDefinition) => { // Disallow avoindataHint inside avoindataHintContent. if ( - (context.endsWith('avoindataHintContent') || context.endsWith('avoindataHintTitle')) && + context.endsWith('avoindataHintContent') && childDefinition.name === 'avoindataHint' ) { return false; @@ -154,18 +141,6 @@ export default class AvoindataHintEditing extends Plugin { }, }); - // If
is present in the existing markup - // processed by CKEditor, then CKEditor recognizes and loads it as a - // model, provided it is a child element of , - // as required by the schema. - conversion.for('upcast').elementToElement({ - model: 'avoindataHintTitle', - view: { - name: 'div', - classes: 'avoindata-hint-title', - }, - }); - // If
is present in the existing markup // processed by CKEditor, then CKEditor recognizes and loads it as a // model, provided it is a child element of @@ -202,7 +177,7 @@ export default class AvoindataHintEditing extends Plugin { }); // Instances of are saved as - // Avoindata Hint icon
. + // Avoindata Hint icon
. conversion.for('dataDowncast').elementToElement({ model: 'avoindataHintIcon', view: (modelElement, { writer }) => { @@ -210,16 +185,6 @@ export default class AvoindataHintEditing extends Plugin { } }); - // Instances of are saved as - //
{{inner content}}
. - conversion.for('dataDowncast').elementToElement({ - model: 'avoindataHintTitle', - view: { - name: 'div', - classes: 'avoindata-hint-title', - }, - }); - // Instances of are saved as //
{{inner content}}
. conversion.for('dataDowncast').elementToElement({ @@ -269,17 +234,6 @@ export default class AvoindataHintEditing extends Plugin { }, }); - // Convert the model into an editable
widget. - conversion.for('editingDowncast').elementToElement({ - model: 'avoindataHintTitle', - view: (modelElement, { writer: viewWriter }) => { - const div = viewWriter.createEditableElement('div', { - class: 'avoindata-hint-title', - }); - return toWidgetEditable(div, viewWriter); - }, - }); - // Convert the model into an editable
widget. conversion.for('editingDowncast').elementToElement({ model: 'avoindataHintContent', diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js index 149164848f..76d44236fb 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js @@ -4,7 +4,7 @@ import { Plugin } from 'ckeditor5/src/core'; import { ButtonView } from 'ckeditor5/src/ui'; -import icon from '../../icons/icon-info.svg?source'; +import icon from '../../icons/icon-hint.svg?source'; export default class AvoindataHintUI extends Plugin { init() { diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js index c80724ffec..133492590f 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js @@ -40,19 +40,16 @@ function createAvoindataHint(writer) { const avoindataHint = writer.createElement('avoindataHint'); const avoindataHintHeader = writer.createElement('avoindataHintHeader'); const avoindataHintIcon = writer.createElement('avoindataHintIcon'); - const avoindataHintTitle = writer.createElement('avoindataHintTitle'); const avoindataHintContent = writer.createElement('avoindataHintContent'); // Append the title and content elements to the avoindataHint, which matches // the parent/child relationship as defined in their schemas. writer.append(avoindataHintHeader, avoindataHint); writer.append(avoindataHintIcon, avoindataHintHeader); - writer.append(avoindataHintTitle, avoindataHintHeader); - writer.append(avoindataHintContent, avoindataHint); + writer.append(avoindataHintContent, avoindataHintHeader); // The text content will automatically be wrapped in a // `

`. - writer.appendElement('paragraph', avoindataHintTitle); writer.appendElement('paragraph', avoindataHintContent); // Return the element to be added to the editor. diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js index 8a2c320553..a58a96b854 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js @@ -2,7 +2,7 @@ import { Plugin } from 'ckeditor5/src/core'; import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; import { Widget } from 'ckeditor5/src/widget'; import InsertAvoindataNoteCommand from './insertAvoindataNoteCommand'; -import icon from '../../icons/icon-info.svg'; +import icon from '../../icons/icon-note.svg'; /** @@ -22,7 +22,7 @@ import icon from '../../icons/icon-info.svg'; * Which is converted for the browser/user as this markup *

*
- * + * *
Title
*
*
Content
@@ -204,7 +204,7 @@ export default class AvoindataNoteEditing extends Plugin { }); // Instances of are saved as - // Avoindata Note icon
. + // Avoindata Note icon
. conversion.for('dataDowncast').elementToElement({ model: 'avoindataNoteIcon', view: (modelElement, { writer }) => { diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js index 910e8a6e21..6bcde32ead 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteUI.js @@ -4,7 +4,7 @@ import { Plugin } from 'ckeditor5/src/core'; import { ButtonView } from 'ckeditor5/src/ui'; -import icon from '../../icons/icon-info.svg?source'; +import icon from '../../icons/icon-note.svg?source'; export default class AvoindataNoteUI extends Plugin { init() { diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js new file mode 100644 index 0000000000..278d47b213 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js @@ -0,0 +1,23 @@ +/** + * @file This is what CKEditor refers to as a master (glue) plugin. Its role is + * just to load the “editing” and “UI” components of this Plugin. Those + * components could be included in this file, but + * + * I.e, this file's purpose is to integrate all the separate parts of the plugin + * before it's made discoverable via index.js. + */ + +// The contents of AvoindataSectionUI and AvoindataSectionEditing could be included in this +// file, but it is recommended to separate these concerns in different files. +import AvoindataSectionEditing from './avoindataSectionEditing'; +import AvoindataSectionUI from './avoindataSectionUI'; +import { Plugin } from 'ckeditor5/src/core'; + +export default class AvoindataSection extends Plugin { + // Note that AvoindataSectionEditing and AvoindataSectionUI also extend `Plugin`, but these + // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only + // discover the plugins explicitly exported in index.js. + static get requires() { + return [AvoindataSectionEditing, AvoindataSectionUI]; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js new file mode 100644 index 0000000000..5b8fb31a9a --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js @@ -0,0 +1,220 @@ +import { Plugin } from 'ckeditor5/src/core'; +import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; +import { Widget } from 'ckeditor5/src/widget'; +import InsertAvoindataSectionCommand from './insertAvoindataSectionCommand'; + +/** + * CKEditor 5 plugins do not work directly with the DOM. They are defined as + * plugin-specific data models that are then converted to markup that + * is inserted in the DOM. + * + * CKEditor 5 internally interacts with section as this model: + * + * + * + * + * + * Which is converted for the browser/user as this markup + *
+ *
Title
+ *
Content
+ *
+ * + * This file has the logic for defining the avoindataSection model, and for how it is + * converted to standard DOM markup. + */ +export default class AvoindataSectionEditing extends Plugin { + static get requires() { + return [Widget]; + } + + init() { + this._defineSchema(); + this._defineConverters(); + this.editor.commands.add( + 'insertAvoindataSectionCommand', + new InsertAvoindataSectionCommand(this.editor), + ); + } + + /* + * This registers the structure that will be seen by CKEditor 5 as + * + * + * + * + * + * The logic in _defineConverters() will determine how this is converted to + * markup. + */ + _defineSchema() { + // Schemas are registered via the central `editor` object. + const schema = this.editor.model.schema; + + schema.register('avoindataSection', { + // Behaves like a self-contained object (e.g. an image). + isObject: true, + // Allow in places where other blocks are allowed (e.g. directly in the root). + allowWhere: '$block', + allowAttributes: ['avoindataSectionId'] + }); + + schema.register('avoindataSectionTitle', { + // This creates a boundary for external actions such as clicking and + // and keypress. For section, when the cursor is inside this box, the + // keyboard shortcut for "select all" will be limited to the contents of + // the box. + isLimit: true, + // This is only to be used within avoindataSection. + allowIn: 'avoindataSection', + // Allow content that is allowed in blocks (e.g. text with attributes). + allowContentOf: '$root', + }); + + schema.register('avoindataSectionContent', { + isLimit: true, + allowIn: 'avoindataSection', + allowContentOf: '$root', + }); + + schema.addChildCheck((context, childDefinition) => { + // Disallow avoindataSection inside avoindataSectionContent. + if ( + (context.endsWith('avoindataSectionContent') || context.endsWith('avoindataSectionTitle')) && + childDefinition.name === 'avoindataSection' + ) { + return false; + } + }); + } + + /** + * Converters determine how CKEditor 5 models are converted into markup and + * vice-versa. + */ + _defineConverters() { + // Converters are registered via the central editor object. + const { conversion } = this.editor; + + // Upcast Converters: determine how existing HTML is interpreted by the + // editor. These trigger when an editor instance loads. + // + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model. + conversion.for('upcast').elementToElement({ + model: (viewElement, { writer }) => { + return writer.createElement('avoindataSection', { avoindataSectionId: viewElement.getAttribute('id') }); + }, + view: { + name: 'div', + classes: 'avoindata-section', + attributes: ['id'] + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of , + // as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataSectionTitle', + view: { + name: 'div', + classes: 'avoindata-section-title', + }, + }); + + // If
is present in the existing markup + // processed by CKEditor, then CKEditor recognizes and loads it as a + // model, provided it is a child element of + // , as required by the schema. + conversion.for('upcast').elementToElement({ + model: 'avoindataSectionContent', + view: { + name: 'div', + classes: 'avoindata-section-content', + }, + }); + + // Data Downcast Converters: converts stored model data into HTML. + // These trigger when content is saved. + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: { + name: 'avoindataSection', + attributes: ['avoindataSectionId'] + }, + view: (modelElement, { writer }) => { + return writer.createContainerElement( + 'div', { class: 'avoindata-section', id: modelElement.getAttribute('avoindataSectionId') } + ); + } + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataSectionTitle', + view: { + name: 'div', + classes: 'avoindata-section-title', + }, + }); + + // Instances of are saved as + //
{{inner content}}
. + conversion.for('dataDowncast').elementToElement({ + model: 'avoindataSectionContent', + view: { + name: 'div', + classes: 'avoindata-section-content', + }, + }); + + // Editing Downcast Converters. These render the content to the user for + // editing, i.e. this determines what gets seen in the editor. These trigger + // after the Data Upcast Converters, and are re-triggered any time there + // are changes to any of the models' properties. + // + // Convert the model into a container widget in the editor UI. + conversion.for('editingDowncast').elementToElement({ + model: { + name: 'avoindataSection', + attributes: ['avoindataSectionId'] + }, + view: (modelElement, { writer: viewWriter }) => { + const section = viewWriter.createContainerElement('div', { + class: 'avoindata-section', + id: modelElement.getAttribute('avoindataSectionId') + }); + + return toWidget(section, viewWriter, { label: 'Avoindata Section widget' }); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataSectionTitle', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-section-title', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + + // Convert the model into an editable
widget. + conversion.for('editingDowncast').elementToElement({ + model: 'avoindataSectionContent', + view: (modelElement, { writer: viewWriter }) => { + const div = viewWriter.createEditableElement('div', { + class: 'avoindata-section-content', + }); + return toWidgetEditable(div, viewWriter); + }, + }); + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js new file mode 100644 index 0000000000..2c557b8626 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js @@ -0,0 +1,121 @@ +/** + * @file registers the avoindataSection toolbar button and binds functionality to it. + */ + +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView, ContextualBalloon, clickOutsideHandler } from 'ckeditor5/src/ui'; +import FormView from './avoindataSectionView'; +import icon from '../../icons/icon-section.svg?source'; + +export default class AvoindataSectionUI extends Plugin { + static get requires() { + return [ContextualBalloon]; + } + + init() { + const editor = this.editor; + // Create the balloon and the form view. + this._balloon = editor.plugins.get(ContextualBalloon); + this.formView = this._createFormView(); + const command = editor.commands.get('insertAvoindataSectionCommand'); + + // This will register the avoindataSection toolbar button. + editor.ui.componentFactory.add('avoindataSection', (locale) => { + const buttonView = new ButtonView(locale); + + // Create the toolbar button. + buttonView.set({ + label: editor.t('Avoindata Section widget'), + icon, + tooltip: true + }); + + // Bind the state of the button to the command. + buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + + // Execute the command when the button is clicked (executed). + /* this.listenTo(buttonView, 'execute', () => + editor.execute('insertAvoindataSectionCommand'), + ); */ + + // Show the UI on button click. + this.listenTo(buttonView, 'execute', () => { + this._showUI(); + }); + + return buttonView; + }); + } + + _createFormView() { + const editor = this.editor; + const formView = new FormView(editor.locale); + + // Execute the command after clicking the "Save" button. + this.listenTo(formView, 'submit', () => { + // Grab values from the input fields. + const id = formView.idInputView.fieldView.element.value; + + editor.model.change(writer => { + editor.execute('insertAvoindataSectionCommand', id); + }); + + // Hide the form view after submit. + this._hideUI(); + }); + + // Hide the form view after clicking the "Cancel" button. + this.listenTo(formView, 'cancel', () => { + this._hideUI(); + }); + + // Hide the form view when clicking outside the balloon. + clickOutsideHandler({ + emitter: formView, + activator: () => this._balloon.visibleView === formView, + contextElements: [this._balloon.view.element], + callback: () => this._hideUI() + }); + + return formView; + } + + _showUI() { + const selection = this.editor.model.document.selection; + + this._balloon.add({ + view: this.formView, + position: this._getBalloonPositionData() + }); + + const id = selection.getSelectedElement()?.getAttribute('avoindataSectionId') || ''; + this.formView.idInputView.fieldView.value = id; + + this.formView.focus(); + } + + _hideUI() { + // Clear the input field values and reset the form. + this.formView.idInputView.fieldView.value = ''; + this.formView.element.reset(); + + this._balloon.remove(this.formView); + + // Focus the editing view after inserting the abbreviation so the user can start typing the content + // right away and keep the editor focused. + this.editor.editing.view.focus(); + } + + _getBalloonPositionData() { + const view = this.editor.editing.view; + const viewDocument = view.document; + let target = null; + + // Set a target position by converting view selection range to DOM + target = () => view.domConverter.viewRangeToDom(viewDocument.selection.getFirstRange()); + + return { + target + }; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionView.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionView.js new file mode 100644 index 0000000000..60764955d4 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionView.js @@ -0,0 +1,87 @@ +import { + View, + LabeledFieldView, + createLabeledInputText, + ButtonView, + submitHandler, + LabelView, +} from 'ckeditor5/src/ui'; +import { icons } from 'ckeditor5/src/core'; + +export default class FormView extends View { + constructor(locale) { + super(locale); + + this.heading = new LabelView(this.locale); + this.heading.setTemplate({ + tag: 'div', + attributes: { + class: ['title'] + }, + children: ['Avoindata section'] + }) + + this.idInputView = this._createInput('Id'); + + this.saveButtonView = this._createButton('Save', null, 'btn btn-primary'); + // Submit type of the button will trigger the submit event on entire form when clicked + // (see submitHandler() in render() below). + this.saveButtonView.type = 'submit'; + + this.cancelButtonView = this._createButton('Cancel', null, 'btn btn-secondary'); + + // Delegate ButtonView#execute to FormView#cancel + this.cancelButtonView.delegate('execute').to(this, 'cancel'); + + this.childViews = this.createCollection([ + this.heading, + this.idInputView, + this.saveButtonView, + this.cancelButtonView + ]); + + this.setTemplate({ + tag: 'form', + attributes: { + class: ['ck', 'ck-reset_all-excluded', 'avoindata-section-id-form'], + tabindex: '-1' + }, + children: this.childViews + }); + } + + render() { + super.render(); + + // Submit the form when the user clicked the save button or pressed enter in the input. + submitHandler({ + view: this + }); + } + + focus() { + this.childViews.get(1).focus(); + } + + _createInput(label) { + const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText); + + labeledInput.label = label; + + return labeledInput; + } + + _createButton(label, icon, className) { + const button = new ButtonView(); + + button.set({ + label, + icon, + tooltip: true, + class: className, + withText: true, + }); + + return button; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/index.js new file mode 100644 index 0000000000..71e5e891dd --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import AvoindataSection from './avoindataSection'; + +export default { + AvoindataSection, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/insertAvoindataSectionCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/insertAvoindataSectionCommand.js new file mode 100644 index 0000000000..b7d0d87374 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/insertAvoindataSectionCommand.js @@ -0,0 +1,68 @@ +/** + * @file defines InsertAvoindataSectionCommand, which is executed when the avoindataSection + * toolbar button is pressed. + */ + +import { Command } from 'ckeditor5/src/core'; + +export default class InsertAvoindataSectionCommand extends Command { + execute(id) { + const { model } = this.editor; + + model.change((writer) => { + const existingElement = writer.model.document.selection?.getSelectedElement(); + + if (existingElement && existingElement.name == 'avoindataSection') { + writer.setAttribute('avoindataSectionId', id, existingElement); + } else { + // Insert * at the current selection position + // in a way that will result in creating a valid model structure. + const avoindataSection = createAvoindataSection(writer, id); + model.insertContent(avoindataSection); + const selection = writer.createSelection(avoindataSection.getChild(0), 'in'); + writer.setSelection(selection) + } + }); + } + + refresh() { + const { model } = this.editor; + const { selection } = model.document; + + // Determine if the cursor (selection) is in a position where adding a + // avoindataSection is permitted. This is based on the schema of the model(s) + // currently containing the cursor. + const allowedIn = model.schema.findAllowedParent( + selection.getFirstPosition(), + 'avoindataSection', + ); + + // If the cursor is not in a location where a avoindataSection can be added, return + // null so the addition doesn't happen. + this.isEnabled = allowedIn !== null; + } +} + +function createAvoindataSection(writer, id) { + // Create instances of the elements registered with the editor in avoindataexpanderediting.js. + const avoindataSection = writer.createElement('avoindataSection', { avoindataSectionId: id }); + const avoindataSectionTitle = writer.createElement('avoindataSectionTitle'); + const avoindataSectionContent = writer.createElement('avoindataSectionContent'); + + // Append the title and content elements to the avoindataSection, which matches + // the parent/child relationship as defined in their schemas. + writer.append(avoindataSectionTitle, avoindataSection); + writer.append(avoindataSectionContent, avoindataSection); + + // The text content will automatically be wrapped in a + // `

`. + const title = writer.createElement('paragraph'); + writer.insertText('Title', title, 0); + writer.append(title, avoindataSectionTitle); + const content = writer.createElement('paragraph'); + writer.insertText('Content', content, 0); + writer.append(content, avoindataSectionContent); + + // Return the element to be added to the editor. + return avoindataSection; +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js index bdadee20ec..b8badd640f 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js @@ -71,6 +71,10 @@ getDirectories('./src').forEach((dir) => { test: /\.svg$/, type: "asset/inline", }, + { + test: /\.css$/, + type: 'asset' + } ] }] diff --git a/drupal/scripts/init_drupal.sh b/drupal/scripts/init_drupal.sh index a4060c426d..284e7895ca 100644 --- a/drupal/scripts/init_drupal.sh +++ b/drupal/scripts/init_drupal.sh @@ -128,6 +128,7 @@ echo "enable custom modules.." [[ "$MODULE_INFO" != *"avoindata_guide"* ]] && drush pm:enable -y avoindata_guide [[ "$MODULE_INFO" != *"avoindata_user"* ]] && drush pm:enable -y avoindata_user [[ "$MODULE_INFO" != *"avoindata_ckeditor_plugins"* ]] && drush pm:enable -y avoindata_ckeditor_plugins +[[ "$MODULE_INFO" != *"avoindata_ckeditor5_plugins"* ]] && drush pm:enable -y avoindata_ckeditor5_plugins # enable custom theme + reload themes echo "enable theme and install theme configurations.." diff --git a/opendata-assets/src/less/drupal/custom-elements.less b/opendata-assets/src/less/drupal/custom-elements.less index 804b3e74ea..14bd699f1e 100644 --- a/opendata-assets/src/less/drupal/custom-elements.less +++ b/opendata-assets/src/less/drupal/custom-elements.less @@ -122,7 +122,8 @@ margin: 20px 0; } -.avoindata-hint-image { +.avoindata-hint-image, +.avoindata-hint-icon { display: inline-block; vertical-align: top; height: 24px; @@ -204,10 +205,16 @@ a.external-link { margin-top: 0; } - .avoindata-section__title { + .avoindata-section__title, + .avoindata-section-title { margin-top: 0; margin-bottom: @margin-bottom__section__title; font-size: @font-size__section-title; + + p { + line-height: 34px; + font-weight: 600; + } } } From d3a9c1e618c62e27aa173e443879365b8b4a1452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Mon, 2 Oct 2023 22:26:12 +0200 Subject: [PATCH 03/30] AV-2017: Add external link icons --- .../css/editor.css | 22 +++- .../avoindata-ckeditor5-plugins/css/style.css | 2 +- .../icons/icon-external-link.svg | 17 +++ .../js/externalLink.js | 2 +- .../src/externalLink/externalLink.js | 116 ++++++++---------- .../src/images/icon-external-link.svg | 17 +++ .../src/less/drupal/custom-elements.less | 30 +++-- 7 files changed, 120 insertions(+), 86 deletions(-) create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/icons/icon-external-link.svg create mode 100644 opendata-assets/src/images/icon-external-link.svg diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css index ee4c5377bd..138f280a18 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css @@ -1,4 +1,25 @@ +/* This selector targets the editable element (excluding comments). */ +.ck-editor__editable_inline:not(.ck-comment__input *) { + min-height: 300px; + overflow-y: auto; +} + .ck-content { + .external-link { + display: inline-flex; + flex-direction: row; + align-content: center; + + &::after { + content: ''; + width: 24px; + height: 24px; + transform: scale(0.6); + margin-left: 2px; + background-image: url(../icons/icon-external-link.svg); + } + } + .avoindata-expander { background:#f6f9fc; border-radius:2px; @@ -156,7 +177,6 @@ } } - .avoindata-section-id-form { padding: 8px; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css index 2c191543ff..0ef08dfe52 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css @@ -1,2 +1,2 @@ -.avoindata-expander{background:#f6f9fc;border-radius:2px;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1);box-shadow:0 2px 4px 1px rgba(41,41,41,.1);border:1px solid #ecedee;margin:0}.avoindata-expander+.avoindata-expander{margin-top:-1px}.avoindata-expander.open{background:#fff}.avoindata-expander.open .avoindata-expander-content,.avoindata-expander.open .avoindata-expander-content.collapse{display:block}.avoindata-expander-header{cursor:pointer}.avoindata-expander-title{color:#2a6ebb;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:600;padding:20px 0 20px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block;max-width:90%}.avoindata-expander-content{display:none;padding:0 20px 15px 20px;color:#000;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px}.avoindata-expander-content.cke_widget_editable{display:block}.avoindata-expander-header .icon-wrapper{float:right;padding-right:20px;padding-top:24px}.avoindata-expander-header .icon-wrapper i{color:#2a6ebb}.avoindata-expander-group-toggler{text-decoration:none;color:#2a6ebb;cursor:pointer;margin-bottom:10px}.avoindata-note-header-image,.avoindata-note-icon{height:24px;width:24px;margin-left:20px;margin-top:auto}.avoindata-note{background:#f7f7f8;border-radius:0;margin-top:20px;margin-bottom:20px}.avoindata-note-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:20px;font-weight:600;line-height:28px;padding:19px 0 13px 15px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-note-title>:last-child{margin:0}.avoindata-note-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 20px}.avoindata-expander-content p:last-of-type,.avoindata-hint-content p:last-of-type,.avoindata-note-content p:last-of-type{margin-bottom:0}.avoindata-hint{margin:20px 0}.avoindata-hint-image{display:inline-block;vertical-align:top;height:24px;width:24px;margin-left:20px}.avoindata-hint-content{width:calc(100% - 45px);display:inline-block;color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 15px}.avoindata-example{background:#fff;border-radius:2px;border:1.5px solid #2a6ebb;border-left:4.5px solid #2a6ebb;margin-top:20px;margin-bottom:20px}.avoindata-example-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:600;line-height:24px;padding:20px 20px 6px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-example-title>:last-child{margin:0}.avoindata-example-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:0 20px 20px 20px}a.external-link::after{font-family:"Fontawesome webfont",sans-serif;content:"\f08e"}a.external-link svg{margin-bottom:-2px;margin-left:4px;width:16px;height:16px;fill:#2a6ebb}.avoindata-section{background-color:#fff;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.2);box-shadow:0 2px 4px 1px rgba(41,41,41,.2);border-top:4px solid #2a6ebb;border-radius:4px 4px 0 0;margin:45px 0;padding:30px 30px}.avoindata-section:first-of-type{margin-top:0}.avoindata-section .avoindata-section__title{margin-top:0;margin-bottom:20px;font-size:22px}table{border-collapse:collapse;text-align:left}table caption{color:#222;font-weight:600;text-align:left;padding:20px 0}table td,table th{padding:7px 15px;border:1px solid #c8cdd0}table th{background-color:#f7f7f8;color:#222;font-weight:600}table td{color:#292929} +.external-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-line-pack:center;align-content:center}.external-link::after{content:'';width:24px;height:24px;-webkit-transform:scale(.6);transform:scale(.6);margin-left:2px;background-image:url(../images/icon-external-link.svg)}.avoindata-expander{background:#f6f9fc;border-radius:2px;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1);box-shadow:0 2px 4px 1px rgba(41,41,41,.1);border:1px solid #ecedee;margin:0}.avoindata-expander+.avoindata-expander{margin-top:-1px}.avoindata-expander.open{background:#fff}.avoindata-expander.open .avoindata-expander-content,.avoindata-expander.open .avoindata-expander-content.collapse{display:block}.avoindata-expander-header{cursor:pointer}.avoindata-expander-title{color:#2a6ebb;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:600;padding:20px 0 20px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block;max-width:90%}.avoindata-expander-content{display:none;padding:0 20px 15px 20px;color:#000;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px}.avoindata-expander-content.cke_widget_editable{display:block}.avoindata-expander-header .icon-wrapper{float:right;padding-right:20px;padding-top:24px}.avoindata-expander-header .icon-wrapper i{color:#2a6ebb}.avoindata-expander-group-toggler{text-decoration:none;color:#2a6ebb;cursor:pointer;margin-bottom:10px}.avoindata-note-header-image,.avoindata-note-icon{height:24px;width:24px;margin-left:20px;margin-top:auto}.avoindata-note{background:#f7f7f8;border-radius:0;margin-top:20px;margin-bottom:20px}.avoindata-note-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:20px;font-weight:600;line-height:28px;padding:19px 0 13px 15px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-note-title>:last-child{margin:0}.avoindata-note-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 20px}.avoindata-expander-content p:last-of-type,.avoindata-hint-content p:last-of-type,.avoindata-note-content p:last-of-type{margin-bottom:0}.avoindata-hint{margin:20px 0}.avoindata-hint-icon,.avoindata-hint-image{display:inline-block;vertical-align:top;height:24px;width:24px;margin-left:20px}.avoindata-hint-content{width:calc(100% - 45px);display:inline-block;color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 15px}.avoindata-example{background:#fff;border-radius:2px;border:1.5px solid #2a6ebb;border-left:4.5px solid #2a6ebb;margin-top:20px;margin-bottom:20px}.avoindata-example-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:600;line-height:24px;padding:20px 20px 6px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-example-title>:last-child{margin:0}.avoindata-example-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:0 20px 20px 20px}.avoindata-section{background-color:#fff;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.2);box-shadow:0 2px 4px 1px rgba(41,41,41,.2);border-top:4px solid #2a6ebb;border-radius:4px 4px 0 0;margin:45px 0;padding:30px 30px}.avoindata-section:first-of-type{margin-top:0}.avoindata-section .avoindata-section-title,.avoindata-section .avoindata-section__title{margin-top:0;margin-bottom:20px;font-size:22px}.avoindata-section .avoindata-section-title p,.avoindata-section .avoindata-section__title p{line-height:34px;font-weight:600}table{border-collapse:collapse;text-align:left}table caption{color:#222;font-weight:600;text-align:left;padding:20px 0}table td,table th{padding:7px 15px;border:1px solid #c8cdd0}table th{background-color:#f7f7f8;color:#222;font-weight:600}table td{color:#292929} /*# sourceMappingURL=maps/style.css.map */ diff --git a/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-external-link.svg b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-external-link.svg new file mode 100644 index 0000000000..a0707680ff --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/icons/icon-external-link.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js index 2755708d3d..3942a0e03d 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.externalLink=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/externalLink/externalLink.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ExternalLink)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\nclass ExternalLink extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n\tinit() {\n\t\tconsole.log('ExternalLink loaded')\n\t\tconst editor = this.editor;\n\t\tconst { model } = editor;\n\n\t\t// `listenTo()` and `editor` are available thanks to `Plugin`.\n\t\t// By using `listenTo()` you will ensure that the listener is removed when\n\t\t// the plugin is destroyed.\n\t\tthis.listenTo(editor.data, 'ready', () => {\n\t\t\tconst linkCommand = editor.commands.get('link');\n\t\t\tconst decorator = linkCommand.manualDecorators.get('linkIsExternal')\n\t\t\tconst selection = editor.model.document.selection;\n\n\t\t\tconsole.log(decorator)\n\n\t\t\t// Override default link manual decorator conversion to add an icon after the link\n\t\t\teditor.conversion.for( 'downcast' ).attributeToElement( {\n\t\t\t\tmodel: 'linkIsExternal',\n\t\t\t\tview: ( manualDecoratorValue, { writer, schema }, { item } ) => {\n\t\t\t\t\t// Manual decorators for block links are handled e.g. in LinkImageEditing.\n\t\t\t\t\tif ( !( item.is( 'selection' ) || schema.isInline( item ) ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( manualDecoratorValue ) {\n\t\t\t\t\t\tconst element = writer.createAttributeElement( 'a', decorator.attributes, { priority: 5 } );\n\n\t\t\t\t\t\tif ( decorator.classes ) {\n\t\t\t\t\t\t\twriter.addClass( decorator.classes, element );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( const key in decorator.styles ) {\n\t\t\t\t\t\t\twriter.setStyle( key, decorator.styles[ key ], element );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twriter.setCustomProperty( 'link', true, element );\n\n\t\t\t\t\t\treturn element;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.listenTo(linkCommand, 'execute', (evt, params) => {\n\t\t\t\tconst linkIsExternal = params[1]['linkIsExternal']\n\t\t\t\tconsole.log(evt)\n\t\t\t\tconsole.log(params)\n\t\t\t\tconsole.log('linkIsExternal', linkIsExternal)\n\t\t\t\tconsole.log('source', evt.source)\n\n\t\t\t\tif (linkIsExternal) {\n\t\t\t\t\tconsole.log('external link')\n\t\t\t\t\tconsole.log(editor.model.schema)\n\t\t\t\t\teditor.model.change(writer => {\n\t\t\t\t\t\tconsole.log('foo')\n\t\t\t\t\t\twriter.appendText('test', selection)\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('not an external link')\n\t\t\t\t}\n\t\t\t})\n\t\t});\n\t}\n\n\tstatic get pluginName() {\n\t\treturn 'ExternalLink';\n\t}\n}\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/externalLink.js?")},"./src/externalLink/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _externalLink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalLink */ "./src/externalLink/externalLink.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n ExternalLink: _externalLink__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/index.js?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.externalLink/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":t=>{"use strict";t.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t](n,n.exports,__webpack_require__),n.exports}__webpack_require__.d=(t,e)=>{for(var n in e)__webpack_require__.o(e,n)&&!__webpack_require__.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/externalLink/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.externalLink=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/externalLink/externalLink.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ExternalLink)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\nclass ExternalLink extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n /*\n const editor = this.editor;\n\n // `listenTo()` and `editor` are available thanks to `Plugin`.\n // By using `listenTo()` you will ensure that the listener is removed when\n // the plugin is destroyed.\n this.listenTo(editor.data, 'ready', () => {\n const linkCommand = editor.commands.get('link');\n const { selection } = editor.model.document;\n\n let linkCommandExecuting = false;\n\n linkCommand.on('execute', (evt, args) => {\n const linkIsExternal = args[1]['linkIsExternal']\n\n if (linkIsExternal) {\n if (linkCommandExecuting) {\n linkCommandExecuting = false;\n return;\n }\n\n // If the additional attribute was passed, we stop the default execution\n // of the LinkCommand. We're going to create Model#change() block for undo\n // and execute the LinkCommand together with setting the extra attribute.\n evt.stop();\n\n // Prevent infinite recursion by keeping records of when link command is\n // being executed by this function.\n linkCommandExecuting = true;\n\n // Wrapping the original command execution in a model.change() block to make sure there's a single undo step\n // when the extra attribute is added.\n\n editor.model.change(writer => {\n editor.execute('link', ...args);\n const link = selection.getLastPosition().nodeBefore;\n // writer.insertElement('avoindataExternalLink', selection.getLastPosition())\n });\n }\n })\n });\n */\n }\n\n static get pluginName() {\n return 'ExternalLink';\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/externalLink.js?")},"./src/externalLink/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _externalLink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalLink */ "./src/externalLink/externalLink.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n ExternalLink: _externalLink__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/index.js?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.externalLink/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}__webpack_require__.d=(e,n)=>{for(var r in n)__webpack_require__.o(n,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/externalLink/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js index ebe0510358..695c0909cc 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js @@ -1,70 +1,52 @@ import { Plugin } from 'ckeditor5/src/core'; export default class ExternalLink extends Plugin { - init() { - console.log('ExternalLink loaded') - const editor = this.editor; - const { model } = editor; - - // `listenTo()` and `editor` are available thanks to `Plugin`. - // By using `listenTo()` you will ensure that the listener is removed when - // the plugin is destroyed. - this.listenTo(editor.data, 'ready', () => { - const linkCommand = editor.commands.get('link'); - const decorator = linkCommand.manualDecorators.get('linkIsExternal') - const selection = editor.model.document.selection; - - console.log(decorator) - - // Override default link manual decorator conversion to add an icon after the link - editor.conversion.for( 'downcast' ).attributeToElement( { - model: 'linkIsExternal', - view: ( manualDecoratorValue, { writer, schema }, { item } ) => { - // Manual decorators for block links are handled e.g. in LinkImageEditing. - if ( !( item.is( 'selection' ) || schema.isInline( item ) ) ) { - return; - } - - if ( manualDecoratorValue ) { - const element = writer.createAttributeElement( 'a', decorator.attributes, { priority: 5 } ); - - if ( decorator.classes ) { - writer.addClass( decorator.classes, element ); - } - - for ( const key in decorator.styles ) { - writer.setStyle( key, decorator.styles[ key ], element ); - } - - writer.setCustomProperty( 'link', true, element ); - - return element; - } - } - } ); - - this.listenTo(linkCommand, 'execute', (evt, params) => { - const linkIsExternal = params[1]['linkIsExternal'] - console.log(evt) - console.log(params) - console.log('linkIsExternal', linkIsExternal) - console.log('source', evt.source) - - if (linkIsExternal) { - console.log('external link') - console.log(editor.model.schema) - editor.model.change(writer => { - console.log('foo') - writer.appendText('test', selection) - }); - } else { - console.log('not an external link') - } - }) - }); - } - - static get pluginName() { - return 'ExternalLink'; - } -} \ No newline at end of file + init() { + /* + const editor = this.editor; + + // `listenTo()` and `editor` are available thanks to `Plugin`. + // By using `listenTo()` you will ensure that the listener is removed when + // the plugin is destroyed. + this.listenTo(editor.data, 'ready', () => { + const linkCommand = editor.commands.get('link'); + const { selection } = editor.model.document; + + let linkCommandExecuting = false; + + linkCommand.on('execute', (evt, args) => { + const linkIsExternal = args[1]['linkIsExternal'] + + if (linkIsExternal) { + if (linkCommandExecuting) { + linkCommandExecuting = false; + return; + } + + // If the additional attribute was passed, we stop the default execution + // of the LinkCommand. We're going to create Model#change() block for undo + // and execute the LinkCommand together with setting the extra attribute. + evt.stop(); + + // Prevent infinite recursion by keeping records of when link command is + // being executed by this function. + linkCommandExecuting = true; + + // Wrapping the original command execution in a model.change() block to make sure there's a single undo step + // when the extra attribute is added. + + editor.model.change(writer => { + editor.execute('link', ...args); + const link = selection.getLastPosition().nodeBefore; + // writer.insertElement('avoindataExternalLink', selection.getLastPosition()) + }); + } + }) + }); + */ + } + + static get pluginName() { + return 'ExternalLink'; + } +} diff --git a/opendata-assets/src/images/icon-external-link.svg b/opendata-assets/src/images/icon-external-link.svg new file mode 100644 index 0000000000..a0707680ff --- /dev/null +++ b/opendata-assets/src/images/icon-external-link.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/opendata-assets/src/less/drupal/custom-elements.less b/opendata-assets/src/less/drupal/custom-elements.less index 14bd699f1e..25d15bd305 100644 --- a/opendata-assets/src/less/drupal/custom-elements.less +++ b/opendata-assets/src/less/drupal/custom-elements.less @@ -1,5 +1,19 @@ @import "../../../src/less/variables"; +.external-link { + display: inline-flex; + flex-direction: row; + align-items: center; + + &::after { + content: ''; + width: 24px; + height: 24px; + transform: scale(0.6); + background-image: url(../images/icon-external-link.svg); + } +} + .avoindata-expander { background: @background-color__expander; border-radius: 2px; @@ -178,21 +192,6 @@ padding: 0 20px 20px 20px; } -a.external-link { - &::after { - font-family: @font-family-icon; - content: "\f08e"; - } - - svg { - margin-bottom: -2px; - margin-left: 4px; - width: 16px; - height: 16px; - fill: @link-color; - } -} - .avoindata-section { background-color: @background-color__content; box-shadow: @box-shadow__section; @@ -245,4 +244,3 @@ table { color: @color--black; } } - From b23d5aa1a22d292d5f5eb1be96e7cf79fa46300e Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Wed, 4 Oct 2023 14:23:45 +0300 Subject: [PATCH 04/30] AV-1959: fix container state zulip notifications --- cdk/lib/lambda-stack.ts | 4 +- cdk/lib/monitoring-stack.ts | 5 +- cdk/lib/send-to-zulip.function.ts | 60 +++++++++++++------ cdk/lib/send-to-zulip.ts | 3 +- cdk/package-lock.json | 98 +++++++++++++++++++++++++++++++ cdk/package.json | 1 + 6 files changed, 148 insertions(+), 23 deletions(-) diff --git a/cdk/lib/lambda-stack.ts b/cdk/lib/lambda-stack.ts index afc7fa120a..fe0fbe6743 100644 --- a/cdk/lib/lambda-stack.ts +++ b/cdk/lib/lambda-stack.ts @@ -32,8 +32,8 @@ export class LambdaStack extends Stack { const sendToZulip = new SendToZulip(this, 'send-to-zulip', { zulipApiUser: 'avoindata-bot@turina.dvv.fi', - zulipApiUrl: 'https://turina.dvv.fi', - zulipStream: 'avoindata.fi', + zulipApiUrl: 'turina.dvv.fi', + zulipStream: 'Avoindata.fi', zulipTopic: 'Container restarts', envProps: props.envProps, env: props.env, diff --git a/cdk/lib/monitoring-stack.ts b/cdk/lib/monitoring-stack.ts index ea194523b4..f4616e1fc5 100644 --- a/cdk/lib/monitoring-stack.ts +++ b/cdk/lib/monitoring-stack.ts @@ -26,7 +26,10 @@ export class MonitoringStack extends Stack { eventPattern: { source: ['aws.ecs'], detail: { - message: [{suffix: 'failed container health checks.'}] + eventType: ['SERVICE_TASK_START_IMPAIRED', + 'SERVICE_DISCOVERY_INSTANCE_UNHEALTHY', + 'SERVICE_TASK_PLACEMENT_FAILURE', + 'SERVICE_TASK_CONFIGURATION_FAILURE'] } }, targets: [sendToDeveloperZulipTarget, taskHealthCheckFailLogGroupTarget], diff --git a/cdk/lib/send-to-zulip.function.ts b/cdk/lib/send-to-zulip.function.ts index 2c03ddb5ba..d9dd3c4562 100644 --- a/cdk/lib/send-to-zulip.function.ts +++ b/cdk/lib/send-to-zulip.function.ts @@ -1,10 +1,19 @@ -import {Handler, APIGatewayEvent} from 'aws-lambda'; +import {Handler} from 'aws-lambda'; import {GetSecretValueCommand, SecretsManagerClient} from "@aws-sdk/client-secrets-manager"; import * as https from 'https'; +import FormData = require('form-data'); const { ZULIP_API_URL, ZULIP_API_USER, ZULIP_API_KEY_SECRET, ZULIP_STREAM, ZULIP_TOPIC } = process.env; -export const handler: Handler = async (event: APIGatewayEvent) => { +export const handler: Handler = async (event: any) => { + if(!ZULIP_API_URL || !ZULIP_API_USER || !ZULIP_API_KEY_SECRET || + !ZULIP_STREAM || !ZULIP_TOPIC) { + return { + statusCode: 500, + body: 'Missing configuration values', + } + } + const secretsManagerClient = new SecretsManagerClient({region: "eu-west-1"}); const command = new GetSecretValueCommand({ SecretId: ZULIP_API_KEY_SECRET @@ -12,30 +21,43 @@ export const handler: Handler = async (event: APIGatewayEvent) => { const response = await secretsManagerClient.send(command); const zulipApiKey = response.SecretString; + const { resources, detail } = event; + const message = `${detail?.eventName}: ${resources?.join(', ')}`; + + const data = new FormData(); + data.append('type', 'stream'); + data.append('to', ZULIP_STREAM); + data.append('topic', ZULIP_TOPIC); + data.append('content', message); + const options: https.RequestOptions = { hostname: ZULIP_API_URL, port: 443, path: '/api/v1/messages', method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Basic ${Buffer.from(`${ZULIP_API_USER}:${zulipApiKey}`).toString('base64')}`, - }, + auth: `${ZULIP_API_USER}:${zulipApiKey}`, + headers: data.getHeaders(), }; - const { message } = JSON.parse(event.body || ''); - const data = { - type: 'stream', - to: ZULIP_STREAM, - topic: ZULIP_TOPIC, - content: message, - }; - - https.request(options, (res: any) => { - console.log('Response from Zulip API:', res.statusCode); - }).on('error', (error: any) => { - console.error('Error sending message to Zulip:', error); - }).end(JSON.stringify(data)); + await new Promise((resolve, reject) => { + const req = https.request(options, (res: any) => { + console.log('Response from Zulip API:', res.statusCode); + if(res.statusCode != 200) { + res.on('data', (chunk: any) => { + console.log(chunk.toString()); + }).on('end', () => { + resolve(res); + }); + } else { + resolve(res); + } + }).on('error', (error: any) => { + console.error('Error sending message to Zulip:', error); + reject(error); + }); + data.pipe(req); + req.end(); + }); return { statusCode: 200, diff --git a/cdk/lib/send-to-zulip.ts b/cdk/lib/send-to-zulip.ts index d22d052861..3093fc2554 100644 --- a/cdk/lib/send-to-zulip.ts +++ b/cdk/lib/send-to-zulip.ts @@ -9,7 +9,8 @@ export class SendToZulip extends Construct { super(scope, id); // Task restart zulip reporting - const zulipSecret = new sm.Secret(this, `/${props.environment}/opendata/common/zulip_api_key`); + const zulipSecret = new sm.Secret(this, `${props.environment}_zulip_api_key`); + this.lambda = new NodejsFunction(this, 'function', { environment: { ZULIP_API_USER: props.zulipApiUser, diff --git a/cdk/package-lock.json b/cdk/package-lock.json index 4b4d599432..b6ca9af3d8 100644 --- a/cdk/package-lock.json +++ b/cdk/package-lock.json @@ -12,6 +12,7 @@ "aws-cdk-lib": "^2.83.1", "constructs": "^10.0.0", "dotenv": "^10.0.0", + "form-data": "^4.0.0", "knex": "^2.4.2", "pg": "^8.11.0", "source-map-support": "^0.5.16" @@ -2271,6 +2272,11 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/aws-cdk": { "version": "2.84.0", "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.84.0.tgz", @@ -2953,6 +2959,17 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -3032,6 +3049,14 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3256,6 +3281,19 @@ "node": ">=8" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4708,6 +4746,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -7614,6 +7671,11 @@ "sprintf-js": "~1.0.2" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "aws-cdk": { "version": "2.84.0", "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.84.0.tgz", @@ -8067,6 +8129,14 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -8126,6 +8196,11 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8284,6 +8359,16 @@ "path-exists": "^4.0.0" } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -9369,6 +9454,19 @@ "picomatch": "^2.3.1" } }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", diff --git a/cdk/package.json b/cdk/package.json index ca07de9dd5..8c8dd663cf 100644 --- a/cdk/package.json +++ b/cdk/package.json @@ -25,6 +25,7 @@ "aws-cdk-lib": "^2.83.1", "constructs": "^10.0.0", "dotenv": "^10.0.0", + "form-data": "^4.0.0", "knex": "^2.4.2", "pg": "^8.11.0", "source-map-support": "^0.5.16" From 69ed09d9cf6c19332090a59755f2aed2fe6ac8b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Wed, 4 Oct 2023 13:25:09 +0200 Subject: [PATCH 05/30] AV-2017: Add conversions for previous ckeditor4 plugin formats --- .../css/editor.css | 50 +++++++-------- .../avoindata-ckeditor5-plugins/css/style.css | 2 +- .../js/avoindataHint.js | 2 +- .../js/avoindataNote.js | 2 +- .../js/avoindataSection.js | 2 +- .../js/externalLink.js | 2 +- .../src/avoindataHint/avoindataHintEditing.js | 64 ++++--------------- .../insertAvoindataHintCommand.js | 6 +- .../src/avoindataNote/avoindataNoteEditing.js | 48 +++----------- .../insertAvoindataNoteCommand.js | 6 +- .../avoindataSectionEditing.js | 22 ++++++- .../src/externalLink/externalLink.js | 61 ++++++++++++++++++ .../src/less/drupal/custom-elements.less | 10 +++ 13 files changed, 145 insertions(+), 132 deletions(-) diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css index 138f280a18..5b7cc4f1a5 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css @@ -52,27 +52,24 @@ margin-bottom: 20px; } - .avoindata-note-header { - .avoindata-note-icon { - height: 24px; - width: 24px; - float: left; - margin: 24px 6px 0 20px; - } + .avoindata-note-icon { + vertical-align: text-bottom; + height: 24px; + width: 24px; + display: inline-flex; + margin: 20px 10px 0 20px; + } - .avoindata-note-title { - font-size: 20px; - font-weight: 600; - line-height: 28px; - padding: 19px 0 13px 60px; - margin-block-start: 0; - margin-block-end: 0; - margin-inline-start: 0; - margin-inline-end: 0; - - > *:last-child { - margin: 0; - } + .avoindata-note-title { + display: inline-flex; + font-size: 20px; + font-weight: 600; + line-height: 28px; + padding: 10px 0; + width: calc(100% - 70px); + + > *:last-child { + margin: 0; } } @@ -91,16 +88,13 @@ .avoindata-hint { margin: 20px 0; + display: flex; } - .avoindata-hint-header { - display: flex; - .avoindata-hint-icon { - height: 24px; - width: 24px; - float: left; - margin: 20px 6px 0 20px; - } + .avoindata-hint-icon { + height: 24px; + width: 24px; + margin: 20px 10px 0 20px; } .avoindata-hint-content { diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css index 0ef08dfe52..66c0facdd8 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css @@ -1,2 +1,2 @@ -.external-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-line-pack:center;align-content:center}.external-link::after{content:'';width:24px;height:24px;-webkit-transform:scale(.6);transform:scale(.6);margin-left:2px;background-image:url(../images/icon-external-link.svg)}.avoindata-expander{background:#f6f9fc;border-radius:2px;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1);box-shadow:0 2px 4px 1px rgba(41,41,41,.1);border:1px solid #ecedee;margin:0}.avoindata-expander+.avoindata-expander{margin-top:-1px}.avoindata-expander.open{background:#fff}.avoindata-expander.open .avoindata-expander-content,.avoindata-expander.open .avoindata-expander-content.collapse{display:block}.avoindata-expander-header{cursor:pointer}.avoindata-expander-title{color:#2a6ebb;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:600;padding:20px 0 20px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block;max-width:90%}.avoindata-expander-content{display:none;padding:0 20px 15px 20px;color:#000;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px}.avoindata-expander-content.cke_widget_editable{display:block}.avoindata-expander-header .icon-wrapper{float:right;padding-right:20px;padding-top:24px}.avoindata-expander-header .icon-wrapper i{color:#2a6ebb}.avoindata-expander-group-toggler{text-decoration:none;color:#2a6ebb;cursor:pointer;margin-bottom:10px}.avoindata-note-header-image,.avoindata-note-icon{height:24px;width:24px;margin-left:20px;margin-top:auto}.avoindata-note{background:#f7f7f8;border-radius:0;margin-top:20px;margin-bottom:20px}.avoindata-note-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:20px;font-weight:600;line-height:28px;padding:19px 0 13px 15px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-note-title>:last-child{margin:0}.avoindata-note-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 20px}.avoindata-expander-content p:last-of-type,.avoindata-hint-content p:last-of-type,.avoindata-note-content p:last-of-type{margin-bottom:0}.avoindata-hint{margin:20px 0}.avoindata-hint-icon,.avoindata-hint-image{display:inline-block;vertical-align:top;height:24px;width:24px;margin-left:20px}.avoindata-hint-content{width:calc(100% - 45px);display:inline-block;color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 15px}.avoindata-example{background:#fff;border-radius:2px;border:1.5px solid #2a6ebb;border-left:4.5px solid #2a6ebb;margin-top:20px;margin-bottom:20px}.avoindata-example-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:600;line-height:24px;padding:20px 20px 6px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-example-title>:last-child{margin:0}.avoindata-example-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:0 20px 20px 20px}.avoindata-section{background-color:#fff;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.2);box-shadow:0 2px 4px 1px rgba(41,41,41,.2);border-top:4px solid #2a6ebb;border-radius:4px 4px 0 0;margin:45px 0;padding:30px 30px}.avoindata-section:first-of-type{margin-top:0}.avoindata-section .avoindata-section-title,.avoindata-section .avoindata-section__title{margin-top:0;margin-bottom:20px;font-size:22px}.avoindata-section .avoindata-section-title p,.avoindata-section .avoindata-section__title p{line-height:34px;font-weight:600}table{border-collapse:collapse;text-align:left}table caption{color:#222;font-weight:600;text-align:left;padding:20px 0}table td,table th{padding:7px 15px;border:1px solid #c8cdd0}table th{background-color:#f7f7f8;color:#222;font-weight:600}table td{color:#292929} +.external-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-line-pack:center;align-content:center}.external-link::after{content:'';width:24px;height:24px;-webkit-transform:scale(.6);transform:scale(.6);margin-left:2px;background-image:url(../images/icon-external-link.svg)}.avoindata-expander{background:#f6f9fc;border-radius:2px;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1);box-shadow:0 2px 4px 1px rgba(41,41,41,.1);border:1px solid #ecedee;margin:0}.avoindata-expander+.avoindata-expander{margin-top:-1px}.avoindata-expander.open{background:#fff}.avoindata-expander.open .avoindata-expander-content,.avoindata-expander.open .avoindata-expander-content.collapse{display:block}.avoindata-expander-header{cursor:pointer}.avoindata-expander-title{color:#2a6ebb;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:600;padding:20px 0 20px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block;max-width:90%}.avoindata-expander-content{display:none;padding:0 20px 15px 20px;color:#000;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px}.avoindata-expander-content.cke_widget_editable{display:block}.avoindata-expander-header .icon-wrapper{float:right;padding-right:20px;padding-top:24px}.avoindata-expander-header .icon-wrapper i{color:#2a6ebb}.avoindata-expander-group-toggler{text-decoration:none;color:#2a6ebb;cursor:pointer;margin-bottom:10px}.avoindata-note-header-image,.avoindata-note-icon{height:24px;width:24px;margin-left:20px;margin-top:auto}.avoindata-note{background:#f7f7f8;border-radius:0;margin-top:20px;margin-bottom:20px}.avoindata-note-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:20px;font-weight:600;line-height:28px;padding:19px 0 13px 15px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-note-title>:last-child{margin:0}.avoindata-note-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 20px}.avoindata-expander-content p:last-of-type,.avoindata-hint-content p:last-of-type,.avoindata-note-content p:last-of-type{margin-bottom:0}.avoindata-hint{margin:20px 0}.avoindata-hint-icon,.avoindata-hint-image{display:inline-block;vertical-align:top;height:24px;width:24px;margin-left:20px}.avoindata-hint-content{width:calc(100% - 45px);display:inline-block;color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 15px}.avoindata-example{background:#fff;border-radius:2px;border:1.5px solid #2a6ebb;border-left:4.5px solid #2a6ebb;margin-top:20px;margin-bottom:20px}.avoindata-example-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:600;line-height:24px;padding:20px 20px 6px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-example-title>:last-child{margin:0}.avoindata-example-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:0 20px 20px 20px}.avoindata-section{background-color:#fff;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.2);box-shadow:0 2px 4px 1px rgba(41,41,41,.2);border-top:4px solid #2a6ebb;border-radius:4px 4px 0 0;margin:45px 0;padding:30px 30px}.avoindata-section:first-of-type{margin-top:0}.avoindata-section .avoindata-section-title,.avoindata-section .avoindata-section-title{margin-top:0;margin-bottom:20px;font-size:22px}.avoindata-section .avoindata-section-title p,.avoindata-section .avoindata-section-title p{line-height:34px;font-weight:600}table{border-collapse:collapse;text-align:left}table caption{color:#222;font-weight:600;text-align:left;padding:20px 0}table td,table th{padding:7px 15px;border:1px solid #c8cdd0}table th{background-color:#f7f7f8;color:#222;font-weight:600}table td{color:#292929} /*# sourceMappingURL=maps/style.css.map */ diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js index 785ce8932a..3c5763d288 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js @@ -1 +1 @@ -!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(n.CKEditor5=n.CKEditor5||{},n.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataHint/avoindataHint.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataHint)\n/* harmony export */ });\n/* harmony import */ var _avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHintEditing */ "./src/avoindataHint/avoindataHintEditing.js");\n/* harmony import */ var _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataHintUI */ "./src/avoindataHint/avoindataHintUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataHint extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHint.js?')},"./src/avoindataHint/avoindataHintEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataHintCommand */ \"./src/avoindataHint/insertAvoindataHintCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataHint model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataHintEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataHintCommand',\n new _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataHint', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataHintHeader', {\n // This is only to be used within avoindataHint.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataHint',\n allowChildren: ['avoindataHintIcon', 'avoindataHintContent']\n });\n\n schema.register('avoindataHintIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHintHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataHintContent', {\n isLimit: true,\n allowIn: 'avoindataHintHeader',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataHint inside avoindataHintContent.\n if (\n context.endsWith('avoindataHintContent') &&\n childDefinition.name === 'avoindataHint'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-icon',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: {\n name: 'div',\n classes: 'avoindata-hint-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: \"avoindata-hint-icon\", src: '/themes/avoindata/images/avoindata-hint-icon.svg' })\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHint',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-hint',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Hint widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-hint-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createUIElement('img', {\n class: 'avoindata-hint-icon',\n src: \"/themes/avoindata/images/avoindata-hint-icon.svg\",\n alt: \"Avoindata Hint icon\",\n });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintEditing.js?")},"./src/avoindataHint/avoindataHintUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-hint.svg?source */ \"./icons/icon-hint.svg?source\");\n/**\n * @file registers the avoindataHint toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataHintUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataHint toolbar button.\n editor.ui.componentFactory.add('avoindataHint', (locale) => {\n const command = editor.commands.get('insertAvoindataHintCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Hint widget'),\n icon: _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataHintCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintUI.js?")},"./src/avoindataHint/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataHint__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHint */ "./src/avoindataHint/avoindataHint.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataHint: _avoindataHint__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/index.js?')},"./src/avoindataHint/insertAvoindataHintCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataHintCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataHintCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataHint(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataHint is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataHint',\n );\n\n // If the cursor is not in a location where a avoindataHint can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataHint(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataHint = writer.createElement('avoindataHint');\n const avoindataHintHeader = writer.createElement('avoindataHintHeader');\n const avoindataHintIcon = writer.createElement('avoindataHintIcon');\n const avoindataHintContent = writer.createElement('avoindataHintContent');\n\n // Append the title and content elements to the avoindataHint, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataHintHeader, avoindataHint);\n writer.append(avoindataHintIcon, avoindataHintHeader);\n writer.append(avoindataHintContent, avoindataHintHeader);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataHintContent);\n\n // Return the element to be added to the editor.\n return avoindataHint;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/insertAvoindataHintCommand.js?")},"./icons/icon-hint.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./icons/icon-hint.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":n=>{"use strict";n.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(n,e)=>{for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),__webpack_require__.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataHint/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(n.CKEditor5=n.CKEditor5||{},n.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataHint/avoindataHint.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataHint)\n/* harmony export */ });\n/* harmony import */ var _avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHintEditing */ "./src/avoindataHint/avoindataHintEditing.js");\n/* harmony import */ var _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataHintUI */ "./src/avoindataHint/avoindataHintUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataHint extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHint.js?')},"./src/avoindataHint/avoindataHintEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataHintCommand */ \"./src/avoindataHint/insertAvoindataHintCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataHint model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataHintEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataHintCommand',\n new _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataHint', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataHintIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHint',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataHintContent', {\n isLimit: true,\n allowIn: 'avoindataHint',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataHint inside avoindataHintContent.\n if (\n context.endsWith('avoindataHintContent') &&\n childDefinition.name === 'avoindataHint'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-icon',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('downcast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer }) => {\n return writer.createEmptyElement('img', { class: \"avoindata-hint-icon\", src: '/themes/avoindata/images/avoindata-hint-icon.svg' })\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHint',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-hint',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Hint widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-image',\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintEditing.js?")},"./src/avoindataHint/avoindataHintUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-hint.svg?source */ \"./icons/icon-hint.svg?source\");\n/**\n * @file registers the avoindataHint toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataHintUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataHint toolbar button.\n editor.ui.componentFactory.add('avoindataHint', (locale) => {\n const command = editor.commands.get('insertAvoindataHintCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Hint widget'),\n icon: _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataHintCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintUI.js?")},"./src/avoindataHint/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataHint__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHint */ "./src/avoindataHint/avoindataHint.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataHint: _avoindataHint__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/index.js?')},"./src/avoindataHint/insertAvoindataHintCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataHintCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataHintCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataHint(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataHint is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataHint',\n );\n\n // If the cursor is not in a location where a avoindataHint can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataHint(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataHint = writer.createElement('avoindataHint');\n const avoindataHintIcon = writer.createElement('avoindataHintIcon');\n const avoindataHintContent = writer.createElement('avoindataHintContent');\n\n // Append the title and content elements to the avoindataHint, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataHintIcon, avoindataHint);\n writer.append(avoindataHintContent, avoindataHint);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataHintContent);\n\n // Return the element to be added to the editor.\n return avoindataHint;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/insertAvoindataHintCommand.js?")},"./icons/icon-hint.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./icons/icon-hint.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":n=>{"use strict";n.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(n,e)=>{for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),__webpack_require__.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataHint/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js index a968e1872e..63f09b5469 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataNote/avoindataNote.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataNote)\n/* harmony export */ });\n/* harmony import */ var _avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNoteEditing */ "./src/avoindataNote/avoindataNoteEditing.js");\n/* harmony import */ var _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataNoteUI */ "./src/avoindataNote/avoindataNoteUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataNote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNote.js?')},"./src/avoindataNote/avoindataNoteEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataNoteCommand */ \"./src/avoindataNote/insertAvoindataNoteCommand.js\");\n/* harmony import */ var _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-note.svg */ \"./icons/icon-note.svg\");\n\n\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataNote model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataNoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataNoteCommand',\n new _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataNote', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataNoteHeader', {\n // This is only to be used within avoindataNote.\n isObject: true,\n isSelectable: false,\n allowIn: 'avoindataNote',\n allowChildren: ['avoindataNoteIcon', 'avoindataNoteTitle']\n });\n\n schema.register('avoindataNoteIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataNoteTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNoteHeader',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataNoteContent', {\n isLimit: true,\n allowIn: 'avoindataNote',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataNote inside avoindataNoteContent.\n if (\n (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) &&\n childDefinition.name === 'avoindataNote'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-icon'\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: {\n name: 'div',\n classes: 'avoindata-note-header',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNote',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-note',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Note widget' });\n },\n });\n\n // Convert the model into a container element in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteHeader',\n view: (modelElement, { writer: viewWriter }) => {\n return viewWriter.createContainerElement('div', {\n class: 'avoindata-note-header',\n });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToStructure({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteEditing.js?")},"./src/avoindataNote/avoindataNoteUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-note.svg?source */ \"./icons/icon-note.svg?source\");\n/**\n * @file registers the avoindataNote toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataNoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataNote toolbar button.\n editor.ui.componentFactory.add('avoindataNote', (locale) => {\n const command = editor.commands.get('insertAvoindataNoteCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Note'),\n icon: _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataNoteCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteUI.js?")},"./src/avoindataNote/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataNote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNote */ "./src/avoindataNote/avoindataNote.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataNote: _avoindataNote__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/index.js?')},"./src/avoindataNote/insertAvoindataNoteCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataNoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataNoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataNote(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataNote is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataNote',\n );\n\n // If the cursor is not in a location where a avoindataNote can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataNote(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataNote = writer.createElement('avoindataNote');\n const avoindataNoteHeader = writer.createElement('avoindataNoteHeader');\n const avoindataNoteIcon = writer.createElement('avoindataNoteIcon');\n const avoindataNoteTitle = writer.createElement('avoindataNoteTitle');\n const avoindataNoteContent = writer.createElement('avoindataNoteContent');\n\n // Append the title and content elements to the avoindataNote, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataNoteHeader, avoindataNote);\n writer.append(avoindataNoteIcon, avoindataNoteHeader);\n writer.append(avoindataNoteTitle, avoindataNoteHeader);\n writer.append(avoindataNoteContent, avoindataNote);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataNoteTitle);\n writer.appendElement('paragraph', avoindataNoteContent);\n\n // Return the element to be added to the editor.\n return avoindataNote;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/insertAvoindataNoteCommand.js?")},"./icons/icon-note.svg":module=>{"use strict";eval('module.exports = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRTk3MDI1IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iSWNvbnMvQmFzaWMtaWNvbnMvaW5mbyIgZmlsbD0iI0U5NzAyNSIgc3Ryb2tlLXdpZHRoPSIxIiA+CiAgICAgICAgPHBhdGggZD0iTTEyLC0xLjI0MzQ0OTc5ZS0xNCBDMTguNjE3LC0xLjI0MzQ0OTc5ZS0xNCAyNCw1LjM4MyAyNCwxMiBDMjQsMTguNjE3IDE4LjYxNywyNCAxMiwyNCBDNS4zODMsMjQgMi4xMzE2MjgyMWUtMTQsMTguNjE3IDIuMTMxNjI4MjFlLTE0LDEyIEMyLjEzMTYyODIxZS0xNCw1LjM4MyA1LjM4MywtMS4yNDM0NDk3OWUtMTQgMTIsLTEuMjQzNDQ5NzllLTE0IFogTTEyLDIgQzYuNDg2LDIgMiw2LjQ4NiAyLDEyIEMyLDE3LjUxNCA2LjQ4NiwyMiAxMiwyMiBDMTcuNTE0LDIyIDIyLDE3LjUxNCAyMiwxMiBDMjIsNi40ODYgMTcuNTE0LDIgMTIsMiBaIE0xMi4wMDI4NzUsMTAuMDAwMzY0NiBDMTIuNTU0ODY5MiwxMC4wMDAzNjQ2IDEzLjAwMjg2NDYsMTAuNDQ4MzU5OSAxMy4wMDI4NjQ2LDExLjAwMDM1NDIgTDEzLjAwMjg2NDYsMTcuMDAwMjkxNyBMMTQuMDAyODU0MSwxNy4wMDAyOTE3IEMxNC41NTQ4NDg0LDE3LjAwMDI5MTcgMTUuMDAyODQzNywxNy40NDgyODcgMTUuMDAyODQzNywxOC4wMDAyODEzIEMxNS4wMDI4NDM3LDE4LjU1MjI3NTUgMTQuNTU0ODQ4NCwxOS4wMDAyNzA4IDE0LjAwMjg1NDEsMTkuMDAwMjcwOCBMOS45OTk4OTU4MywxOS4wMDAyNzA4IEM5LjQ0NzkwMTU4LDE5LjAwMDI3MDggOC45OTk5MDYyNSwxOC41NTIyNzU1IDguOTk5OTA2MjUsMTguMDAwMjgxMyBDOC45OTk5MDYyNSwxNy40NDgyODcgOS40NDc5MDE1OCwxNy4wMDAyOTE3IDkuOTk5ODk1ODMsMTcuMDAwMjkxNyBMMTAuOTk5ODg1NCwxNy4wMDAyOTE3IEwxMC45OTk4ODU0LDEyLjAwMDM0MzggTDkuOTk5ODk1ODMsMTIuMDAwMzQzOCBDOS40NDc5MDE1OCwxMi4wMDAzNDM4IDguOTk5OTA2MjUsMTEuNTUyMzQ4NCA4Ljk5OTkwNjI1LDExLjAwMDM1NDIgQzguOTk5OTA2MjUsMTAuNDQ4MzU5OSA5LjQ0NzkwMTU4LDEwLjAwMDM2NDYgOS45OTk4OTU4MywxMC4wMDAzNjQ2IEwxMi4wMDI4NzUsMTAuMDAwMzY0NiBaIE0xMS41MDE4ODAyLDUuMDAwNDE2NjcgQzEyLjMzMTg3MTUsNS4wMDA0MTY2NyAxMy4wMDI4NjQ2LDUuNjcyNDA5NjcgMTMuMDAyODY0Niw2LjUwMDQwMTA0IEMxMy4wMDI4NjQ2LDcuMjc5Njg3MDQgMTIuNDA4NDkwMSw3LjkyMDc4NzYzIDExLjY0NjU5NDUsNy45OTM1MTQ3NCBMMTEuNTAxNzU1Miw4LjAwMDM4NTQyIEwxMS41MDE3NTUyLDguMDAwMzg1NDIgTDExLjQ5OTg4MDIsOC4wMDAzODU0MiBDMTAuNjcwODg4OCw4LjAwMDM4NTQyIDkuOTk5ODk1ODMsNy4zMjgzOTI0MiA5Ljk5OTg5NTgzLDYuNTAwNDAxMDQgQzkuOTk5ODk1ODMsNS42NzI0MDk2NyAxMC42NzA4ODg4LDUuMDAwNDE2NjcgMTEuNDk5ODgwMiw1LjAwMDQxNjY3IEwxMS41MDE4ODAyLDUuMDAwNDE2NjcgWiIgaWQ9InBhdGgiIGZpbGw9IiNFOTcwMjUiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"./icons/icon-note.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataNote/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataNote/avoindataNote.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataNote)\n/* harmony export */ });\n/* harmony import */ var _avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNoteEditing */ "./src/avoindataNote/avoindataNoteEditing.js");\n/* harmony import */ var _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataNoteUI */ "./src/avoindataNote/avoindataNoteUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataNote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNote.js?')},"./src/avoindataNote/avoindataNoteEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataNoteCommand */ \"./src/avoindataNote/insertAvoindataNoteCommand.js\");\n/* harmony import */ var _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-note.svg */ \"./icons/icon-note.svg\");\n\n\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataNote model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataNoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataNoteCommand',\n new _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataNote', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataNoteIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNote',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataNoteTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNote',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataNoteContent', {\n isLimit: true,\n allowIn: 'avoindataNote',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataNote inside avoindataNoteContent.\n if (\n (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) &&\n childDefinition.name === 'avoindataNote'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-icon'\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNote',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-note',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Note widget' });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToStructure({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-header-image'\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteEditing.js?")},"./src/avoindataNote/avoindataNoteUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-note.svg?source */ \"./icons/icon-note.svg?source\");\n/**\n * @file registers the avoindataNote toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataNoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataNote toolbar button.\n editor.ui.componentFactory.add('avoindataNote', (locale) => {\n const command = editor.commands.get('insertAvoindataNoteCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Note'),\n icon: _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataNoteCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteUI.js?")},"./src/avoindataNote/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataNote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNote */ "./src/avoindataNote/avoindataNote.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataNote: _avoindataNote__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/index.js?')},"./src/avoindataNote/insertAvoindataNoteCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataNoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataNoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataNote(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataNote is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataNote',\n );\n\n // If the cursor is not in a location where a avoindataNote can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataNote(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataNote = writer.createElement('avoindataNote');\n const avoindataNoteIcon = writer.createElement('avoindataNoteIcon');\n const avoindataNoteTitle = writer.createElement('avoindataNoteTitle');\n const avoindataNoteContent = writer.createElement('avoindataNoteContent');\n\n // Append the title and content elements to the avoindataNote, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataNoteIcon, avoindataNote);\n writer.append(avoindataNoteTitle, avoindataNote);\n writer.append(avoindataNoteContent, avoindataNote);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataNoteTitle);\n writer.appendElement('paragraph', avoindataNoteContent);\n\n // Return the element to be added to the editor.\n return avoindataNote;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/insertAvoindataNoteCommand.js?")},"./icons/icon-note.svg":module=>{"use strict";eval('module.exports = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRTk3MDI1IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iSWNvbnMvQmFzaWMtaWNvbnMvaW5mbyIgZmlsbD0iI0U5NzAyNSIgc3Ryb2tlLXdpZHRoPSIxIiA+CiAgICAgICAgPHBhdGggZD0iTTEyLC0xLjI0MzQ0OTc5ZS0xNCBDMTguNjE3LC0xLjI0MzQ0OTc5ZS0xNCAyNCw1LjM4MyAyNCwxMiBDMjQsMTguNjE3IDE4LjYxNywyNCAxMiwyNCBDNS4zODMsMjQgMi4xMzE2MjgyMWUtMTQsMTguNjE3IDIuMTMxNjI4MjFlLTE0LDEyIEMyLjEzMTYyODIxZS0xNCw1LjM4MyA1LjM4MywtMS4yNDM0NDk3OWUtMTQgMTIsLTEuMjQzNDQ5NzllLTE0IFogTTEyLDIgQzYuNDg2LDIgMiw2LjQ4NiAyLDEyIEMyLDE3LjUxNCA2LjQ4NiwyMiAxMiwyMiBDMTcuNTE0LDIyIDIyLDE3LjUxNCAyMiwxMiBDMjIsNi40ODYgMTcuNTE0LDIgMTIsMiBaIE0xMi4wMDI4NzUsMTAuMDAwMzY0NiBDMTIuNTU0ODY5MiwxMC4wMDAzNjQ2IDEzLjAwMjg2NDYsMTAuNDQ4MzU5OSAxMy4wMDI4NjQ2LDExLjAwMDM1NDIgTDEzLjAwMjg2NDYsMTcuMDAwMjkxNyBMMTQuMDAyODU0MSwxNy4wMDAyOTE3IEMxNC41NTQ4NDg0LDE3LjAwMDI5MTcgMTUuMDAyODQzNywxNy40NDgyODcgMTUuMDAyODQzNywxOC4wMDAyODEzIEMxNS4wMDI4NDM3LDE4LjU1MjI3NTUgMTQuNTU0ODQ4NCwxOS4wMDAyNzA4IDE0LjAwMjg1NDEsMTkuMDAwMjcwOCBMOS45OTk4OTU4MywxOS4wMDAyNzA4IEM5LjQ0NzkwMTU4LDE5LjAwMDI3MDggOC45OTk5MDYyNSwxOC41NTIyNzU1IDguOTk5OTA2MjUsMTguMDAwMjgxMyBDOC45OTk5MDYyNSwxNy40NDgyODcgOS40NDc5MDE1OCwxNy4wMDAyOTE3IDkuOTk5ODk1ODMsMTcuMDAwMjkxNyBMMTAuOTk5ODg1NCwxNy4wMDAyOTE3IEwxMC45OTk4ODU0LDEyLjAwMDM0MzggTDkuOTk5ODk1ODMsMTIuMDAwMzQzOCBDOS40NDc5MDE1OCwxMi4wMDAzNDM4IDguOTk5OTA2MjUsMTEuNTUyMzQ4NCA4Ljk5OTkwNjI1LDExLjAwMDM1NDIgQzguOTk5OTA2MjUsMTAuNDQ4MzU5OSA5LjQ0NzkwMTU4LDEwLjAwMDM2NDYgOS45OTk4OTU4MywxMC4wMDAzNjQ2IEwxMi4wMDI4NzUsMTAuMDAwMzY0NiBaIE0xMS41MDE4ODAyLDUuMDAwNDE2NjcgQzEyLjMzMTg3MTUsNS4wMDA0MTY2NyAxMy4wMDI4NjQ2LDUuNjcyNDA5NjcgMTMuMDAyODY0Niw2LjUwMDQwMTA0IEMxMy4wMDI4NjQ2LDcuMjc5Njg3MDQgMTIuNDA4NDkwMSw3LjkyMDc4NzYzIDExLjY0NjU5NDUsNy45OTM1MTQ3NCBMMTEuNTAxNzU1Miw4LjAwMDM4NTQyIEwxMS41MDE3NTUyLDguMDAwMzg1NDIgTDExLjQ5OTg4MDIsOC4wMDAzODU0MiBDMTAuNjcwODg4OCw4LjAwMDM4NTQyIDkuOTk5ODk1ODMsNy4zMjgzOTI0MiA5Ljk5OTg5NTgzLDYuNTAwNDAxMDQgQzkuOTk5ODk1ODMsNS42NzI0MDk2NyAxMC42NzA4ODg4LDUuMDAwNDE2NjcgMTEuNDk5ODgwMiw1LjAwMDQxNjY3IEwxMS41MDE4ODAyLDUuMDAwNDE2NjcgWiIgaWQ9InBhdGgiIGZpbGw9IiNFOTcwMjUiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"./icons/icon-note.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataNote/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js index 38999b6d92..efd16c8fcd 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataSection/avoindataSection.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataSection)\n/* harmony export */ });\n/* harmony import */ var _avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSectionEditing */ "./src/avoindataSection/avoindataSectionEditing.js");\n/* harmony import */ var _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataSectionUI */ "./src/avoindataSection/avoindataSectionUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataSectionUI and AvoindataSectionEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataSection extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataSectionEditing and AvoindataSectionUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSection.js?')},"./src/avoindataSection/avoindataSectionEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataSectionCommand */ \"./src/avoindataSection/insertAvoindataSectionCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with section as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
Title
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataSection model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataSectionEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataSectionCommand',\n new _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataSection', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n allowAttributes: ['avoindataSectionId']\n });\n\n schema.register('avoindataSectionTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For section, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataSection.\n allowIn: 'avoindataSection',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataSectionContent', {\n isLimit: true,\n allowIn: 'avoindataSection',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataSection inside avoindataSectionContent.\n if (\n (context.endsWith('avoindataSectionContent') || context.endsWith('avoindataSectionTitle')) &&\n childDefinition.name === 'avoindataSection'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: (viewElement, { writer }) => {\n return writer.createElement('avoindataSection', { avoindataSectionId: viewElement.getAttribute('id') });\n },\n view: {\n name: 'div',\n classes: 'avoindata-section',\n attributes: ['id']\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer }) => {\n return writer.createContainerElement(\n 'div', { class: 'avoindata-section', id: modelElement.getAttribute('avoindataSectionId') }\n );\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-section',\n id: modelElement.getAttribute('avoindataSectionId')\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Section widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionEditing.js?")},"./src/avoindataSection/avoindataSectionUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./avoindataSectionView */ \"./src/avoindataSection/avoindataSectionView.js\");\n/* harmony import */ var _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-section.svg?source */ \"./icons/icon-section.svg?source\");\n/**\n * @file registers the avoindataSection toolbar button and binds functionality to it.\n */\n\n\n\n\n\n\nclass AvoindataSectionUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon];\n }\n\n init() {\n const editor = this.editor;\n // Create the balloon and the form view.\n this._balloon = editor.plugins.get(ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon);\n this.formView = this._createFormView();\n const command = editor.commands.get('insertAvoindataSectionCommand');\n\n // This will register the avoindataSection toolbar button.\n editor.ui.componentFactory.add('avoindataSection', (locale) => {\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Section widget'),\n icon: _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__,\n tooltip: true\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n /* this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataSectionCommand'),\n ); */\n\n // Show the UI on button click.\n this.listenTo(buttonView, 'execute', () => {\n this._showUI();\n });\n\n return buttonView;\n });\n }\n\n _createFormView() {\n const editor = this.editor;\n const formView = new _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__[\"default\"](editor.locale);\n\n // Execute the command after clicking the \"Save\" button.\n this.listenTo(formView, 'submit', () => {\n // Grab values from the input fields.\n const id = formView.idInputView.fieldView.element.value;\n\n editor.model.change(writer => {\n editor.execute('insertAvoindataSectionCommand', id);\n });\n\n // Hide the form view after submit.\n this._hideUI();\n });\n\n // Hide the form view after clicking the \"Cancel\" button.\n this.listenTo(formView, 'cancel', () => {\n this._hideUI();\n });\n\n // Hide the form view when clicking outside the balloon.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.clickOutsideHandler)({\n emitter: formView,\n activator: () => this._balloon.visibleView === formView,\n contextElements: [this._balloon.view.element],\n callback: () => this._hideUI()\n });\n\n return formView;\n }\n\n _showUI() {\n const selection = this.editor.model.document.selection;\n\n this._balloon.add({\n view: this.formView,\n position: this._getBalloonPositionData()\n });\n\n const id = selection.getSelectedElement()?.getAttribute('avoindataSectionId') || '';\n this.formView.idInputView.fieldView.value = id;\n\n this.formView.focus();\n }\n\n _hideUI() {\n // Clear the input field values and reset the form.\n this.formView.idInputView.fieldView.value = '';\n this.formView.element.reset();\n\n this._balloon.remove(this.formView);\n\n // Focus the editing view after inserting the abbreviation so the user can start typing the content\n // right away and keep the editor focused.\n this.editor.editing.view.focus();\n }\n\n _getBalloonPositionData() {\n const view = this.editor.editing.view;\n const viewDocument = view.document;\n let target = null;\n\n // Set a target position by converting view selection range to DOM\n target = () => view.domConverter.viewRangeToDom(viewDocument.selection.getFirstRange());\n\n return {\n target\n };\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionUI.js?")},"./src/avoindataSection/avoindataSectionView.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormView)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\n\nclass FormView extends ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.View {\n constructor(locale) {\n super(locale);\n\n this.heading = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabelView(this.locale);\n this.heading.setTemplate({\n tag: 'div',\n attributes: {\n class: ['title']\n },\n children: ['Avoindata section']\n })\n\n this.idInputView = this._createInput('Id');\n\n this.saveButtonView = this._createButton('Save', null, 'btn btn-primary');\n // Submit type of the button will trigger the submit event on entire form when clicked\n // (see submitHandler() in render() below).\n this.saveButtonView.type = 'submit';\n\n this.cancelButtonView = this._createButton('Cancel', null, 'btn btn-secondary');\n\n // Delegate ButtonView#execute to FormView#cancel\n this.cancelButtonView.delegate('execute').to(this, 'cancel');\n\n this.childViews = this.createCollection([\n this.heading,\n this.idInputView,\n this.saveButtonView,\n this.cancelButtonView\n ]);\n\n this.setTemplate({\n tag: 'form',\n attributes: {\n class: ['ck', 'ck-reset_all-excluded', 'avoindata-section-id-form'],\n tabindex: '-1'\n },\n children: this.childViews\n });\n }\n\n render() {\n super.render();\n\n // Submit the form when the user clicked the save button or pressed enter in the input.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.submitHandler)({\n view: this\n });\n }\n\n focus() {\n this.childViews.get(1).focus();\n }\n\n _createInput(label) {\n const labeledInput = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabeledFieldView(this.locale, ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.createLabeledInputText);\n\n labeledInput.label = label;\n\n return labeledInput;\n }\n\n _createButton(label, icon, className) {\n const button = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.ButtonView();\n\n button.set({\n label,\n icon,\n tooltip: true,\n class: className,\n withText: true,\n });\n\n return button;\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionView.js?")},"./src/avoindataSection/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataSection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSection */ "./src/avoindataSection/avoindataSection.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataSection: _avoindataSection__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/index.js?')},"./src/avoindataSection/insertAvoindataSectionCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataSectionCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataSectionCommand, which is executed when the avoindataSection\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataSectionCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute(id) {\n const { model } = this.editor;\n\n model.change((writer) => {\n const existingElement = writer.model.document.selection?.getSelectedElement();\n\n if (existingElement && existingElement.name == 'avoindataSection') {\n writer.setAttribute('avoindataSectionId', id, existingElement);\n } else {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n const avoindataSection = createAvoindataSection(writer, id);\n model.insertContent(avoindataSection);\n const selection = writer.createSelection(avoindataSection.getChild(0), 'in');\n writer.setSelection(selection)\n }\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataSection is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataSection',\n );\n\n // If the cursor is not in a location where a avoindataSection can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataSection(writer, id) {\n // Create instances of the elements registered with the editor in avoindataexpanderediting.js.\n const avoindataSection = writer.createElement('avoindataSection', { avoindataSectionId: id });\n const avoindataSectionTitle = writer.createElement('avoindataSectionTitle');\n const avoindataSectionContent = writer.createElement('avoindataSectionContent');\n\n // Append the title and content elements to the avoindataSection, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataSectionTitle, avoindataSection);\n writer.append(avoindataSectionContent, avoindataSection);\n\n // The text content will automatically be wrapped in a\n // `

`.\n const title = writer.createElement('paragraph');\n writer.insertText('Title', title, 0);\n writer.append(title, avoindataSectionTitle);\n const content = writer.createElement('paragraph');\n writer.insertText('Content', content, 0);\n writer.append(content, avoindataSectionContent);\n\n // Return the element to be added to the editor.\n return avoindataSection;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/insertAvoindataSectionCommand.js?")},"./icons/icon-section.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./icons/icon-section.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataSection/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataSection/avoindataSection.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataSection)\n/* harmony export */ });\n/* harmony import */ var _avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSectionEditing */ "./src/avoindataSection/avoindataSectionEditing.js");\n/* harmony import */ var _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataSectionUI */ "./src/avoindataSection/avoindataSectionUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataSectionUI and AvoindataSectionEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataSection extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataSectionEditing and AvoindataSectionUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSection.js?')},"./src/avoindataSection/avoindataSectionEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataSectionCommand */ \"./src/avoindataSection/insertAvoindataSectionCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with section as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
Title
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataSection model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataSectionEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataSectionCommand',\n new _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataSection', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n allowAttributes: ['avoindataSectionId'],\n allowContentOf: '$block',\n });\n\n schema.register('avoindataSectionTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For section, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataSection.\n allowIn: 'avoindataSection',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataSectionContent', {\n isLimit: true,\n allowIn: 'avoindataSection',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataSection inside avoindataSectionContent.\n if (\n (context.endsWith('avoindataSectionContent') || context.endsWith('avoindataSectionTitle')) &&\n childDefinition.name === 'avoindataSection'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: (viewElement, { writer }) => {\n return writer.createElement('avoindataSection', { avoindataSectionId: viewElement.getAttribute('id') });\n },\n view: {\n name: 'div',\n classes: 'avoindata-section',\n attributes: ['id']\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer }) => {\n return writer.createContainerElement(\n 'div', { class: 'avoindata-section', id: modelElement.getAttribute('avoindataSectionId') }\n );\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-section',\n id: modelElement.getAttribute('avoindataSectionId')\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Section widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n\n\n // Extra converters for the older format ckeditor4 plugins\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'h3',\n classes: 'avoindata-section__title',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section__content',\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionEditing.js?")},"./src/avoindataSection/avoindataSectionUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./avoindataSectionView */ \"./src/avoindataSection/avoindataSectionView.js\");\n/* harmony import */ var _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-section.svg?source */ \"./icons/icon-section.svg?source\");\n/**\n * @file registers the avoindataSection toolbar button and binds functionality to it.\n */\n\n\n\n\n\n\nclass AvoindataSectionUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon];\n }\n\n init() {\n const editor = this.editor;\n // Create the balloon and the form view.\n this._balloon = editor.plugins.get(ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon);\n this.formView = this._createFormView();\n const command = editor.commands.get('insertAvoindataSectionCommand');\n\n // This will register the avoindataSection toolbar button.\n editor.ui.componentFactory.add('avoindataSection', (locale) => {\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Section widget'),\n icon: _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__,\n tooltip: true\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n /* this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataSectionCommand'),\n ); */\n\n // Show the UI on button click.\n this.listenTo(buttonView, 'execute', () => {\n this._showUI();\n });\n\n return buttonView;\n });\n }\n\n _createFormView() {\n const editor = this.editor;\n const formView = new _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__[\"default\"](editor.locale);\n\n // Execute the command after clicking the \"Save\" button.\n this.listenTo(formView, 'submit', () => {\n // Grab values from the input fields.\n const id = formView.idInputView.fieldView.element.value;\n\n editor.model.change(writer => {\n editor.execute('insertAvoindataSectionCommand', id);\n });\n\n // Hide the form view after submit.\n this._hideUI();\n });\n\n // Hide the form view after clicking the \"Cancel\" button.\n this.listenTo(formView, 'cancel', () => {\n this._hideUI();\n });\n\n // Hide the form view when clicking outside the balloon.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.clickOutsideHandler)({\n emitter: formView,\n activator: () => this._balloon.visibleView === formView,\n contextElements: [this._balloon.view.element],\n callback: () => this._hideUI()\n });\n\n return formView;\n }\n\n _showUI() {\n const selection = this.editor.model.document.selection;\n\n this._balloon.add({\n view: this.formView,\n position: this._getBalloonPositionData()\n });\n\n const id = selection.getSelectedElement()?.getAttribute('avoindataSectionId') || '';\n this.formView.idInputView.fieldView.value = id;\n\n this.formView.focus();\n }\n\n _hideUI() {\n // Clear the input field values and reset the form.\n this.formView.idInputView.fieldView.value = '';\n this.formView.element.reset();\n\n this._balloon.remove(this.formView);\n\n // Focus the editing view after inserting the abbreviation so the user can start typing the content\n // right away and keep the editor focused.\n this.editor.editing.view.focus();\n }\n\n _getBalloonPositionData() {\n const view = this.editor.editing.view;\n const viewDocument = view.document;\n let target = null;\n\n // Set a target position by converting view selection range to DOM\n target = () => view.domConverter.viewRangeToDom(viewDocument.selection.getFirstRange());\n\n return {\n target\n };\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionUI.js?")},"./src/avoindataSection/avoindataSectionView.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormView)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\n\nclass FormView extends ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.View {\n constructor(locale) {\n super(locale);\n\n this.heading = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabelView(this.locale);\n this.heading.setTemplate({\n tag: 'div',\n attributes: {\n class: ['title']\n },\n children: ['Avoindata section']\n })\n\n this.idInputView = this._createInput('Id');\n\n this.saveButtonView = this._createButton('Save', null, 'btn btn-primary');\n // Submit type of the button will trigger the submit event on entire form when clicked\n // (see submitHandler() in render() below).\n this.saveButtonView.type = 'submit';\n\n this.cancelButtonView = this._createButton('Cancel', null, 'btn btn-secondary');\n\n // Delegate ButtonView#execute to FormView#cancel\n this.cancelButtonView.delegate('execute').to(this, 'cancel');\n\n this.childViews = this.createCollection([\n this.heading,\n this.idInputView,\n this.saveButtonView,\n this.cancelButtonView\n ]);\n\n this.setTemplate({\n tag: 'form',\n attributes: {\n class: ['ck', 'ck-reset_all-excluded', 'avoindata-section-id-form'],\n tabindex: '-1'\n },\n children: this.childViews\n });\n }\n\n render() {\n super.render();\n\n // Submit the form when the user clicked the save button or pressed enter in the input.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.submitHandler)({\n view: this\n });\n }\n\n focus() {\n this.childViews.get(1).focus();\n }\n\n _createInput(label) {\n const labeledInput = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabeledFieldView(this.locale, ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.createLabeledInputText);\n\n labeledInput.label = label;\n\n return labeledInput;\n }\n\n _createButton(label, icon, className) {\n const button = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.ButtonView();\n\n button.set({\n label,\n icon,\n tooltip: true,\n class: className,\n withText: true,\n });\n\n return button;\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionView.js?")},"./src/avoindataSection/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataSection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSection */ "./src/avoindataSection/avoindataSection.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataSection: _avoindataSection__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/index.js?')},"./src/avoindataSection/insertAvoindataSectionCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataSectionCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataSectionCommand, which is executed when the avoindataSection\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataSectionCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute(id) {\n const { model } = this.editor;\n\n model.change((writer) => {\n const existingElement = writer.model.document.selection?.getSelectedElement();\n\n if (existingElement && existingElement.name == 'avoindataSection') {\n writer.setAttribute('avoindataSectionId', id, existingElement);\n } else {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n const avoindataSection = createAvoindataSection(writer, id);\n model.insertContent(avoindataSection);\n const selection = writer.createSelection(avoindataSection.getChild(0), 'in');\n writer.setSelection(selection)\n }\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataSection is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataSection',\n );\n\n // If the cursor is not in a location where a avoindataSection can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataSection(writer, id) {\n // Create instances of the elements registered with the editor in avoindataexpanderediting.js.\n const avoindataSection = writer.createElement('avoindataSection', { avoindataSectionId: id });\n const avoindataSectionTitle = writer.createElement('avoindataSectionTitle');\n const avoindataSectionContent = writer.createElement('avoindataSectionContent');\n\n // Append the title and content elements to the avoindataSection, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataSectionTitle, avoindataSection);\n writer.append(avoindataSectionContent, avoindataSection);\n\n // The text content will automatically be wrapped in a\n // `

`.\n const title = writer.createElement('paragraph');\n writer.insertText('Title', title, 0);\n writer.append(title, avoindataSectionTitle);\n const content = writer.createElement('paragraph');\n writer.insertText('Content', content, 0);\n writer.append(content, avoindataSectionContent);\n\n // Return the element to be added to the editor.\n return avoindataSection;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/insertAvoindataSectionCommand.js?")},"./icons/icon-section.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./icons/icon-section.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataSection/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js index 3942a0e03d..8ae19068f8 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.externalLink=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/externalLink/externalLink.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ExternalLink)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\nclass ExternalLink extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n /*\n const editor = this.editor;\n\n // `listenTo()` and `editor` are available thanks to `Plugin`.\n // By using `listenTo()` you will ensure that the listener is removed when\n // the plugin is destroyed.\n this.listenTo(editor.data, 'ready', () => {\n const linkCommand = editor.commands.get('link');\n const { selection } = editor.model.document;\n\n let linkCommandExecuting = false;\n\n linkCommand.on('execute', (evt, args) => {\n const linkIsExternal = args[1]['linkIsExternal']\n\n if (linkIsExternal) {\n if (linkCommandExecuting) {\n linkCommandExecuting = false;\n return;\n }\n\n // If the additional attribute was passed, we stop the default execution\n // of the LinkCommand. We're going to create Model#change() block for undo\n // and execute the LinkCommand together with setting the extra attribute.\n evt.stop();\n\n // Prevent infinite recursion by keeping records of when link command is\n // being executed by this function.\n linkCommandExecuting = true;\n\n // Wrapping the original command execution in a model.change() block to make sure there's a single undo step\n // when the extra attribute is added.\n\n editor.model.change(writer => {\n editor.execute('link', ...args);\n const link = selection.getLastPosition().nodeBefore;\n // writer.insertElement('avoindataExternalLink', selection.getLastPosition())\n });\n }\n })\n });\n */\n }\n\n static get pluginName() {\n return 'ExternalLink';\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/externalLink.js?")},"./src/externalLink/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _externalLink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalLink */ "./src/externalLink/externalLink.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n ExternalLink: _externalLink__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/index.js?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.externalLink/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}__webpack_require__.d=(e,n)=>{for(var r in n)__webpack_require__.o(n,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/externalLink/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.externalLink=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/externalLink/externalLink.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ExternalLink)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\nclass ExternalLink extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const { conversion } = this.editor;\n\n // Upcast Converter for the old ckeditor4 plugin format\n conversion.for('upcast').elementToAttribute({\n model: 'linkIsExternal',\n view: {\n name: 'a',\n classes: ['external'],\n attributes: ['aria-label', 'target'],\n },\n });\n\n // Extra consumption for the leftover svg icon\n conversion.for('upcast').add(dispatcher => {\n // Look for every view svg element.\n dispatcher.on('element:svg', (evt, data, conversionApi) => {\n // Get all the necessary items from the conversion API object.\n const {\n consumable\n } = conversionApi;\n\n // Get view item from data object.\n const { viewItem } = data;\n\n // Define elements consumables.\n const svg = { name: 'svg', attributes: ['viewBox'] };\n const use = { name: 'use', attributes: ['href'] };\n\n // Tests if the view element can be consumed.\n if (!consumable.test(viewItem, svg)) {\n return;\n }\n\n // Check if there is only one child.\n if (viewItem.childCount !== 1) {\n return;\n }\n\n // Get the first child element.\n const firstChildItem = viewItem.getChild(0);\n\n // Check if the first element is a div.\n if (!firstChildItem.is('element', 'use')) {\n return;\n }\n\n // Tests if the first child element can be consumed.\n if (!consumable.test(firstChildItem, use)) {\n return;\n }\n\n // If a use tag inside a svg has the string 'avoindata_external-link' within the href\n // we can assume it's the old ckeditor4 plugin format and simply get rid of them\n if (firstChildItem?.getAttribute('href')?.includes('avoindata_external-link')) {\n // Consume the main outer wrapper element.\n consumable.consume(viewItem, svg);\n // Consume the inner wrapper element.\n consumable.consume(firstChildItem, use);\n }\n });\n });\n /*\n const editor = this.editor;\n\n // `listenTo()` and `editor` are available thanks to `Plugin`.\n // By using `listenTo()` you will ensure that the listener is removed when\n // the plugin is destroyed.\n this.listenTo(editor.data, 'ready', () => {\n const linkCommand = editor.commands.get('link');\n const { selection } = editor.model.document;\n\n let linkCommandExecuting = false;\n\n linkCommand.on('execute', (evt, args) => {\n const linkIsExternal = args[1]['linkIsExternal']\n\n if (linkIsExternal) {\n if (linkCommandExecuting) {\n linkCommandExecuting = false;\n return;\n }\n\n // If the additional attribute was passed, we stop the default execution\n // of the LinkCommand. We're going to create Model#change() block for undo\n // and execute the LinkCommand together with setting the extra attribute.\n evt.stop();\n\n // Prevent infinite recursion by keeping records of when link command is\n // being executed by this function.\n linkCommandExecuting = true;\n\n // Wrapping the original command execution in a model.change() block to make sure there's a single undo step\n // when the extra attribute is added.\n\n editor.model.change(writer => {\n editor.execute('link', ...args);\n const link = selection.getLastPosition().nodeBefore;\n // writer.insertElement('avoindataExternalLink', selection.getLastPosition())\n });\n }\n })\n });\n */\n }\n\n static get pluginName() {\n return 'ExternalLink';\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/externalLink.js?")},"./src/externalLink/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _externalLink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalLink */ "./src/externalLink/externalLink.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n ExternalLink: _externalLink__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/index.js?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.externalLink/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/externalLink/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js index 3f276dd0fd..c40e0d5e90 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js @@ -66,14 +66,6 @@ export default class AvoindataHintEditing extends Plugin { allowWhere: '$block', }); - schema.register('avoindataHintHeader', { - // This is only to be used within avoindataHint. - isObject: true, - isSelectable: false, - allowIn: 'avoindataHint', - allowChildren: ['avoindataHintIcon', 'avoindataHintContent'] - }); - schema.register('avoindataHintIcon', { isObject: true, isContent: true, @@ -82,13 +74,13 @@ export default class AvoindataHintEditing extends Plugin { isSelectable: false, isLimit: false, // This is only to be used within avoindataHint. - allowIn: 'avoindataHintHeader', + allowIn: 'avoindataHint', allowAttributes: ['src', 'alt', 'class'] }); schema.register('avoindataHintContent', { isLimit: true, - allowIn: 'avoindataHintHeader', + allowIn: 'avoindataHint', allowContentOf: '$root', }); @@ -125,14 +117,6 @@ export default class AvoindataHintEditing extends Plugin { }, }); - conversion.for('upcast').elementToElement({ - model: 'avoindataHintHeader', - view: { - name: 'div', - classes: 'avoindata-hint-header', - }, - }); - conversion.for('upcast').elementToElement({ model: 'avoindataHintIcon', view: { @@ -166,22 +150,12 @@ export default class AvoindataHintEditing extends Plugin { }, }); - // Instances of are saved as - //

{{inner content}}
. - conversion.for('dataDowncast').elementToElement({ - model: 'avoindataHintHeader', - view: { - name: 'div', - classes: 'avoindata-hint-header', - }, - }); - // Instances of are saved as // Avoindata Hint icon
. - conversion.for('dataDowncast').elementToElement({ + conversion.for('downcast').elementToElement({ model: 'avoindataHintIcon', view: (modelElement, { writer }) => { - return writer.createUIElement('img', { class: "avoindata-hint-icon", src: '/themes/avoindata/images/avoindata-hint-icon.svg' }) + return writer.createEmptyElement('img', { class: "avoindata-hint-icon", src: '/themes/avoindata/images/avoindata-hint-icon.svg' }) } }); @@ -212,28 +186,6 @@ export default class AvoindataHintEditing extends Plugin { }, }); - // Convert the model into a container element in the editor UI. - conversion.for('editingDowncast').elementToElement({ - model: 'avoindataHintHeader', - view: (modelElement, { writer: viewWriter }) => { - return viewWriter.createContainerElement('div', { - class: 'avoindata-hint-header', - }); - }, - }); - - // Convert the model into an UI element in the editor UI. - conversion.for('editingDowncast').elementToElement({ - model: 'avoindataHintIcon', - view: (modelElement, { writer: viewWriter }) => { - return viewWriter.createUIElement('img', { - class: 'avoindata-hint-icon', - src: "/themes/avoindata/images/avoindata-hint-icon.svg", - alt: "Avoindata Hint icon", - }); - }, - }); - // Convert the model into an editable
widget. conversion.for('editingDowncast').elementToElement({ model: 'avoindataHintContent', @@ -244,5 +196,13 @@ export default class AvoindataHintEditing extends Plugin { return toWidgetEditable(div, viewWriter); }, }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataHintIcon', + view: { + name: 'img', + classes: 'avoindata-hint-image', + }, + }); } } diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js index 133492590f..7af54eae12 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js @@ -38,15 +38,13 @@ function createAvoindataHint(writer) { // Create instances of the elements registered with the editor in // avoindataexpanderediting.js. const avoindataHint = writer.createElement('avoindataHint'); - const avoindataHintHeader = writer.createElement('avoindataHintHeader'); const avoindataHintIcon = writer.createElement('avoindataHintIcon'); const avoindataHintContent = writer.createElement('avoindataHintContent'); // Append the title and content elements to the avoindataHint, which matches // the parent/child relationship as defined in their schemas. - writer.append(avoindataHintHeader, avoindataHint); - writer.append(avoindataHintIcon, avoindataHintHeader); - writer.append(avoindataHintContent, avoindataHintHeader); + writer.append(avoindataHintIcon, avoindataHint); + writer.append(avoindataHintContent, avoindataHint); // The text content will automatically be wrapped in a // `

`. diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js index a58a96b854..0fca5d1797 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js @@ -69,14 +69,6 @@ export default class AvoindataNoteEditing extends Plugin { allowWhere: '$block', }); - schema.register('avoindataNoteHeader', { - // This is only to be used within avoindataNote. - isObject: true, - isSelectable: false, - allowIn: 'avoindataNote', - allowChildren: ['avoindataNoteIcon', 'avoindataNoteTitle'] - }); - schema.register('avoindataNoteIcon', { isObject: true, isContent: true, @@ -85,7 +77,7 @@ export default class AvoindataNoteEditing extends Plugin { isSelectable: false, isLimit: false, // This is only to be used within avoindataNote. - allowIn: 'avoindataNoteHeader', + allowIn: 'avoindataNote', allowAttributes: ['src', 'alt', 'class'] }); @@ -96,7 +88,7 @@ export default class AvoindataNoteEditing extends Plugin { // the box. isLimit: true, // This is only to be used within avoindataNote. - allowIn: 'avoindataNoteHeader', + allowIn: 'avoindataNote', // Allow content that is allowed in blocks (e.g. text with attributes). allowContentOf: '$root', }); @@ -140,14 +132,6 @@ export default class AvoindataNoteEditing extends Plugin { }, }); - conversion.for('upcast').elementToElement({ - model: 'avoindataNoteHeader', - view: { - name: 'div', - classes: 'avoindata-note-header', - }, - }); - conversion.for('upcast').elementToElement({ model: 'avoindataNoteIcon', view: { @@ -193,16 +177,6 @@ export default class AvoindataNoteEditing extends Plugin { }, }); - // Instances of are saved as - //

{{inner content}}
. - conversion.for('dataDowncast').elementToElement({ - model: 'avoindataNoteHeader', - view: { - name: 'div', - classes: 'avoindata-note-header', - }, - }); - // Instances of are saved as // Avoindata Note icon
. conversion.for('dataDowncast').elementToElement({ @@ -249,16 +223,6 @@ export default class AvoindataNoteEditing extends Plugin { }, }); - // Convert the model into a container element in the editor UI. - conversion.for('editingDowncast').elementToElement({ - model: 'avoindataNoteHeader', - view: (modelElement, { writer: viewWriter }) => { - return viewWriter.createContainerElement('div', { - class: 'avoindata-note-header', - }); - }, - }); - // Convert the model into an UI element in the editor UI. conversion.for('editingDowncast').elementToStructure({ model: 'avoindataNoteIcon', @@ -288,5 +252,13 @@ export default class AvoindataNoteEditing extends Plugin { return toWidgetEditable(div, viewWriter); }, }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataNoteIcon', + view: { + name: 'img', + classes: 'avoindata-note-header-image' + }, + }); } } diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js index 636dd4bd00..f220b4b9b0 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js @@ -38,16 +38,14 @@ function createAvoindataNote(writer) { // Create instances of the elements registered with the editor in // avoindataexpanderediting.js. const avoindataNote = writer.createElement('avoindataNote'); - const avoindataNoteHeader = writer.createElement('avoindataNoteHeader'); const avoindataNoteIcon = writer.createElement('avoindataNoteIcon'); const avoindataNoteTitle = writer.createElement('avoindataNoteTitle'); const avoindataNoteContent = writer.createElement('avoindataNoteContent'); // Append the title and content elements to the avoindataNote, which matches // the parent/child relationship as defined in their schemas. - writer.append(avoindataNoteHeader, avoindataNote); - writer.append(avoindataNoteIcon, avoindataNoteHeader); - writer.append(avoindataNoteTitle, avoindataNoteHeader); + writer.append(avoindataNoteIcon, avoindataNote); + writer.append(avoindataNoteTitle, avoindataNote); writer.append(avoindataNoteContent, avoindataNote); // The text content will automatically be wrapped in a diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js index 5b8fb31a9a..49a05d70c0 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionEditing.js @@ -56,7 +56,8 @@ export default class AvoindataSectionEditing extends Plugin { isObject: true, // Allow in places where other blocks are allowed (e.g. directly in the root). allowWhere: '$block', - allowAttributes: ['avoindataSectionId'] + allowAttributes: ['avoindataSectionId'], + allowContentOf: '$block', }); schema.register('avoindataSectionTitle', { @@ -216,5 +217,24 @@ export default class AvoindataSectionEditing extends Plugin { return toWidgetEditable(div, viewWriter); }, }); + + + + // Extra converters for the older format ckeditor4 plugins + conversion.for('upcast').elementToElement({ + model: 'avoindataSectionTitle', + view: { + name: 'h3', + classes: 'avoindata-section__title', + }, + }); + + conversion.for('upcast').elementToElement({ + model: 'avoindataSectionContent', + view: { + name: 'div', + classes: 'avoindata-section__content', + }, + }); } } diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js index 695c0909cc..fb75e9d64b 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js @@ -2,6 +2,67 @@ import { Plugin } from 'ckeditor5/src/core'; export default class ExternalLink extends Plugin { init() { + const { conversion } = this.editor; + + // Upcast Converter for the old ckeditor4 plugin format + conversion.for('upcast').elementToAttribute({ + model: 'linkIsExternal', + view: { + name: 'a', + classes: ['external'], + attributes: ['aria-label', 'target'], + }, + }); + + // Extra consumption for the leftover svg icon + conversion.for('upcast').add(dispatcher => { + // Look for every view svg element. + dispatcher.on('element:svg', (evt, data, conversionApi) => { + // Get all the necessary items from the conversion API object. + const { + consumable + } = conversionApi; + + // Get view item from data object. + const { viewItem } = data; + + // Define elements consumables. + const svg = { name: 'svg', attributes: ['viewBox'] }; + const use = { name: 'use', attributes: ['href'] }; + + // Tests if the view element can be consumed. + if (!consumable.test(viewItem, svg)) { + return; + } + + // Check if there is only one child. + if (viewItem.childCount !== 1) { + return; + } + + // Get the first child element. + const firstChildItem = viewItem.getChild(0); + + // Check if the first element is a div. + if (!firstChildItem.is('element', 'use')) { + return; + } + + // Tests if the first child element can be consumed. + if (!consumable.test(firstChildItem, use)) { + return; + } + + // If a use tag inside a svg has the string 'avoindata_external-link' within the href + // we can assume it's the old ckeditor4 plugin format and simply get rid of them + if (firstChildItem?.getAttribute('href')?.includes('avoindata_external-link')) { + // Consume the main outer wrapper element. + consumable.consume(viewItem, svg); + // Consume the inner wrapper element. + consumable.consume(firstChildItem, use); + } + }); + }); /* const editor = this.editor; diff --git a/opendata-assets/src/less/drupal/custom-elements.less b/opendata-assets/src/less/drupal/custom-elements.less index 25d15bd305..47f455a446 100644 --- a/opendata-assets/src/less/drupal/custom-elements.less +++ b/opendata-assets/src/less/drupal/custom-elements.less @@ -244,3 +244,13 @@ table { color: @color--black; } } + +a.external { + svg { + margin-bottom: -2px; + margin-left: 4px; + width: 16px; + height: 16px; + fill: @link-color; + } +} From feded5bd53c118ad5d1c7a70b2fc6242902f77ba Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Wed, 4 Oct 2023 15:04:26 +0300 Subject: [PATCH 06/30] AV-2004: Send copies of organization approvals to admins --- ckan/ckanext/ckanext-organizationapproval | 2 +- ckan/templates/production.ini.j2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ckan/ckanext/ckanext-organizationapproval b/ckan/ckanext/ckanext-organizationapproval index b7b89bd44d..b95046bc37 160000 --- a/ckan/ckanext/ckanext-organizationapproval +++ b/ckan/ckanext/ckanext-organizationapproval @@ -1 +1 @@ -Subproject commit b7b89bd44d14618b5120a1d9d053b6996adcde3b +Subproject commit b95046bc37f53ef3914b16f85f7309a75df1267e diff --git a/ckan/templates/production.ini.j2 b/ckan/templates/production.ini.j2 index 974c35f552..f96b8787dc 100644 --- a/ckan/templates/production.ini.j2 +++ b/ckan/templates/production.ini.j2 @@ -120,7 +120,7 @@ ckan.harvest.mq.hostname = {{ environ('REDIS_HOST') }} ckan.harvest.mq.port = {{ environ('REDIS_PORT') }} ckan.harvest.mq.redis_db = {{ environ('REDIS_DB') }} -ckanext.organizationapproval.admin_email = {{ environ('SYSADMIN_EMAIL') }} +ckanext.organizationapproval.admin_email = {{ environ('SYSADMIN_EMAIL') }}, avoindata@dvv.fi ckanext.ytp_request.admin_email = {{ environ('SYSADMIN_EMAIL') }} ckanext-archiver.archive_dir = {{ environ('CKAN_ARCHIVER_PATH') }} From 31142ef21b093db16376c8da68a285befef3c1df Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Thu, 5 Oct 2023 08:36:29 +0300 Subject: [PATCH 07/30] AV-2004: Read organization approval email address list from a variable --- cdk/lib/ckan-stack.ts | 5 +++++ ckan/templates/production.ini.j2 | 2 +- docker/.env.template | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cdk/lib/ckan-stack.ts b/cdk/lib/ckan-stack.ts index 40466e124d..4e7ea7abe3 100644 --- a/cdk/lib/ckan-stack.ts +++ b/cdk/lib/ckan-stack.ts @@ -38,6 +38,10 @@ export class CkanStack extends Stack { parameterName: `/${props.environment}/opendata/ckan/harvester_instruction_url`, }); + const pCkanOrganizationapprovalEmail = ssm.StringParameter.fromStringParameterAttributes(this, 'pCkanOrganizationapprovalEmail', { + parameterName: `/${props.environment}/opendata/ckan/organizationapproval_email`, + }); + const host = props.databaseInstance.instanceEndpoint; const datastoreHost = props.datastoreInstance.instanceEndpoint; @@ -258,6 +262,7 @@ export class CkanStack extends Stack { SENTRY_ENV: props.environment, CKAN_SYSADMIN_NAME: pSysadminUser.stringValue, CKAN_SYSADMIN_EMAIL: pSysadminEmail.stringValue, + ORGANIZATIONAPPROVAL_EMAIL: pCkanOrganizationapprovalEmail.stringValue, // fuseki FUSEKI_HOST: `fuseki.${props.namespace.namespaceName}`, FUSEKI_PORT: '3030', diff --git a/ckan/templates/production.ini.j2 b/ckan/templates/production.ini.j2 index f96b8787dc..06b036c036 100644 --- a/ckan/templates/production.ini.j2 +++ b/ckan/templates/production.ini.j2 @@ -120,7 +120,7 @@ ckan.harvest.mq.hostname = {{ environ('REDIS_HOST') }} ckan.harvest.mq.port = {{ environ('REDIS_PORT') }} ckan.harvest.mq.redis_db = {{ environ('REDIS_DB') }} -ckanext.organizationapproval.admin_email = {{ environ('SYSADMIN_EMAIL') }}, avoindata@dvv.fi +ckanext.organizationapproval.admin_email = {{ environ('ORGANIZATIONAPPROVAL_EMAIL') }} ckanext.ytp_request.admin_email = {{ environ('SYSADMIN_EMAIL') }} ckanext-archiver.archive_dir = {{ environ('CKAN_ARCHIVER_PATH') }} diff --git a/docker/.env.template b/docker/.env.template index 79787ad503..084b575c72 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -101,6 +101,7 @@ SOLR_PATH=solr/ckan # ckan CKAN_HOST=ckan CKAN_PORT=5000 +ORGANIZATIONAPPROVAL_EMAIL=admin@localhost # datapusher DATAPUSHER_HOST=datapusher From 38e42da67b34c3dcc05dc26e636770745aea8f47 Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Thu, 5 Oct 2023 10:39:11 +0300 Subject: [PATCH 08/30] AV-1959: Use correct detail field --- cdk/lib/monitoring-stack.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdk/lib/monitoring-stack.ts b/cdk/lib/monitoring-stack.ts index f4616e1fc5..ae6b627f09 100644 --- a/cdk/lib/monitoring-stack.ts +++ b/cdk/lib/monitoring-stack.ts @@ -26,7 +26,7 @@ export class MonitoringStack extends Stack { eventPattern: { source: ['aws.ecs'], detail: { - eventType: ['SERVICE_TASK_START_IMPAIRED', + eventName: ['SERVICE_TASK_START_IMPAIRED', 'SERVICE_DISCOVERY_INSTANCE_UNHEALTHY', 'SERVICE_TASK_PLACEMENT_FAILURE', 'SERVICE_TASK_CONFIGURATION_FAILURE'] From f901a88a51d5f7d3da34f70ad1a3cb77de2914be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Fri, 6 Oct 2023 07:36:20 +0200 Subject: [PATCH 09/30] AV-2017: Attempted cleanup --- .../avoindata_ckeditor5_plugins.ckeditor5.yml | 6 +- .../avoindata_ckeditor5_plugins.libraries.yml | 4 +- .../js/avoindataExample.js | 2 +- .../js/avoindataExpander.js | 2 +- .../js/avoindataHint.js | 2 +- .../js/avoindataNote.js | 2 +- .../js/avoindataSection.js | 2 +- .../js/externalLink.js | 1 - .../package-lock.json | 455 ------------------ .../avoindataExampleEditing.js | 2 +- .../avoindataExample/avoindataExampleUI.js | 2 +- .../insertAvoindataExampleCommand.js | 11 +- .../avoindataExpanderEditing.js | 2 +- .../avoindataExpander/avoindataExpanderUI.js | 2 +- .../insertAvoindataExpanderCommand.js | 11 +- .../src/avoindataHint/avoindataHintEditing.js | 5 +- .../src/avoindataHint/avoindataHintUI.js | 2 +- .../insertAvoindataHintCommand.js | 7 +- .../src/avoindataNote/avoindataNoteEditing.js | 2 +- .../insertAvoindataNoteCommand.js | 11 +- .../avoindataSection/avoindataSectionUI.js | 2 +- .../src/externalLink/externalLink.js | 113 ----- .../src/externalLink/index.js | 13 - .../webpack.config.js | 10 +- 24 files changed, 57 insertions(+), 614 deletions(-) delete mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js delete mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js delete mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml index f7d805e173..91da87d28b 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.ckeditor5.yml @@ -49,10 +49,10 @@ # # class: Optional PHP class that makes it possible for the plugin to provide # # dynamic values, or a configuration UI. -avoindata_ckeditor5_plugins_externallink: +avoindata_ckeditor5_plugins_avoindataexternallink: ckeditor5: plugins: - - externalLink.ExternalLink + - avoindataExternalLink.AvoindataExternalLink config: link: decorators: @@ -66,7 +66,7 @@ avoindata_ckeditor5_plugins_externallink: - 'external-link' drupal: label: Link - library: avoindata_ckeditor5_plugins/externalLink + library: avoindata_ckeditor5_plugins/avoindataExternalLink elements: - - diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml index aa484a39cb..d61d5b4b90 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml @@ -1,8 +1,8 @@ # This adds the plugin JavaScript to the page. -externalLink: +avoindataExternalLink: js: - js/externalLink.js: { preprocess: false, minified: true } + js/avoindataExternalLink.js: { preprocess: false, minified: true } dependencies: - core/ckeditor5 diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js index d60b4bf4f9..4029057341 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExample=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataExample/avoindataExample.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataExample)\n/* harmony export */ });\n/* harmony import */ var _avoindataExampleEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExampleEditing */ "./src/avoindataExample/avoindataExampleEditing.js");\n/* harmony import */ var _avoindataExampleUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataExampleUI */ "./src/avoindataExample/avoindataExampleUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataExampleUI and AvoindataExampleEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataExample extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataExampleEditing and AvoindataExampleUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataExampleEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataExampleUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/avoindataExample.js?')},"./src/avoindataExample/avoindataExampleEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExampleEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataExampleCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataExampleCommand */ \"./src/avoindataExample/insertAvoindataExampleCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *
\n *
\n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataExample model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataExampleEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataExampleCommand',\n new _insertAvoindataExampleCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataExample', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataExampleTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataExample.\n allowIn: 'avoindataExample',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataExampleContent', {\n isLimit: true,\n allowIn: 'avoindataExample',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataExample inside avoindataExampleContent.\n if (\n (context.endsWith('avoindataExampleContent') || context.endsWith('avoindataExampleTitle')) &&\n childDefinition.name === 'avoindataExample'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExample',\n view: {\n name: 'div',\n classes: 'avoindata-example',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExampleTitle',\n view: {\n name: 'div',\n classes: 'avoindata-example-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExampleContent',\n view: {\n name: 'div',\n classes: 'avoindata-example-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExample',\n view: {\n name: 'div',\n classes: 'avoindata-example',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExampleTitle',\n view: {\n name: 'div',\n classes: 'avoindata-example-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExampleContent',\n view: {\n name: 'div',\n classes: 'avoindata-example-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExample',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-example',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Example widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExampleTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-example-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExampleContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-example-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/avoindataExampleEditing.js?")},"./src/avoindataExample/avoindataExampleUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExampleUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_example_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-example.svg?source */ \"./icons/icon-example.svg?source\");\n/**\n * @file registers the avoindataExample toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataExampleUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataExample toolbar button.\n editor.ui.componentFactory.add('avoindataExample', (locale) => {\n const command = editor.commands.get('insertAvoindataExampleCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Example widget'),\n icon: _icons_icon_example_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataExampleCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/avoindataExampleUI.js?")},"./src/avoindataExample/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataExample__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExample */ "./src/avoindataExample/avoindataExample.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataExample: _avoindataExample__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/index.js?')},"./src/avoindataExample/insertAvoindataExampleCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataExampleCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataExampleCommand, which is executed when the avoindataExample\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataExampleCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataExample(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataExample is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataExample',\n );\n\n // If the cursor is not in a location where a avoindataExample can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataExample(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataExample = writer.createElement('avoindataExample');\n const avoindataExampleTitle = writer.createElement('avoindataExampleTitle');\n const avoindataExampleContent = writer.createElement('avoindataExampleContent');\n\n // Append the title and content elements to the avoindataExample, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataExampleTitle, avoindataExample);\n writer.append(avoindataExampleContent, avoindataExample);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataExampleTitle);\n writer.appendElement('paragraph', avoindataExampleContent);\n\n // Return the element to be added to the editor.\n return avoindataExample;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./src/avoindataExample/insertAvoindataExampleCommand.js?")},"./icons/icon-example.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/./icons/icon-example.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExample/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,n)=>{for(var a in n)__webpack_require__.o(n,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataExample/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExample=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,a),i.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";a.d(n,{default:()=>s});var e=a("ckeditor5/src/core.js"),t=a("ckeditor5/src/widget.js");class o extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const a=function(e){const t=e.createElement("avoindataExample"),a=e.createElement("avoindataExampleTitle"),n=e.createElement("avoindataExampleContent");e.append(a,t),e.append(n,t);const o=e.createElement("paragraph");e.insertText("Title",o,0),e.append(o,a);const i=e.createElement("paragraph");return e.insertText("Content",i,0),e.append(i,n),t}(t);e.insertContent(a)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,a=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataExample");this.isEnabled=null!==a}}class i extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataExampleCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataExample",{isObject:!0,allowWhere:"$block"}),e.register("avoindataExampleTitle",{isLimit:!0,allowIn:"avoindataExample",allowContentOf:"$root"}),e.register("avoindataExampleContent",{isLimit:!0,allowIn:"avoindataExample",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataExampleContent")||e.endsWith("avoindataExampleTitle"))&&"avoindataExample"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataExample",view:{name:"div",classes:"avoindata-example"}}),e.for("upcast").elementToElement({model:"avoindataExampleTitle",view:{name:"div",classes:"avoindata-example-title"}}),e.for("upcast").elementToElement({model:"avoindataExampleContent",view:{name:"div",classes:"avoindata-example-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataExample",view:{name:"div",classes:"avoindata-example"}}),e.for("dataDowncast").elementToElement({model:"avoindataExampleTitle",view:{name:"div",classes:"avoindata-example-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataExampleContent",view:{name:"div",classes:"avoindata-example-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataExample",view:(e,{writer:a})=>{const n=a.createContainerElement("div",{class:"avoindata-example"});return(0,t.toWidget)(n,a,{label:"Avoindata Example"})}}),e.for("editingDowncast").elementToElement({model:"avoindataExampleTitle",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-example-title"});return(0,t.toWidgetEditable)(n,a)}}),e.for("editingDowncast").elementToElement({model:"avoindataExampleContent",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-example-content"});return(0,t.toWidgetEditable)(n,a)}})}}var l=a("ckeditor5/src/ui.js");class d extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataExample",(t=>{const a=e.commands.get("insertAvoindataExampleCommand"),n=new l.ButtonView(t);return n.set({label:e.t("Avoindata Example"),icon:'\n \n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataExampleCommand"))),n}))}}class r extends e.Plugin{static get requires(){return[i,d]}}const s={AvoindataExample:r}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js index 22b9460c48..05768e133e 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataExpander/avoindataExpander.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataExpander)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpanderEditing */ "./src/avoindataExpander/avoindataExpanderEditing.js");\n/* harmony import */ var _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataExpanderUI */ "./src/avoindataExpander/avoindataExpanderUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataExpanderUI and AvoindataExpanderEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataExpander extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that ExpanderEditing and ExpanderUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataExpanderEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataExpanderUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpander.js?')},"./src/avoindataExpander/avoindataExpanderEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataExpanderCommand */ \"./src/avoindataExpander/insertAvoindataExpanderCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n
\n
Title
\n \n
\n
Content
\n
\n *\n * This file has the logic for defining the avoindataExpander model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataExpanderEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataExpanderCommand',\n new _insertAvoindataExpanderCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataExpander', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataExpanderTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within simpleBox.\n allowIn: 'avoindataExpander',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataExpanderContent', {\n isLimit: true,\n allowIn: 'avoindataExpander',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataExpander inside avoindataExpanderContent.\n if (\n (context.endsWith('avoindataExpanderContent') || context.endsWith('avoindataExpanderTitle')) &&\n childDefinition.name === 'avoindataExpander'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: {\n name: 'div',\n classes: 'avoindata-expander-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpander',\n view: {\n name: 'div',\n classes: 'avoindata-expander',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToStructure({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer }) => {\n return writer.createContainerElement('div', { class: 'avoindata-expander-header' }, [\n writer.createContainerElement('div', { class: 'avoindata-expander-title' }, [\n writer.createSlot()\n ]),\n writer.createContainerElement('span', { class: 'icon-wrapper pull-right' }, [\n writer.createEmptyElement('i', { class: 'fas fa-angle-down' })\n ])\n ])\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: {\n name: 'div',\n classes: 'avoindata-expander-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpander',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-expander',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Expander widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataExpanderContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-expander-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderEditing.js?")},"./src/avoindataExpander/avoindataExpanderUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataExpanderUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-expander.svg?source */ \"./icons/icon-expander.svg?source\");\n/**\n * @file registers the avoindataExpander toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataExpanderUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataExpander toolbar button.\n editor.ui.componentFactory.add('avoindataExpander', (locale) => {\n const command = editor.commands.get('insertAvoindataExpanderCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Expander widget'),\n icon: _icons_icon_expander_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataExpanderCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/avoindataExpanderUI.js?")},"./src/avoindataExpander/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataExpander */ "./src/avoindataExpander/avoindataExpander.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataExpander: _avoindataExpander__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/index.js?')},"./src/avoindataExpander/insertAvoindataExpanderCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataExpanderCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataExpanderCommand, which is executed when the avoindataExpander\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataExpanderCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataExpander(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataExpander is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataExpander',\n );\n\n // If the cursor is not in a location where a avoindataExpander can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataExpander(writer) {\n // Create instances of the three elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataExpander = writer.createElement('avoindataExpander');\n const avoindataExpanderTitle = writer.createElement('avoindataExpanderTitle');\n const avoindataExpanderContent = writer.createElement('avoindataExpanderContent');\n\n // Append the title and content elements to the avoindataExpander, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataExpanderTitle, avoindataExpander);\n writer.append(avoindataExpanderContent, avoindataExpander);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataExpanderTitle);\n writer.appendElement('paragraph', avoindataExpanderContent);\n\n // Return the element to be added to the editor.\n return avoindataExpander;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./src/avoindataExpander/insertAvoindataExpanderCommand.js?")},"./icons/icon-expander.svg?source":module=>{"use strict";eval('module.exports = "\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/./icons/icon-expander.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataExpander/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,n)=>{for(var a in n)__webpack_require__.o(n,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataExpander/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,a),r.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";a.d(n,{default:()=>l});var e=a("ckeditor5/src/core.js"),t=a("ckeditor5/src/widget.js");class o extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const a=function(e){const t=e.createElement("avoindataExpander"),a=e.createElement("avoindataExpanderTitle"),n=e.createElement("avoindataExpanderContent");e.append(a,t),e.append(n,t);const o=e.createElement("paragraph");e.insertText("Title",o,0),e.append(o,a);const r=e.createElement("paragraph");return e.insertText("Content",r,0),e.append(r,n),t}(t);e.insertContent(a)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,a=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataExpander");this.isEnabled=null!==a}}class r extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataExpanderCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataExpander",{isObject:!0,allowWhere:"$block"}),e.register("avoindataExpanderTitle",{isLimit:!0,allowIn:"avoindataExpander",allowContentOf:"$root"}),e.register("avoindataExpanderContent",{isLimit:!0,allowIn:"avoindataExpander",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataExpanderContent")||e.endsWith("avoindataExpanderTitle"))&&"avoindataExpander"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataExpander",view:{name:"div",classes:"avoindata-expander"}}),e.for("upcast").elementToElement({model:"avoindataExpanderTitle",view:{name:"div",classes:"avoindata-expander-title"}}),e.for("upcast").elementToElement({model:"avoindataExpanderContent",view:{name:"div",classes:"avoindata-expander-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataExpander",view:{name:"div",classes:"avoindata-expander"}}),e.for("dataDowncast").elementToStructure({model:"avoindataExpanderTitle",view:(e,{writer:t})=>t.createContainerElement("div",{class:"avoindata-expander-header"},[t.createContainerElement("div",{class:"avoindata-expander-title"},[t.createSlot()]),t.createContainerElement("span",{class:"icon-wrapper pull-right"},[t.createEmptyElement("i",{class:"fas fa-angle-down"})])])}),e.for("dataDowncast").elementToElement({model:"avoindataExpanderContent",view:{name:"div",classes:"avoindata-expander-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataExpander",view:(e,{writer:a})=>{const n=a.createContainerElement("div",{class:"avoindata-expander"});return(0,t.toWidget)(n,a,{label:"Avoindata Expander"})}}),e.for("editingDowncast").elementToElement({model:"avoindataExpanderTitle",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-expander-title"});return(0,t.toWidgetEditable)(n,a)}}),e.for("editingDowncast").elementToElement({model:"avoindataExpanderContent",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-expander-content"});return(0,t.toWidgetEditable)(n,a)}})}}var d=a("ckeditor5/src/ui.js");class i extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataExpander",(t=>{const a=e.commands.get("insertAvoindataExpanderCommand"),n=new d.ButtonView(t);return n.set({label:e.t("Avoindata Expander"),icon:'\n\t\n\t\t\n\t\t\n\t\n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataExpanderCommand"))),n}))}}class s extends e.Plugin{static get requires(){return[r,i]}}const l={AvoindataExpander:s}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js index 3c5763d288..24903a02b8 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js @@ -1 +1 @@ -!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(n.CKEditor5=n.CKEditor5||{},n.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataHint/avoindataHint.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataHint)\n/* harmony export */ });\n/* harmony import */ var _avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHintEditing */ "./src/avoindataHint/avoindataHintEditing.js");\n/* harmony import */ var _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataHintUI */ "./src/avoindataHint/avoindataHintUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataHintUI and AvoindataHintEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataHint extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataHintEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataHintUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHint.js?')},"./src/avoindataHint/avoindataHintEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataHintCommand */ \"./src/avoindataHint/insertAvoindataHintCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataHint model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataHintEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataHintCommand',\n new _insertAvoindataHintCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataHint', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataHintIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataHint.\n allowIn: 'avoindataHint',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataHintContent', {\n isLimit: true,\n allowIn: 'avoindataHint',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataHint inside avoindataHintContent.\n if (\n context.endsWith('avoindataHintContent') &&\n childDefinition.name === 'avoindataHint'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-icon',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHint',\n view: {\n name: 'div',\n classes: 'avoindata-hint',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('downcast').elementToElement({\n model: 'avoindataHintIcon',\n view: (modelElement, { writer }) => {\n return writer.createEmptyElement('img', { class: \"avoindata-hint-icon\", src: '/themes/avoindata/images/avoindata-hint-icon.svg' })\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: {\n name: 'div',\n classes: 'avoindata-hint-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHint',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-hint',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Hint widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataHintContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-hint-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataHintIcon',\n view: {\n name: 'img',\n classes: 'avoindata-hint-image',\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintEditing.js?")},"./src/avoindataHint/avoindataHintUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataHintUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-hint.svg?source */ \"./icons/icon-hint.svg?source\");\n/**\n * @file registers the avoindataHint toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataHintUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataHint toolbar button.\n editor.ui.componentFactory.add('avoindataHint', (locale) => {\n const command = editor.commands.get('insertAvoindataHintCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Hint widget'),\n icon: _icons_icon_hint_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataHintCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/avoindataHintUI.js?")},"./src/avoindataHint/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataHint__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataHint */ "./src/avoindataHint/avoindataHint.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataHint: _avoindataHint__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/index.js?')},"./src/avoindataHint/insertAvoindataHintCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataHintCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataHintCommand, which is executed when the avoindataHint\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataHintCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataHint(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataHint is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataHint',\n );\n\n // If the cursor is not in a location where a avoindataHint can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataHint(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataHint = writer.createElement('avoindataHint');\n const avoindataHintIcon = writer.createElement('avoindataHintIcon');\n const avoindataHintContent = writer.createElement('avoindataHintContent');\n\n // Append the title and content elements to the avoindataHint, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataHintIcon, avoindataHint);\n writer.append(avoindataHintContent, avoindataHint);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataHintContent);\n\n // Return the element to be added to the editor.\n return avoindataHint;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./src/avoindataHint/insertAvoindataHintCommand.js?")},"./icons/icon-hint.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/./icons/icon-hint.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataHint/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":n=>{"use strict";n.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(n,e)=>{for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),__webpack_require__.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataHint/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var t={"ckeditor5/src/core.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":t=>{"use strict";t.exports=CKEditor5.dll}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var a=e[i]={exports:{}};return t[i](a,a.exports,n),a.exports}n.d=(t,e)=>{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var i=e.getElementsByTagName("script");if(i.length)for(var o=i.length-1;o>-1&&!t;)t=i[o--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})();var i={};return(()=>{"use strict";n.d(i,{default:()=>l});var t=n("ckeditor5/src/core.js"),e=n("ckeditor5/src/widget.js");class o extends t.Command{execute(){const{model:t}=this.editor;t.change((e=>{const n=function(t){const e=t.createElement("avoindataHint"),n=t.createElement("avoindataHintIcon"),i=t.createElement("avoindataHintContent");t.append(n,e),t.append(i,e);const o=t.createElement("paragraph");return t.insertText("Content",o,0),t.append(o,i),e}(e);t.insertContent(n)}))}refresh(){const{model:t}=this.editor,{selection:e}=t.document,n=t.schema.findAllowedParent(e.getFirstPosition(),"avoindataHint");this.isEnabled=null!==n}}const a=n.p+"../icons/icon-hint.svg";class r extends t.Plugin{static get requires(){return[e.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataHintCommand",new o(this.editor))}_defineSchema(){const t=this.editor.model.schema;t.register("avoindataHint",{isObject:!0,allowWhere:"$block"}),t.register("avoindataHintIcon",{isObject:!0,isContent:!0,isInline:!0,isBlock:!1,isSelectable:!1,isLimit:!1,allowIn:"avoindataHint",allowAttributes:["src","alt","class"]}),t.register("avoindataHintContent",{isLimit:!0,allowIn:"avoindataHint",allowContentOf:"$root"}),t.addChildCheck(((t,e)=>{if(t.endsWith("avoindataHintContent")&&"avoindataHint"===e.name)return!1}))}_defineConverters(){const{conversion:t}=this.editor;t.for("upcast").elementToElement({model:"avoindataHint",view:{name:"div",classes:"avoindata-hint"}}),t.for("upcast").elementToElement({model:"avoindataHintIcon",view:{name:"img",classes:"avoindata-hint-icon"}}),t.for("upcast").elementToElement({model:"avoindataHintContent",view:{name:"div",classes:"avoindata-hint-content"}}),t.for("dataDowncast").elementToElement({model:"avoindataHint",view:{name:"div",classes:"avoindata-hint"}}),t.for("downcast").elementToElement({model:"avoindataHintIcon",view:(t,{writer:e})=>e.createEmptyElement("img",{class:"avoindata-hint-icon",src:a})}),t.for("dataDowncast").elementToElement({model:"avoindataHintContent",view:{name:"div",classes:"avoindata-hint-content"}}),t.for("editingDowncast").elementToElement({model:"avoindataHint",view:(t,{writer:n})=>{const i=n.createContainerElement("div",{class:"avoindata-hint"});return(0,e.toWidget)(i,n,{label:"Avoindata Hint"})}}),t.for("editingDowncast").elementToElement({model:"avoindataHintContent",view:(t,{writer:n})=>{const i=n.createEditableElement("div",{class:"avoindata-hint-content"});return(0,e.toWidgetEditable)(i,n)}}),t.for("upcast").elementToElement({model:"avoindataHintIcon",view:{name:"img",classes:"avoindata-hint-image"}})}}var s=n("ckeditor5/src/ui.js");class d extends t.Plugin{init(){const t=this.editor;t.ui.componentFactory.add("avoindataHint",(e=>{const n=t.commands.get("insertAvoindataHintCommand"),i=new s.ButtonView(e);return i.set({label:t.t("Avoindata Hint"),icon:'\n \n \n \n\n',tooltip:!0}),i.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(i,"execute",(()=>t.execute("insertAvoindataHintCommand"))),i}))}}class c extends t.Plugin{static get requires(){return[r,d]}}const l={AvoindataHint:c}})(),i=i.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js index 63f09b5469..2e54a2dcf6 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataNote/avoindataNote.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataNote)\n/* harmony export */ });\n/* harmony import */ var _avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNoteEditing */ "./src/avoindataNote/avoindataNoteEditing.js");\n/* harmony import */ var _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataNoteUI */ "./src/avoindataNote/avoindataNoteUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataNoteUI and AvoindataNoteEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataNote extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataNoteEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataNoteUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNote.js?')},"./src/avoindataNote/avoindataNoteEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataNoteCommand */ \"./src/avoindataNote/insertAvoindataNoteCommand.js\");\n/* harmony import */ var _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-note.svg */ \"./icons/icon-note.svg\");\n\n\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with expander as this model:\n * \n * \n * \n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
\n * \n *
Title
\n *
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataNote model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataNoteEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataNoteCommand',\n new _insertAvoindataNoteCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataNote', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n });\n\n schema.register('avoindataNoteIcon', {\n isObject: true,\n isContent: true,\n isInline: true,\n isBlock: false,\n isSelectable: false,\n isLimit: false,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNote',\n allowAttributes: ['src', 'alt', 'class']\n });\n\n schema.register('avoindataNoteTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For example, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataNote.\n allowIn: 'avoindataNote',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataNoteContent', {\n isLimit: true,\n allowIn: 'avoindataNote',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataNote inside avoindataNoteContent.\n if (\n (context.endsWith('avoindataNoteContent') || context.endsWith('avoindataNoteTitle')) &&\n childDefinition.name === 'avoindataNote'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-icon'\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n //\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNote',\n view: {\n name: 'div',\n classes: 'avoindata-note',\n },\n });\n\n // Instances of are saved as\n // \"Avoindata
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: {\n name: 'div',\n classes: 'avoindata-note-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: {\n name: 'div',\n classes: 'avoindata-note-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNote',\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-note',\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Note widget' });\n },\n });\n\n // Convert the model into an UI element in the editor UI.\n conversion.for('editingDowncast').elementToStructure({\n model: 'avoindataNoteIcon',\n view: (modelElement, { writer }) => {\n return writer.createUIElement('img', { class: 'avoindata-note-icon', src: _icons_icon_note_svg__WEBPACK_IMPORTED_MODULE_3__, alt: \"Avoindata Note icon\" });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataNoteContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-note-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataNoteIcon',\n view: {\n name: 'img',\n classes: 'avoindata-note-header-image'\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteEditing.js?")},"./src/avoindataNote/avoindataNoteUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataNoteUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/icon-note.svg?source */ \"./icons/icon-note.svg?source\");\n/**\n * @file registers the avoindataNote toolbar button and binds functionality to it.\n */\n\n\n\n\n\nclass AvoindataNoteUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const editor = this.editor;\n\n // This will register the avoindataNote toolbar button.\n editor.ui.componentFactory.add('avoindataNote', (locale) => {\n const command = editor.commands.get('insertAvoindataNoteCommand');\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Note'),\n icon: _icons_icon_note_svg_source__WEBPACK_IMPORTED_MODULE_2__,\n tooltip: true,\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataNoteCommand'),\n );\n\n return buttonView;\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/avoindataNoteUI.js?")},"./src/avoindataNote/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataNote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataNote */ "./src/avoindataNote/avoindataNote.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataNote: _avoindataNote__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/index.js?')},"./src/avoindataNote/insertAvoindataNoteCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataNoteCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataNoteCommand, which is executed when the avoindataNote\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataNoteCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute() {\n const { model } = this.editor;\n\n model.change((writer) => {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n model.insertContent(createAvoindataNote(writer));\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataNote is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataNote',\n );\n\n // If the cursor is not in a location where a avoindataNote can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataNote(writer) {\n // Create instances of the elements registered with the editor in\n // avoindataexpanderediting.js.\n const avoindataNote = writer.createElement('avoindataNote');\n const avoindataNoteIcon = writer.createElement('avoindataNoteIcon');\n const avoindataNoteTitle = writer.createElement('avoindataNoteTitle');\n const avoindataNoteContent = writer.createElement('avoindataNoteContent');\n\n // Append the title and content elements to the avoindataNote, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataNoteIcon, avoindataNote);\n writer.append(avoindataNoteTitle, avoindataNote);\n writer.append(avoindataNoteContent, avoindataNote);\n\n // The text content will automatically be wrapped in a\n // `

`.\n writer.appendElement('paragraph', avoindataNoteTitle);\n writer.appendElement('paragraph', avoindataNoteContent);\n\n // Return the element to be added to the editor.\n return avoindataNote;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./src/avoindataNote/insertAvoindataNoteCommand.js?")},"./icons/icon-note.svg":module=>{"use strict";eval('module.exports = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRTk3MDI1IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iSWNvbnMvQmFzaWMtaWNvbnMvaW5mbyIgZmlsbD0iI0U5NzAyNSIgc3Ryb2tlLXdpZHRoPSIxIiA+CiAgICAgICAgPHBhdGggZD0iTTEyLC0xLjI0MzQ0OTc5ZS0xNCBDMTguNjE3LC0xLjI0MzQ0OTc5ZS0xNCAyNCw1LjM4MyAyNCwxMiBDMjQsMTguNjE3IDE4LjYxNywyNCAxMiwyNCBDNS4zODMsMjQgMi4xMzE2MjgyMWUtMTQsMTguNjE3IDIuMTMxNjI4MjFlLTE0LDEyIEMyLjEzMTYyODIxZS0xNCw1LjM4MyA1LjM4MywtMS4yNDM0NDk3OWUtMTQgMTIsLTEuMjQzNDQ5NzllLTE0IFogTTEyLDIgQzYuNDg2LDIgMiw2LjQ4NiAyLDEyIEMyLDE3LjUxNCA2LjQ4NiwyMiAxMiwyMiBDMTcuNTE0LDIyIDIyLDE3LjUxNCAyMiwxMiBDMjIsNi40ODYgMTcuNTE0LDIgMTIsMiBaIE0xMi4wMDI4NzUsMTAuMDAwMzY0NiBDMTIuNTU0ODY5MiwxMC4wMDAzNjQ2IDEzLjAwMjg2NDYsMTAuNDQ4MzU5OSAxMy4wMDI4NjQ2LDExLjAwMDM1NDIgTDEzLjAwMjg2NDYsMTcuMDAwMjkxNyBMMTQuMDAyODU0MSwxNy4wMDAyOTE3IEMxNC41NTQ4NDg0LDE3LjAwMDI5MTcgMTUuMDAyODQzNywxNy40NDgyODcgMTUuMDAyODQzNywxOC4wMDAyODEzIEMxNS4wMDI4NDM3LDE4LjU1MjI3NTUgMTQuNTU0ODQ4NCwxOS4wMDAyNzA4IDE0LjAwMjg1NDEsMTkuMDAwMjcwOCBMOS45OTk4OTU4MywxOS4wMDAyNzA4IEM5LjQ0NzkwMTU4LDE5LjAwMDI3MDggOC45OTk5MDYyNSwxOC41NTIyNzU1IDguOTk5OTA2MjUsMTguMDAwMjgxMyBDOC45OTk5MDYyNSwxNy40NDgyODcgOS40NDc5MDE1OCwxNy4wMDAyOTE3IDkuOTk5ODk1ODMsMTcuMDAwMjkxNyBMMTAuOTk5ODg1NCwxNy4wMDAyOTE3IEwxMC45OTk4ODU0LDEyLjAwMDM0MzggTDkuOTk5ODk1ODMsMTIuMDAwMzQzOCBDOS40NDc5MDE1OCwxMi4wMDAzNDM4IDguOTk5OTA2MjUsMTEuNTUyMzQ4NCA4Ljk5OTkwNjI1LDExLjAwMDM1NDIgQzguOTk5OTA2MjUsMTAuNDQ4MzU5OSA5LjQ0NzkwMTU4LDEwLjAwMDM2NDYgOS45OTk4OTU4MywxMC4wMDAzNjQ2IEwxMi4wMDI4NzUsMTAuMDAwMzY0NiBaIE0xMS41MDE4ODAyLDUuMDAwNDE2NjcgQzEyLjMzMTg3MTUsNS4wMDA0MTY2NyAxMy4wMDI4NjQ2LDUuNjcyNDA5NjcgMTMuMDAyODY0Niw2LjUwMDQwMTA0IEMxMy4wMDI4NjQ2LDcuMjc5Njg3MDQgMTIuNDA4NDkwMSw3LjkyMDc4NzYzIDExLjY0NjU5NDUsNy45OTM1MTQ3NCBMMTEuNTAxNzU1Miw4LjAwMDM4NTQyIEwxMS41MDE3NTUyLDguMDAwMzg1NDIgTDExLjQ5OTg4MDIsOC4wMDAzODU0MiBDMTAuNjcwODg4OCw4LjAwMDM4NTQyIDkuOTk5ODk1ODMsNy4zMjgzOTI0MiA5Ljk5OTg5NTgzLDYuNTAwNDAxMDQgQzkuOTk5ODk1ODMsNS42NzI0MDk2NyAxMC42NzA4ODg4LDUuMDAwNDE2NjcgMTEuNDk5ODgwMiw1LjAwMDQxNjY3IEwxMS41MDE4ODAyLDUuMDAwNDE2NjcgWiIgaWQ9InBhdGgiIGZpbGw9IiNFOTcwMjUiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"./icons/icon-note.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/./icons/icon-note.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataNote/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataNote/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function o(n){var a=t[n];if(void 0!==a)return a.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,o),i.exports}o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var a=n.length-1;a>-1&&!e;)e=n[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var n={};return(()=>{"use strict";o.d(n,{default:()=>c});var e=o("ckeditor5/src/core.js"),t=o("ckeditor5/src/widget.js");class a extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const o=function(e){const t=e.createElement("avoindataNote"),o=e.createElement("avoindataNoteIcon"),n=e.createElement("avoindataNoteTitle"),a=e.createElement("avoindataNoteContent");e.append(o,t),e.append(n,t),e.append(a,t);const i=e.createElement("paragraph");e.insertText("Title",i,0),e.append(i,n);const r=e.createElement("paragraph");return e.insertText("Content",r,0),e.append(r,a),t}(t);e.insertContent(o)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,o=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataNote");this.isEnabled=null!==o}}const i=o.p+"../icons/icon-note.svg";class r extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataNoteCommand",new a(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataNote",{isObject:!0,allowWhere:"$block"}),e.register("avoindataNoteIcon",{isObject:!0,isContent:!0,isInline:!0,isBlock:!1,isSelectable:!1,isLimit:!1,allowIn:"avoindataNote",allowAttributes:["src","alt","class"]}),e.register("avoindataNoteTitle",{isLimit:!0,allowIn:"avoindataNote",allowContentOf:"$root"}),e.register("avoindataNoteContent",{isLimit:!0,allowIn:"avoindataNote",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataNoteContent")||e.endsWith("avoindataNoteTitle"))&&"avoindataNote"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataNote",view:{name:"div",classes:"avoindata-note"}}),e.for("upcast").elementToElement({model:"avoindataNoteIcon",view:{name:"img",classes:"avoindata-note-icon"}}),e.for("upcast").elementToElement({model:"avoindataNoteTitle",view:{name:"div",classes:"avoindata-note-title"}}),e.for("upcast").elementToElement({model:"avoindataNoteContent",view:{name:"div",classes:"avoindata-note-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataNote",view:{name:"div",classes:"avoindata-note"}}),e.for("dataDowncast").elementToElement({model:"avoindataNoteIcon",view:(e,{writer:t})=>t.createUIElement("img",{class:"avoindata-note-icon",src:i,alt:"Avoindata Note icon"})}),e.for("dataDowncast").elementToElement({model:"avoindataNoteTitle",view:{name:"div",classes:"avoindata-note-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataNoteContent",view:{name:"div",classes:"avoindata-note-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataNote",view:(e,{writer:o})=>{const n=o.createContainerElement("div",{class:"avoindata-note"});return(0,t.toWidget)(n,o,{label:"Avoindata Note"})}}),e.for("editingDowncast").elementToStructure({model:"avoindataNoteIcon",view:(e,{writer:t})=>t.createUIElement("img",{class:"avoindata-note-icon",src:i,alt:"Avoindata Note icon"})}),e.for("editingDowncast").elementToElement({model:"avoindataNoteTitle",view:(e,{writer:o})=>{const n=o.createEditableElement("div",{class:"avoindata-note-title"});return(0,t.toWidgetEditable)(n,o)}}),e.for("editingDowncast").elementToElement({model:"avoindataNoteContent",view:(e,{writer:o})=>{const n=o.createEditableElement("div",{class:"avoindata-note-content"});return(0,t.toWidgetEditable)(n,o)}}),e.for("upcast").elementToElement({model:"avoindataNoteIcon",view:{name:"img",classes:"avoindata-note-header-image"}})}}var s=o("ckeditor5/src/ui.js");class d extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataNote",(t=>{const o=e.commands.get("insertAvoindataNoteCommand"),n=new s.ButtonView(t);return n.set({label:e.t("Avoindata Note"),icon:'\n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataNoteCommand"))),n}))}}class l extends e.Plugin{static get requires(){return[r,d]}}const c={AvoindataNote:l}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js index efd16c8fcd..fbe056a10b 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/avoindataSection/avoindataSection.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (/* binding */ AvoindataSection)\n/* harmony export */ });\n/* harmony import */ var _avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSectionEditing */ "./src/avoindataSection/avoindataSectionEditing.js");\n/* harmony import */ var _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./avoindataSectionUI */ "./src/avoindataSection/avoindataSectionUI.js");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ckeditor5/src/core */ "ckeditor5/src/core.js");\n/**\n * @file This is what CKEditor refers to as a master (glue) plugin. Its role is\n * just to load the “editing” and “UI” components of this Plugin. Those\n * components could be included in this file, but\n *\n * I.e, this file\'s purpose is to integrate all the separate parts of the plugin\n * before it\'s made discoverable via index.js.\n */\n\n// The contents of AvoindataSectionUI and AvoindataSectionEditing could be included in this\n// file, but it is recommended to separate these concerns in different files.\n\n\n\n\nclass AvoindataSection extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_2__.Plugin {\n // Note that AvoindataSectionEditing and AvoindataSectionUI also extend `Plugin`, but these\n // are not seen as individual plugins by CKEditor 5. CKEditor 5 will only\n // discover the plugins explicitly exported in index.js.\n static get requires() {\n return [_avoindataSectionEditing__WEBPACK_IMPORTED_MODULE_0__["default"], _avoindataSectionUI__WEBPACK_IMPORTED_MODULE_1__["default"]];\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSection.js?')},"./src/avoindataSection/avoindataSectionEditing.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionEditing)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/widget */ \"ckeditor5/src/widget.js\");\n/* harmony import */ var _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./insertAvoindataSectionCommand */ \"./src/avoindataSection/insertAvoindataSectionCommand.js\");\n\n\n\n\n\n/**\n * CKEditor 5 plugins do not work directly with the DOM. They are defined as\n * plugin-specific data models that are then converted to markup that\n * is inserted in the DOM.\n *\n * CKEditor 5 internally interacts with section as this model:\n * \n * \n * \n * \n *\n * Which is converted for the browser/user as this markup\n *

\n *
Title
\n *
Content
\n *
\n *\n * This file has the logic for defining the avoindataSection model, and for how it is\n * converted to standard DOM markup.\n */\nclass AvoindataSectionEditing extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.Widget];\n }\n\n init() {\n this._defineSchema();\n this._defineConverters();\n this.editor.commands.add(\n 'insertAvoindataSectionCommand',\n new _insertAvoindataSectionCommand__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.editor),\n );\n }\n\n /*\n * This registers the structure that will be seen by CKEditor 5 as\n * \n * \n * \n * \n *\n * The logic in _defineConverters() will determine how this is converted to\n * markup.\n */\n _defineSchema() {\n // Schemas are registered via the central `editor` object.\n const schema = this.editor.model.schema;\n\n schema.register('avoindataSection', {\n // Behaves like a self-contained object (e.g. an image).\n isObject: true,\n // Allow in places where other blocks are allowed (e.g. directly in the root).\n allowWhere: '$block',\n allowAttributes: ['avoindataSectionId'],\n allowContentOf: '$block',\n });\n\n schema.register('avoindataSectionTitle', {\n // This creates a boundary for external actions such as clicking and\n // and keypress. For section, when the cursor is inside this box, the\n // keyboard shortcut for \"select all\" will be limited to the contents of\n // the box.\n isLimit: true,\n // This is only to be used within avoindataSection.\n allowIn: 'avoindataSection',\n // Allow content that is allowed in blocks (e.g. text with attributes).\n allowContentOf: '$root',\n });\n\n schema.register('avoindataSectionContent', {\n isLimit: true,\n allowIn: 'avoindataSection',\n allowContentOf: '$root',\n });\n\n schema.addChildCheck((context, childDefinition) => {\n // Disallow avoindataSection inside avoindataSectionContent.\n if (\n (context.endsWith('avoindataSectionContent') || context.endsWith('avoindataSectionTitle')) &&\n childDefinition.name === 'avoindataSection'\n ) {\n return false;\n }\n });\n }\n\n /**\n * Converters determine how CKEditor 5 models are converted into markup and\n * vice-versa.\n */\n _defineConverters() {\n // Converters are registered via the central editor object.\n const { conversion } = this.editor;\n\n // Upcast Converters: determine how existing HTML is interpreted by the\n // editor. These trigger when an editor instance loads.\n //\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model.\n conversion.for('upcast').elementToElement({\n model: (viewElement, { writer }) => {\n return writer.createElement('avoindataSection', { avoindataSectionId: viewElement.getAttribute('id') });\n },\n view: {\n name: 'div',\n classes: 'avoindata-section',\n attributes: ['id']\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of ,\n // as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // If
is present in the existing markup\n // processed by CKEditor, then CKEditor recognizes and loads it as a\n // model, provided it is a child element of\n // , as required by the schema.\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Data Downcast Converters: converts stored model data into HTML.\n // These trigger when content is saved.\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer }) => {\n return writer.createContainerElement(\n 'div', { class: 'avoindata-section', id: modelElement.getAttribute('avoindataSectionId') }\n );\n }\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'div',\n classes: 'avoindata-section-title',\n },\n });\n\n // Instances of are saved as\n //
{{inner content}}
.\n conversion.for('dataDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section-content',\n },\n });\n\n // Editing Downcast Converters. These render the content to the user for\n // editing, i.e. this determines what gets seen in the editor. These trigger\n // after the Data Upcast Converters, and are re-triggered any time there\n // are changes to any of the models' properties.\n //\n // Convert the model into a container widget in the editor UI.\n conversion.for('editingDowncast').elementToElement({\n model: {\n name: 'avoindataSection',\n attributes: ['avoindataSectionId']\n },\n view: (modelElement, { writer: viewWriter }) => {\n const section = viewWriter.createContainerElement('div', {\n class: 'avoindata-section',\n id: modelElement.getAttribute('avoindataSectionId')\n });\n\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidget)(section, viewWriter, { label: 'Avoindata Section widget' });\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionTitle',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-title',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n // Convert the model into an editable
widget.\n conversion.for('editingDowncast').elementToElement({\n model: 'avoindataSectionContent',\n view: (modelElement, { writer: viewWriter }) => {\n const div = viewWriter.createEditableElement('div', {\n class: 'avoindata-section-content',\n });\n return (0,ckeditor5_src_widget__WEBPACK_IMPORTED_MODULE_1__.toWidgetEditable)(div, viewWriter);\n },\n });\n\n\n\n // Extra converters for the older format ckeditor4 plugins\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionTitle',\n view: {\n name: 'h3',\n classes: 'avoindata-section__title',\n },\n });\n\n conversion.for('upcast').elementToElement({\n model: 'avoindataSectionContent',\n view: {\n name: 'div',\n classes: 'avoindata-section__content',\n },\n });\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionEditing.js?")},"./src/avoindataSection/avoindataSectionUI.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AvoindataSectionUI)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./avoindataSectionView */ \"./src/avoindataSection/avoindataSectionView.js\");\n/* harmony import */ var _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/icon-section.svg?source */ \"./icons/icon-section.svg?source\");\n/**\n * @file registers the avoindataSection toolbar button and binds functionality to it.\n */\n\n\n\n\n\n\nclass AvoindataSectionUI extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n static get requires() {\n return [ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon];\n }\n\n init() {\n const editor = this.editor;\n // Create the balloon and the form view.\n this._balloon = editor.plugins.get(ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ContextualBalloon);\n this.formView = this._createFormView();\n const command = editor.commands.get('insertAvoindataSectionCommand');\n\n // This will register the avoindataSection toolbar button.\n editor.ui.componentFactory.add('avoindataSection', (locale) => {\n const buttonView = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.ButtonView(locale);\n\n // Create the toolbar button.\n buttonView.set({\n label: editor.t('Avoindata Section widget'),\n icon: _icons_icon_section_svg_source__WEBPACK_IMPORTED_MODULE_3__,\n tooltip: true\n });\n\n // Bind the state of the button to the command.\n buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\n\n // Execute the command when the button is clicked (executed).\n /* this.listenTo(buttonView, 'execute', () =>\n editor.execute('insertAvoindataSectionCommand'),\n ); */\n\n // Show the UI on button click.\n this.listenTo(buttonView, 'execute', () => {\n this._showUI();\n });\n\n return buttonView;\n });\n }\n\n _createFormView() {\n const editor = this.editor;\n const formView = new _avoindataSectionView__WEBPACK_IMPORTED_MODULE_2__[\"default\"](editor.locale);\n\n // Execute the command after clicking the \"Save\" button.\n this.listenTo(formView, 'submit', () => {\n // Grab values from the input fields.\n const id = formView.idInputView.fieldView.element.value;\n\n editor.model.change(writer => {\n editor.execute('insertAvoindataSectionCommand', id);\n });\n\n // Hide the form view after submit.\n this._hideUI();\n });\n\n // Hide the form view after clicking the \"Cancel\" button.\n this.listenTo(formView, 'cancel', () => {\n this._hideUI();\n });\n\n // Hide the form view when clicking outside the balloon.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_1__.clickOutsideHandler)({\n emitter: formView,\n activator: () => this._balloon.visibleView === formView,\n contextElements: [this._balloon.view.element],\n callback: () => this._hideUI()\n });\n\n return formView;\n }\n\n _showUI() {\n const selection = this.editor.model.document.selection;\n\n this._balloon.add({\n view: this.formView,\n position: this._getBalloonPositionData()\n });\n\n const id = selection.getSelectedElement()?.getAttribute('avoindataSectionId') || '';\n this.formView.idInputView.fieldView.value = id;\n\n this.formView.focus();\n }\n\n _hideUI() {\n // Clear the input field values and reset the form.\n this.formView.idInputView.fieldView.value = '';\n this.formView.element.reset();\n\n this._balloon.remove(this.formView);\n\n // Focus the editing view after inserting the abbreviation so the user can start typing the content\n // right away and keep the editor focused.\n this.editor.editing.view.focus();\n }\n\n _getBalloonPositionData() {\n const view = this.editor.editing.view;\n const viewDocument = view.document;\n let target = null;\n\n // Set a target position by converting view selection range to DOM\n target = () => view.domConverter.viewRangeToDom(viewDocument.selection.getFirstRange());\n\n return {\n target\n };\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionUI.js?")},"./src/avoindataSection/avoindataSectionView.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FormView)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/ui */ \"ckeditor5/src/ui.js\");\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\n\nclass FormView extends ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.View {\n constructor(locale) {\n super(locale);\n\n this.heading = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabelView(this.locale);\n this.heading.setTemplate({\n tag: 'div',\n attributes: {\n class: ['title']\n },\n children: ['Avoindata section']\n })\n\n this.idInputView = this._createInput('Id');\n\n this.saveButtonView = this._createButton('Save', null, 'btn btn-primary');\n // Submit type of the button will trigger the submit event on entire form when clicked\n // (see submitHandler() in render() below).\n this.saveButtonView.type = 'submit';\n\n this.cancelButtonView = this._createButton('Cancel', null, 'btn btn-secondary');\n\n // Delegate ButtonView#execute to FormView#cancel\n this.cancelButtonView.delegate('execute').to(this, 'cancel');\n\n this.childViews = this.createCollection([\n this.heading,\n this.idInputView,\n this.saveButtonView,\n this.cancelButtonView\n ]);\n\n this.setTemplate({\n tag: 'form',\n attributes: {\n class: ['ck', 'ck-reset_all-excluded', 'avoindata-section-id-form'],\n tabindex: '-1'\n },\n children: this.childViews\n });\n }\n\n render() {\n super.render();\n\n // Submit the form when the user clicked the save button or pressed enter in the input.\n (0,ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.submitHandler)({\n view: this\n });\n }\n\n focus() {\n this.childViews.get(1).focus();\n }\n\n _createInput(label) {\n const labeledInput = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.LabeledFieldView(this.locale, ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.createLabeledInputText);\n\n labeledInput.label = label;\n\n return labeledInput;\n }\n\n _createButton(label, icon, className) {\n const button = new ckeditor5_src_ui__WEBPACK_IMPORTED_MODULE_0__.ButtonView();\n\n button.set({\n label,\n icon,\n tooltip: true,\n class: className,\n withText: true,\n });\n\n return button;\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/avoindataSectionView.js?")},"./src/avoindataSection/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _avoindataSection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./avoindataSection */ "./src/avoindataSection/avoindataSection.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n AvoindataSection: _avoindataSection__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/index.js?')},"./src/avoindataSection/insertAvoindataSectionCommand.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InsertAvoindataSectionCommand)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n/**\n * @file defines InsertAvoindataSectionCommand, which is executed when the avoindataSection\n * toolbar button is pressed.\n */\n\n\n\nclass InsertAvoindataSectionCommand extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Command {\n execute(id) {\n const { model } = this.editor;\n\n model.change((writer) => {\n const existingElement = writer.model.document.selection?.getSelectedElement();\n\n if (existingElement && existingElement.name == 'avoindataSection') {\n writer.setAttribute('avoindataSectionId', id, existingElement);\n } else {\n // Insert * at the current selection position\n // in a way that will result in creating a valid model structure.\n const avoindataSection = createAvoindataSection(writer, id);\n model.insertContent(avoindataSection);\n const selection = writer.createSelection(avoindataSection.getChild(0), 'in');\n writer.setSelection(selection)\n }\n });\n }\n\n refresh() {\n const { model } = this.editor;\n const { selection } = model.document;\n\n // Determine if the cursor (selection) is in a position where adding a\n // avoindataSection is permitted. This is based on the schema of the model(s)\n // currently containing the cursor.\n const allowedIn = model.schema.findAllowedParent(\n selection.getFirstPosition(),\n 'avoindataSection',\n );\n\n // If the cursor is not in a location where a avoindataSection can be added, return\n // null so the addition doesn't happen.\n this.isEnabled = allowedIn !== null;\n }\n}\n\nfunction createAvoindataSection(writer, id) {\n // Create instances of the elements registered with the editor in avoindataexpanderediting.js.\n const avoindataSection = writer.createElement('avoindataSection', { avoindataSectionId: id });\n const avoindataSectionTitle = writer.createElement('avoindataSectionTitle');\n const avoindataSectionContent = writer.createElement('avoindataSectionContent');\n\n // Append the title and content elements to the avoindataSection, which matches\n // the parent/child relationship as defined in their schemas.\n writer.append(avoindataSectionTitle, avoindataSection);\n writer.append(avoindataSectionContent, avoindataSection);\n\n // The text content will automatically be wrapped in a\n // `

`.\n const title = writer.createElement('paragraph');\n writer.insertText('Title', title, 0);\n writer.append(title, avoindataSectionTitle);\n const content = writer.createElement('paragraph');\n writer.insertText('Content', content, 0);\n writer.append(content, avoindataSectionContent);\n\n // Return the element to be added to the editor.\n return avoindataSection;\n}\n\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./src/avoindataSection/insertAvoindataSectionCommand.js?")},"./icons/icon-section.svg?source":module=>{"use strict";eval('module.exports = "\\n \\n \\n \\n \\n\\n";\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/./icons/icon-section.svg?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/ui.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/ui.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./ui.js_from_dll-reference_CKEditor5.dll?')},"ckeditor5/src/widget.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/widget.js");\n\n//# sourceURL=webpack://CKEditor5.avoindataSection/delegated_./widget.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/avoindataSection/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,i),a.exports}i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";i.d(n,{default:()=>r});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js");class o extends e.Command{execute(e){const{model:t}=this.editor;t.change((i=>{const n=i.model.document.selection?.getSelectedElement();if(n&&"avoindataSection"==n.name)i.setAttribute("avoindataSectionId",e,n);else{const n=function(e,t){const i=e.createElement("avoindataSection",{avoindataSectionId:t}),n=e.createElement("avoindataSectionTitle"),o=e.createElement("avoindataSectionContent");e.append(n,i),e.append(o,i);const a=e.createElement("paragraph");e.insertText("Title",a,0),e.append(a,n);const s=e.createElement("paragraph");return e.insertText("Content",s,0),e.append(s,o),i}(i,e);t.insertContent(n);const o=i.createSelection(n.getChild(0),"in");i.setSelection(o)}}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,i=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataSection");this.isEnabled=null!==i}}class a extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataSectionCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataSection",{isObject:!0,allowWhere:"$block",allowAttributes:["avoindataSectionId"],allowContentOf:"$block"}),e.register("avoindataSectionTitle",{isLimit:!0,allowIn:"avoindataSection",allowContentOf:"$root"}),e.register("avoindataSectionContent",{isLimit:!0,allowIn:"avoindataSection",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataSectionContent")||e.endsWith("avoindataSectionTitle"))&&"avoindataSection"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:(e,{writer:t})=>t.createElement("avoindataSection",{avoindataSectionId:e.getAttribute("id")}),view:{name:"div",classes:"avoindata-section",attributes:["id"]}}),e.for("upcast").elementToElement({model:"avoindataSectionTitle",view:{name:"div",classes:"avoindata-section-title"}}),e.for("upcast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section-content"}}),e.for("dataDowncast").elementToElement({model:{name:"avoindataSection",attributes:["avoindataSectionId"]},view:(e,{writer:t})=>t.createContainerElement("div",{class:"avoindata-section",id:e.getAttribute("avoindataSectionId")})}),e.for("dataDowncast").elementToElement({model:"avoindataSectionTitle",view:{name:"div",classes:"avoindata-section-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section-content"}}),e.for("editingDowncast").elementToElement({model:{name:"avoindataSection",attributes:["avoindataSectionId"]},view:(e,{writer:i})=>{const n=i.createContainerElement("div",{class:"avoindata-section",id:e.getAttribute("avoindataSectionId")});return(0,t.toWidget)(n,i,{label:"Avoindata Section widget"})}}),e.for("editingDowncast").elementToElement({model:"avoindataSectionTitle",view:(e,{writer:i})=>{const n=i.createEditableElement("div",{class:"avoindata-section-title"});return(0,t.toWidgetEditable)(n,i)}}),e.for("editingDowncast").elementToElement({model:"avoindataSectionContent",view:(e,{writer:i})=>{const n=i.createEditableElement("div",{class:"avoindata-section-content"});return(0,t.toWidgetEditable)(n,i)}}),e.for("upcast").elementToElement({model:"avoindataSectionTitle",view:{name:"h3",classes:"avoindata-section__title"}}),e.for("upcast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section__content"}})}}var s=i("ckeditor5/src/ui.js");class d extends s.View{constructor(e){super(e),this.heading=new s.LabelView(this.locale),this.heading.setTemplate({tag:"div",attributes:{class:["title"]},children:["Avoindata section"]}),this.idInputView=this._createInput("Id"),this.saveButtonView=this._createButton("Save",null,"btn btn-primary"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton("Cancel",null,"btn btn-secondary"),this.cancelButtonView.delegate("execute").to(this,"cancel"),this.childViews=this.createCollection([this.heading,this.idInputView,this.saveButtonView,this.cancelButtonView]),this.setTemplate({tag:"form",attributes:{class:["ck","ck-reset_all-excluded","avoindata-section-id-form"],tabindex:"-1"},children:this.childViews})}render(){super.render(),(0,s.submitHandler)({view:this})}focus(){this.childViews.get(1).focus()}_createInput(e){const t=new s.LabeledFieldView(this.locale,s.createLabeledInputText);return t.label=e,t}_createButton(e,t,i){const n=new s.ButtonView;return n.set({label:e,icon:t,tooltip:!0,class:i,withText:!0}),n}}class l extends e.Plugin{static get requires(){return[s.ContextualBalloon]}init(){const e=this.editor;this._balloon=e.plugins.get(s.ContextualBalloon),this.formView=this._createFormView();const t=e.commands.get("insertAvoindataSectionCommand");e.ui.componentFactory.add("avoindataSection",(i=>{const n=new s.ButtonView(i);return n.set({label:e.t("Avoindata Section"),icon:'\n \n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(t,"value","isEnabled"),this.listenTo(n,"execute",(()=>{this._showUI()})),n}))}_createFormView(){const e=this.editor,t=new d(e.locale);return this.listenTo(t,"submit",(()=>{const i=t.idInputView.fieldView.element.value;e.model.change((t=>{e.execute("insertAvoindataSectionCommand",i)})),this._hideUI()})),this.listenTo(t,"cancel",(()=>{this._hideUI()})),(0,s.clickOutsideHandler)({emitter:t,activator:()=>this._balloon.visibleView===t,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()}),t}_showUI(){const e=this.editor.model.document.selection;this._balloon.add({view:this.formView,position:this._getBalloonPositionData()});const t=e.getSelectedElement()?.getAttribute("avoindataSectionId")||"";this.formView.idInputView.fieldView.value=t,this.formView.focus()}_hideUI(){this.formView.idInputView.fieldView.value="",this.formView.element.reset(),this._balloon.remove(this.formView),this.editor.editing.view.focus()}_getBalloonPositionData(){const e=this.editor.editing.view,t=e.document;let i=null;return i=()=>e.domConverter.viewRangeToDom(t.selection.getFirstRange()),{target:i}}}class c extends e.Plugin{static get requires(){return[a,l]}}const r={AvoindataSection:c}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js deleted file mode 100644 index 8ae19068f8..0000000000 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/externalLink.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.CKEditor5=n():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.externalLink=n())}(self,(()=>(()=>{var __webpack_modules__={"./src/externalLink/externalLink.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ExternalLink)\n/* harmony export */ });\n/* harmony import */ var ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ckeditor5/src/core */ \"ckeditor5/src/core.js\");\n\n\nclass ExternalLink extends ckeditor5_src_core__WEBPACK_IMPORTED_MODULE_0__.Plugin {\n init() {\n const { conversion } = this.editor;\n\n // Upcast Converter for the old ckeditor4 plugin format\n conversion.for('upcast').elementToAttribute({\n model: 'linkIsExternal',\n view: {\n name: 'a',\n classes: ['external'],\n attributes: ['aria-label', 'target'],\n },\n });\n\n // Extra consumption for the leftover svg icon\n conversion.for('upcast').add(dispatcher => {\n // Look for every view svg element.\n dispatcher.on('element:svg', (evt, data, conversionApi) => {\n // Get all the necessary items from the conversion API object.\n const {\n consumable\n } = conversionApi;\n\n // Get view item from data object.\n const { viewItem } = data;\n\n // Define elements consumables.\n const svg = { name: 'svg', attributes: ['viewBox'] };\n const use = { name: 'use', attributes: ['href'] };\n\n // Tests if the view element can be consumed.\n if (!consumable.test(viewItem, svg)) {\n return;\n }\n\n // Check if there is only one child.\n if (viewItem.childCount !== 1) {\n return;\n }\n\n // Get the first child element.\n const firstChildItem = viewItem.getChild(0);\n\n // Check if the first element is a div.\n if (!firstChildItem.is('element', 'use')) {\n return;\n }\n\n // Tests if the first child element can be consumed.\n if (!consumable.test(firstChildItem, use)) {\n return;\n }\n\n // If a use tag inside a svg has the string 'avoindata_external-link' within the href\n // we can assume it's the old ckeditor4 plugin format and simply get rid of them\n if (firstChildItem?.getAttribute('href')?.includes('avoindata_external-link')) {\n // Consume the main outer wrapper element.\n consumable.consume(viewItem, svg);\n // Consume the inner wrapper element.\n consumable.consume(firstChildItem, use);\n }\n });\n });\n /*\n const editor = this.editor;\n\n // `listenTo()` and `editor` are available thanks to `Plugin`.\n // By using `listenTo()` you will ensure that the listener is removed when\n // the plugin is destroyed.\n this.listenTo(editor.data, 'ready', () => {\n const linkCommand = editor.commands.get('link');\n const { selection } = editor.model.document;\n\n let linkCommandExecuting = false;\n\n linkCommand.on('execute', (evt, args) => {\n const linkIsExternal = args[1]['linkIsExternal']\n\n if (linkIsExternal) {\n if (linkCommandExecuting) {\n linkCommandExecuting = false;\n return;\n }\n\n // If the additional attribute was passed, we stop the default execution\n // of the LinkCommand. We're going to create Model#change() block for undo\n // and execute the LinkCommand together with setting the extra attribute.\n evt.stop();\n\n // Prevent infinite recursion by keeping records of when link command is\n // being executed by this function.\n linkCommandExecuting = true;\n\n // Wrapping the original command execution in a model.change() block to make sure there's a single undo step\n // when the extra attribute is added.\n\n editor.model.change(writer => {\n editor.execute('link', ...args);\n const link = selection.getLastPosition().nodeBefore;\n // writer.insertElement('avoindataExternalLink', selection.getLastPosition())\n });\n }\n })\n });\n */\n }\n\n static get pluginName() {\n return 'ExternalLink';\n }\n}\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/externalLink.js?")},"./src/externalLink/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _externalLink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalLink */ "./src/externalLink/externalLink.js");\n/**\n * @file The build process always expects an index.js file. Anything exported\n * here will be recognized by CKEditor 5 as an available plugin. Multiple\n * plugins can be exported in this one file.\n *\n * I.e. this file\'s purpose is to make plugin(s) discoverable.\n */\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n ExternalLink: _externalLink__WEBPACK_IMPORTED_MODULE_0__["default"],\n});\n\n\n//# sourceURL=webpack://CKEditor5.externalLink/./src/externalLink/index.js?')},"ckeditor5/src/core.js":(module,__unused_webpack_exports,__webpack_require__)=>{eval('module.exports = (__webpack_require__(/*! dll-reference CKEditor5.dll */ "dll-reference CKEditor5.dll"))("./src/core.js");\n\n//# sourceURL=webpack://CKEditor5.externalLink/delegated_./core.js_from_dll-reference_CKEditor5.dll?')},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.d=(e,n)=>{for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/externalLink/index.js");return __webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json b/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json index e7f18df65b..5693d663b9 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json +++ b/drupal/modules/avoindata-ckeditor5-plugins/package-lock.json @@ -10,7 +10,6 @@ "license": "GPL-2.0-or-later", "devDependencies": { "@ckeditor/ckeditor5-dev-utils": "^30.0.0", - "@ckeditor/ckeditor5-link": "^39.0.1", "ckeditor5": "~34.1.0", "file-loader": "^6.2.0", "raw-loader": "^4.0.2", @@ -385,21 +384,6 @@ "npm": ">=5.7.1" } }, - "node_modules/@ckeditor/ckeditor5-core": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-39.0.1.tgz", - "integrity": "sha512-3hva3sRdDS2TLDhQNKgnJmpdXhuaod5tooDI/vnaiK+kduqy3nPuWI0qHtFpMhe7dlQWPZSI9ZhS/7cfFQ4CUg==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, "node_modules/@ckeditor/ckeditor5-dev-utils": { "version": "30.5.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-30.5.0.tgz", @@ -551,20 +535,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@ckeditor/ckeditor5-engine": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-39.0.1.tgz", - "integrity": "sha512-QWyx1vO7+UO3rVIx9o1M7q05ghu1T+E4ugnzlcjLx+TiRLBH280M5RmxZ5gE8HjTSIabGDK1M0kmskL+wl2nDw==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, "node_modules/@ckeditor/ckeditor5-enter": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-34.2.0.tgz", @@ -638,174 +608,6 @@ "npm": ">=5.7.1" } }, - "node_modules/@ckeditor/ckeditor5-link": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-39.0.1.tgz", - "integrity": "sha512-P9ZO7JihRhVUKyvE0rcBjEwlN4ZKFpBCeWimL5yM05L047FNb5yXQecmQfMDDpgYQl3Ggsm07QuWo/uG/0j/mQ==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-ui": "39.0.1", - "ckeditor5": "39.0.1", - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-clipboard": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-39.0.1.tgz", - "integrity": "sha512-OIlIvsiz6YTZM8o1Y1zG9eW9rUx06Bs3rMbMv37kNN1vq145D9h0OQt0iPKw1eXAG387Sk+SWZhO+Um+/O3eGw==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "@ckeditor/ckeditor5-widget": "39.0.1", - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-enter": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-39.0.1.tgz", - "integrity": "sha512-4gF0CFbEgZowQGmcyKP9KKBKOk67bdQIP5y71QvDgP6rUdbOQ5NDAS3FKis6a2Aubhtg92BO4QC6tZADPiW3hA==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-paragraph": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-39.0.1.tgz", - "integrity": "sha512-zKYtpka2X8uR6bTiCXecwl86XKQ8ngk7Hm3UkmptDSfBDOp9PpFCeA3i8m1soFvT2OcdxQYbuAcd9TwoV/HY0g==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-select-all": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-39.0.1.tgz", - "integrity": "sha512-Q4BwezfYmZEwODecoxXc2+2UNUkx/Gu5n7jZH/2kKNBVFwb3iVIun9tj5Q1+093FKjmLA46maYsG5HIG6eArTg==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-typing": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-39.0.1.tgz", - "integrity": "sha512-bfMGH3IKj8LdhzfMpfOFUlnCPkpGQhl1HN2oF2g7EViOfuDKM4A2GboUIEqRP2C3tkwtHK5zM55Rdbd71DAQPQ==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-undo": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-39.0.1.tgz", - "integrity": "sha512-fgI5zNylzuiT2EitHm9ZVaAXB27JxOmONe51tSe9aUQoUkFLHau0HJfTNpKgHQTEPXMxhUPzH09xvj7QEc94Pg==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-upload": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-39.0.1.tgz", - "integrity": "sha512-VVVWErIHRnw5kw00t8OYLxHDgSE1ywtoy/Zih0GJVxe882jIfajPj7KdZUjylfZuPeQnp1kAIpoe+WX3scvxFQ==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/@ckeditor/ckeditor5-widget": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-39.0.1.tgz", - "integrity": "sha512-rd4ojJcdZQJttrrDogycDa+sb/rtKu9sU7G0+QEoJZXD25WjxIEgjyOoIqfv2UZZrZDX/0u8dviGhPbcbQEEnw==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-enter": "39.0.1", - "@ckeditor/ckeditor5-typing": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-link/node_modules/ckeditor5": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-39.0.1.tgz", - "integrity": "sha512-KU6P0U9HQdsj7YBNZyG72ii+LNjIuWqxwdhlcd+QN11urQSDzoC6OjnqtDZ2Q3dQvwYf2aN9kDwUA9ElQ1krIg==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-clipboard": "39.0.1", - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-enter": "39.0.1", - "@ckeditor/ckeditor5-paragraph": "39.0.1", - "@ckeditor/ckeditor5-select-all": "39.0.1", - "@ckeditor/ckeditor5-typing": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-undo": "39.0.1", - "@ckeditor/ckeditor5-upload": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "@ckeditor/ckeditor5-watchdog": "39.0.1", - "@ckeditor/ckeditor5-widget": "39.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, "node_modules/@ckeditor/ckeditor5-paragraph": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-34.2.0.tgz", @@ -1026,24 +828,6 @@ "npm": ">=5.7.1" } }, - "node_modules/@ckeditor/ckeditor5-ui": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-39.0.1.tgz", - "integrity": "sha512-6mBZNfMVSjyNb3HHyjJFwrR2rvmTuH1JSc+ebuulw5knYQmDaeCaS4tiYmOVcGGz/WcrAYRQAtSGrfZmuLesMQ==", - "dev": true, - "dependencies": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "color-convert": "2.0.1", - "color-parse": "1.4.2", - "lodash-es": "4.17.21", - "vanilla-colorful": "0.7.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, "node_modules/@ckeditor/ckeditor5-undo": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-34.2.0.tgz", @@ -1190,32 +974,6 @@ "npm": ">=5.7.1" } }, - "node_modules/@ckeditor/ckeditor5-utils": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-39.0.1.tgz", - "integrity": "sha512-lQ+1h4FgUScEdk547uCzfdvajFigVt4u0mRw1m9TtJ3B2GiatwRvst8TZEuWl8aFrIHjQ/gho66QIElJi/6+CA==", - "dev": true, - "dependencies": { - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, - "node_modules/@ckeditor/ckeditor5-watchdog": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-39.0.1.tgz", - "integrity": "sha512-f5Uo0RdcbeKGs0gmBm8Y8c+Z9YgcjqX7ai4vdcw8HIEc0vCeEanPt816V53nLZ3LbPgez8LeWluR7VlzoxKO+g==", - "dev": true, - "dependencies": { - "lodash-es": "4.17.21" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=5.7.1" - } - }, "node_modules/@ckeditor/ckeditor5-widget": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-34.2.0.tgz", @@ -2140,15 +1898,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/color-parse": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz", - "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0" - } - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -5057,12 +4806,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/vanilla-colorful": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz", - "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==", - "dev": true - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -5577,17 +5320,6 @@ } } }, - "@ckeditor/ckeditor5-core": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-39.0.1.tgz", - "integrity": "sha512-3hva3sRdDS2TLDhQNKgnJmpdXhuaod5tooDI/vnaiK+kduqy3nPuWI0qHtFpMhe7dlQWPZSI9ZhS/7cfFQ4CUg==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - } - }, "@ckeditor/ckeditor5-dev-utils": { "version": "30.5.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-30.5.0.tgz", @@ -5703,16 +5435,6 @@ } } }, - "@ckeditor/ckeditor5-engine": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-39.0.1.tgz", - "integrity": "sha512-QWyx1vO7+UO3rVIx9o1M7q05ghu1T+E4ugnzlcjLx+TiRLBH280M5RmxZ5gE8HjTSIabGDK1M0kmskL+wl2nDw==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - } - }, "@ckeditor/ckeditor5-enter": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-34.2.0.tgz", @@ -5768,136 +5490,6 @@ } } }, - "@ckeditor/ckeditor5-link": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-39.0.1.tgz", - "integrity": "sha512-P9ZO7JihRhVUKyvE0rcBjEwlN4ZKFpBCeWimL5yM05L047FNb5yXQecmQfMDDpgYQl3Ggsm07QuWo/uG/0j/mQ==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-ui": "39.0.1", - "ckeditor5": "39.0.1", - "lodash-es": "4.17.21" - }, - "dependencies": { - "@ckeditor/ckeditor5-clipboard": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-39.0.1.tgz", - "integrity": "sha512-OIlIvsiz6YTZM8o1Y1zG9eW9rUx06Bs3rMbMv37kNN1vq145D9h0OQt0iPKw1eXAG387Sk+SWZhO+Um+/O3eGw==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "@ckeditor/ckeditor5-widget": "39.0.1", - "lodash-es": "4.17.21" - } - }, - "@ckeditor/ckeditor5-enter": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-39.0.1.tgz", - "integrity": "sha512-4gF0CFbEgZowQGmcyKP9KKBKOk67bdQIP5y71QvDgP6rUdbOQ5NDAS3FKis6a2Aubhtg92BO4QC6tZADPiW3hA==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - } - }, - "@ckeditor/ckeditor5-paragraph": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-39.0.1.tgz", - "integrity": "sha512-zKYtpka2X8uR6bTiCXecwl86XKQ8ngk7Hm3UkmptDSfBDOp9PpFCeA3i8m1soFvT2OcdxQYbuAcd9TwoV/HY0g==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - } - }, - "@ckeditor/ckeditor5-select-all": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-39.0.1.tgz", - "integrity": "sha512-Q4BwezfYmZEwODecoxXc2+2UNUkx/Gu5n7jZH/2kKNBVFwb3iVIun9tj5Q1+093FKjmLA46maYsG5HIG6eArTg==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - } - }, - "@ckeditor/ckeditor5-typing": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-39.0.1.tgz", - "integrity": "sha512-bfMGH3IKj8LdhzfMpfOFUlnCPkpGQhl1HN2oF2g7EViOfuDKM4A2GboUIEqRP2C3tkwtHK5zM55Rdbd71DAQPQ==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - } - }, - "@ckeditor/ckeditor5-undo": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-39.0.1.tgz", - "integrity": "sha512-fgI5zNylzuiT2EitHm9ZVaAXB27JxOmONe51tSe9aUQoUkFLHau0HJfTNpKgHQTEPXMxhUPzH09xvj7QEc94Pg==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1" - } - }, - "@ckeditor/ckeditor5-upload": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-39.0.1.tgz", - "integrity": "sha512-VVVWErIHRnw5kw00t8OYLxHDgSE1ywtoy/Zih0GJVxe882jIfajPj7KdZUjylfZuPeQnp1kAIpoe+WX3scvxFQ==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1" - } - }, - "@ckeditor/ckeditor5-widget": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-39.0.1.tgz", - "integrity": "sha512-rd4ojJcdZQJttrrDogycDa+sb/rtKu9sU7G0+QEoJZXD25WjxIEgjyOoIqfv2UZZrZDX/0u8dviGhPbcbQEEnw==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-enter": "39.0.1", - "@ckeditor/ckeditor5-typing": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "lodash-es": "4.17.21" - } - }, - "ckeditor5": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-39.0.1.tgz", - "integrity": "sha512-KU6P0U9HQdsj7YBNZyG72ii+LNjIuWqxwdhlcd+QN11urQSDzoC6OjnqtDZ2Q3dQvwYf2aN9kDwUA9ElQ1krIg==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-clipboard": "39.0.1", - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-engine": "39.0.1", - "@ckeditor/ckeditor5-enter": "39.0.1", - "@ckeditor/ckeditor5-paragraph": "39.0.1", - "@ckeditor/ckeditor5-select-all": "39.0.1", - "@ckeditor/ckeditor5-typing": "39.0.1", - "@ckeditor/ckeditor5-ui": "39.0.1", - "@ckeditor/ckeditor5-undo": "39.0.1", - "@ckeditor/ckeditor5-upload": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "@ckeditor/ckeditor5-watchdog": "39.0.1", - "@ckeditor/ckeditor5-widget": "39.0.1" - } - } - } - }, "@ckeditor/ckeditor5-paragraph": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-34.2.0.tgz", @@ -6064,20 +5656,6 @@ } } }, - "@ckeditor/ckeditor5-ui": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-39.0.1.tgz", - "integrity": "sha512-6mBZNfMVSjyNb3HHyjJFwrR2rvmTuH1JSc+ebuulw5knYQmDaeCaS4tiYmOVcGGz/WcrAYRQAtSGrfZmuLesMQ==", - "dev": true, - "requires": { - "@ckeditor/ckeditor5-core": "39.0.1", - "@ckeditor/ckeditor5-utils": "39.0.1", - "color-convert": "2.0.1", - "color-parse": "1.4.2", - "lodash-es": "4.17.21", - "vanilla-colorful": "0.7.2" - } - }, "@ckeditor/ckeditor5-undo": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-34.2.0.tgz", @@ -6188,24 +5766,6 @@ } } }, - "@ckeditor/ckeditor5-utils": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-39.0.1.tgz", - "integrity": "sha512-lQ+1h4FgUScEdk547uCzfdvajFigVt4u0mRw1m9TtJ3B2GiatwRvst8TZEuWl8aFrIHjQ/gho66QIElJi/6+CA==", - "dev": true, - "requires": { - "lodash-es": "4.17.21" - } - }, - "@ckeditor/ckeditor5-watchdog": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-39.0.1.tgz", - "integrity": "sha512-f5Uo0RdcbeKGs0gmBm8Y8c+Z9YgcjqX7ai4vdcw8HIEc0vCeEanPt816V53nLZ3LbPgez8LeWluR7VlzoxKO+g==", - "dev": true, - "requires": { - "lodash-es": "4.17.21" - } - }, "@ckeditor/ckeditor5-widget": { "version": "34.2.0", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-34.2.0.tgz", @@ -6938,15 +6498,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "color-parse": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz", - "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==", - "dev": true, - "requires": { - "color-name": "^1.0.0" - } - }, "colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -8955,12 +8506,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "vanilla-colorful": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz", - "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==", - "dev": true - }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js index 394b0cac1c..1c1778821b 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleEditing.js @@ -181,7 +181,7 @@ export default class AvoindataExampleEditing extends Plugin { class: 'avoindata-example', }); - return toWidget(section, viewWriter, { label: 'Avoindata Example widget' }); + return toWidget(section, viewWriter, { label: 'Avoindata Example' }); }, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js index 1f119ef030..16db40f14b 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExampleUI.js @@ -17,7 +17,7 @@ export default class AvoindataExampleUI extends Plugin { // Create the toolbar button. buttonView.set({ - label: editor.t('Avoindata Example widget'), + label: editor.t('Avoindata Example'), icon, tooltip: true, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js index 14ead525cb..7f65c6462c 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/insertAvoindataExampleCommand.js @@ -12,7 +12,8 @@ export default class InsertAvoindataExampleCommand extends Command { model.change((writer) => { // Insert * at the current selection position // in a way that will result in creating a valid model structure. - model.insertContent(createAvoindataExample(writer)); + const avoindataExample = createAvoindataExample(writer); + model.insertContent(avoindataExample); }); } @@ -48,8 +49,12 @@ function createAvoindataExample(writer) { // The text content will automatically be wrapped in a // `

`. - writer.appendElement('paragraph', avoindataExampleTitle); - writer.appendElement('paragraph', avoindataExampleContent); + const title = writer.createElement('paragraph'); + writer.insertText('Title', title, 0); + writer.append(title, avoindataExampleTitle); + const content = writer.createElement('paragraph'); + writer.insertText('Content', content, 0); + writer.append(content, avoindataExampleContent); // Return the element to be added to the editor. return avoindataExample; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js index d47aeb3e74..d28ee28b93 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderEditing.js @@ -188,7 +188,7 @@ export default class AvoindataExpanderEditing extends Plugin { class: 'avoindata-expander', }); - return toWidget(section, viewWriter, { label: 'Avoindata Expander widget' }); + return toWidget(section, viewWriter, { label: 'Avoindata Expander' }); }, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js index fdd778d37a..76821a6c2f 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpanderUI.js @@ -17,7 +17,7 @@ export default class AvoindataExpanderUI extends Plugin { // Create the toolbar button. buttonView.set({ - label: editor.t('Avoindata Expander widget'), + label: editor.t('Avoindata Expander'), icon, tooltip: true, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js index 44e7656db6..9fff3f65b4 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/insertAvoindataExpanderCommand.js @@ -12,7 +12,8 @@ export default class InsertAvoindataExpanderCommand extends Command { model.change((writer) => { // Insert * at the current selection position // in a way that will result in creating a valid model structure. - model.insertContent(createAvoindataExpander(writer)); + const avoindataExpander = createAvoindataExpander(writer); + model.insertContent(avoindataExpander); }); } @@ -48,8 +49,12 @@ function createAvoindataExpander(writer) { // The text content will automatically be wrapped in a // `

`. - writer.appendElement('paragraph', avoindataExpanderTitle); - writer.appendElement('paragraph', avoindataExpanderContent); + const title = writer.createElement('paragraph'); + writer.insertText('Title', title, 0); + writer.append(title, avoindataExpanderTitle); + const content = writer.createElement('paragraph'); + writer.insertText('Content', content, 0); + writer.append(content, avoindataExpanderContent); // Return the element to be added to the editor. return avoindataExpander; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js index c40e0d5e90..9197d6f08d 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintEditing.js @@ -2,6 +2,7 @@ import { Plugin } from 'ckeditor5/src/core'; import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget'; import { Widget } from 'ckeditor5/src/widget'; import InsertAvoindataHintCommand from './insertAvoindataHintCommand'; +import icon from '../../icons/icon-hint.svg' /** * CKEditor 5 plugins do not work directly with the DOM. They are defined as @@ -155,7 +156,7 @@ export default class AvoindataHintEditing extends Plugin { conversion.for('downcast').elementToElement({ model: 'avoindataHintIcon', view: (modelElement, { writer }) => { - return writer.createEmptyElement('img', { class: "avoindata-hint-icon", src: '/themes/avoindata/images/avoindata-hint-icon.svg' }) + return writer.createEmptyElement('img', { class: "avoindata-hint-icon", src: icon }) } }); @@ -182,7 +183,7 @@ export default class AvoindataHintEditing extends Plugin { class: 'avoindata-hint', }); - return toWidget(section, viewWriter, { label: 'Avoindata Hint widget' }); + return toWidget(section, viewWriter, { label: 'Avoindata Hint' }); }, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js index 76d44236fb..35d8f477b3 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHintUI.js @@ -17,7 +17,7 @@ export default class AvoindataHintUI extends Plugin { // Create the toolbar button. buttonView.set({ - label: editor.t('Avoindata Hint widget'), + label: editor.t('Avoindata Hint'), icon, tooltip: true, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js index 7af54eae12..aa3094f046 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/insertAvoindataHintCommand.js @@ -12,7 +12,8 @@ export default class InsertAvoindataHintCommand extends Command { model.change((writer) => { // Insert * at the current selection position // in a way that will result in creating a valid model structure. - model.insertContent(createAvoindataHint(writer)); + const avoindataHint = createAvoindataHint(writer); + model.insertContent(avoindataHint); }); } @@ -48,7 +49,9 @@ function createAvoindataHint(writer) { // The text content will automatically be wrapped in a // `

`. - writer.appendElement('paragraph', avoindataHintContent); + const content = writer.createElement('paragraph'); + writer.insertText('Content', content, 0); + writer.append(content, avoindataHintContent); // Return the element to be added to the editor. return avoindataHint; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js index 0fca5d1797..3727233b2a 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNoteEditing.js @@ -219,7 +219,7 @@ export default class AvoindataNoteEditing extends Plugin { class: 'avoindata-note', }); - return toWidget(section, viewWriter, { label: 'Avoindata Note widget' }); + return toWidget(section, viewWriter, { label: 'Avoindata Note' }); }, }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js index f220b4b9b0..0cb1625243 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/insertAvoindataNoteCommand.js @@ -12,7 +12,8 @@ export default class InsertAvoindataNoteCommand extends Command { model.change((writer) => { // Insert * at the current selection position // in a way that will result in creating a valid model structure. - model.insertContent(createAvoindataNote(writer)); + const avoindataNote = createAvoindataNote(writer); + model.insertContent(avoindataNote); }); } @@ -50,8 +51,12 @@ function createAvoindataNote(writer) { // The text content will automatically be wrapped in a // `

`. - writer.appendElement('paragraph', avoindataNoteTitle); - writer.appendElement('paragraph', avoindataNoteContent); + const title = writer.createElement('paragraph'); + writer.insertText('Title', title, 0); + writer.append(title, avoindataNoteTitle); + const content = writer.createElement('paragraph'); + writer.insertText('Content', content, 0); + writer.append(content, avoindataNoteContent); // Return the element to be added to the editor. return avoindataNote; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js index 2c557b8626..64857dec06 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSectionUI.js @@ -25,7 +25,7 @@ export default class AvoindataSectionUI extends Plugin { // Create the toolbar button. buttonView.set({ - label: editor.t('Avoindata Section widget'), + label: editor.t('Avoindata Section'), icon, tooltip: true }); diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js deleted file mode 100644 index fb75e9d64b..0000000000 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/externalLink.js +++ /dev/null @@ -1,113 +0,0 @@ -import { Plugin } from 'ckeditor5/src/core'; - -export default class ExternalLink extends Plugin { - init() { - const { conversion } = this.editor; - - // Upcast Converter for the old ckeditor4 plugin format - conversion.for('upcast').elementToAttribute({ - model: 'linkIsExternal', - view: { - name: 'a', - classes: ['external'], - attributes: ['aria-label', 'target'], - }, - }); - - // Extra consumption for the leftover svg icon - conversion.for('upcast').add(dispatcher => { - // Look for every view svg element. - dispatcher.on('element:svg', (evt, data, conversionApi) => { - // Get all the necessary items from the conversion API object. - const { - consumable - } = conversionApi; - - // Get view item from data object. - const { viewItem } = data; - - // Define elements consumables. - const svg = { name: 'svg', attributes: ['viewBox'] }; - const use = { name: 'use', attributes: ['href'] }; - - // Tests if the view element can be consumed. - if (!consumable.test(viewItem, svg)) { - return; - } - - // Check if there is only one child. - if (viewItem.childCount !== 1) { - return; - } - - // Get the first child element. - const firstChildItem = viewItem.getChild(0); - - // Check if the first element is a div. - if (!firstChildItem.is('element', 'use')) { - return; - } - - // Tests if the first child element can be consumed. - if (!consumable.test(firstChildItem, use)) { - return; - } - - // If a use tag inside a svg has the string 'avoindata_external-link' within the href - // we can assume it's the old ckeditor4 plugin format and simply get rid of them - if (firstChildItem?.getAttribute('href')?.includes('avoindata_external-link')) { - // Consume the main outer wrapper element. - consumable.consume(viewItem, svg); - // Consume the inner wrapper element. - consumable.consume(firstChildItem, use); - } - }); - }); - /* - const editor = this.editor; - - // `listenTo()` and `editor` are available thanks to `Plugin`. - // By using `listenTo()` you will ensure that the listener is removed when - // the plugin is destroyed. - this.listenTo(editor.data, 'ready', () => { - const linkCommand = editor.commands.get('link'); - const { selection } = editor.model.document; - - let linkCommandExecuting = false; - - linkCommand.on('execute', (evt, args) => { - const linkIsExternal = args[1]['linkIsExternal'] - - if (linkIsExternal) { - if (linkCommandExecuting) { - linkCommandExecuting = false; - return; - } - - // If the additional attribute was passed, we stop the default execution - // of the LinkCommand. We're going to create Model#change() block for undo - // and execute the LinkCommand together with setting the extra attribute. - evt.stop(); - - // Prevent infinite recursion by keeping records of when link command is - // being executed by this function. - linkCommandExecuting = true; - - // Wrapping the original command execution in a model.change() block to make sure there's a single undo step - // when the extra attribute is added. - - editor.model.change(writer => { - editor.execute('link', ...args); - const link = selection.getLastPosition().nodeBefore; - // writer.insertElement('avoindataExternalLink', selection.getLastPosition()) - }); - } - }) - }); - */ - } - - static get pluginName() { - return 'ExternalLink'; - } -} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js deleted file mode 100644 index b0e2d65cb1..0000000000 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/externalLink/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @file The build process always expects an index.js file. Anything exported - * here will be recognized by CKEditor 5 as an available plugin. Multiple - * plugins can be exported in this one file. - * - * I.e. this file's purpose is to make plugin(s) discoverable. - */ - -import ExternalLink from './externalLink'; - -export default { - ExternalLink, -}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js index b8badd640f..86eb697773 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js @@ -69,11 +69,17 @@ getDirectories('./src').forEach((dir) => { }, { test: /\.svg$/, - type: "asset/inline", + type: "asset/resource", + generator: { + filename: '../icons/[base]' + } }, { test: /\.css$/, - type: 'asset' + type: "asset/resource", + generator: { + filename: '../css/[base]' + } } ] }] From 5ac65ecfbf7441ab4ea0004b9c24922658b1aeaf Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Fri, 6 Oct 2023 13:31:06 +0300 Subject: [PATCH 10/30] AV-2055: Add pg_trgm extension to database as drupal 10 requires it --- docker/postgres/docker-entrypoint-initdb.d/00_init_db.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker/postgres/docker-entrypoint-initdb.d/00_init_db.sh b/docker/postgres/docker-entrypoint-initdb.d/00_init_db.sh index 1f6c88aebc..061f249e6d 100644 --- a/docker/postgres/docker-entrypoint-initdb.d/00_init_db.sh +++ b/docker/postgres/docker-entrypoint-initdb.d/00_init_db.sh @@ -16,6 +16,11 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL GRANT ALL PRIVILEGES ON DATABASE $DB_DRUPAL TO $POSTGRES_USER; EOSQL +# Create pg_trgm extension for drupal, can be removed once postgres is at least 13 and drupal is in version 10 +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" -d "$DB_DRUPAL" <<-EOSQL + CREATE EXTENSION pg_trgm; +EOSQL + # init datapusher job database psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL CREATE ROLE $DB_DATAPUSHER_JOBS_USER LOGIN PASSWORD '$DB_DATAPUSHER_JOBS_PASS'; From f71ca1e9cf4a5e8abb0aa79d68db112839107b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Fri, 6 Oct 2023 13:16:42 +0200 Subject: [PATCH 11/30] AV-2017: Fixes --- .../avoindata_ckeditor5_plugins.libraries.yml | 19 +- .../avoindata-ckeditor5-plugins/css/style.css | 2 - .../css/styles.css | 412 ++++++++++++++++++ .../css/toolbar-icons.css | 10 +- .../js/avoindataExample.js | 2 +- .../js/avoindataExpander.js | 2 +- .../js/avoindataExternalLink.js | 1 + .../js/avoindataHint.js | 2 +- .../js/avoindataNote.js | 2 +- .../js/avoindataSection.js | 2 +- .../src/avoindataExample/avoindataExample.js | 1 + .../avoindataExpander/avoindataExpander.js | 1 + .../avoindataExternalLink.js | 114 +++++ .../src/avoindataExternalLink/index.js | 13 + .../src/avoindataHint/avoindataHint.js | 1 + .../src/avoindataNote/avoindataNote.js | 1 + .../src/avoindataSection/avoindataSection.js | 1 + .../webpack.config.js | 1 - .../site_config/editor.editor.ckeditor5.yml | 56 +++ .../site_config/filter.format.ckeditor5.yml | 67 +++ opendata-assets/gulpfile.js | 17 + .../src/less/drupal/custom-elements.less | 9 +- .../src/less/drupal/editor.less | 65 +-- 23 files changed, 744 insertions(+), 57 deletions(-) delete mode 100644 drupal/modules/avoindata-ckeditor5-plugins/css/style.css create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/css/styles.css create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExternalLink.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js create mode 100644 drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/index.js create mode 100644 drupal/site_config/editor.editor.ckeditor5.yml create mode 100644 drupal/site_config/filter.format.ckeditor5.yml rename drupal/modules/avoindata-ckeditor5-plugins/css/editor.css => opendata-assets/src/less/drupal/editor.less (76%) diff --git a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml index d61d5b4b90..4313aa923d 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml +++ b/drupal/modules/avoindata-ckeditor5-plugins/avoindata_ckeditor5_plugins.libraries.yml @@ -1,6 +1,9 @@ # This adds the plugin JavaScript to the page. avoindataExternalLink: + css: + theme: + css/styles.css: {} js: js/avoindataExternalLink.js: { preprocess: false, minified: true } dependencies: @@ -9,7 +12,7 @@ avoindataExternalLink: avoindataExpander: css: theme: - css/editor.css: {} + css/styles.css: {} js: js/avoindataExpander.js: { preprocess: false, minified: false } dependencies: @@ -18,8 +21,7 @@ avoindataExpander: avoindataNote: css: theme: - - css/editor.css: {} - - css/style.css: {} + css/styles.css: {} js: js/avoindataNote.js: { preprocess: false, minified: false } dependencies: @@ -28,8 +30,7 @@ avoindataNote: avoindataHint: css: theme: - - css/editor.css: {} - - css/style.css: {} + css/styles.css: {} js: js/avoindataHint.js: { preprocess: false, minified: false } dependencies: @@ -38,8 +39,7 @@ avoindataHint: avoindataExample: css: theme: - - css/editor.css: {} - - css/style.css: {} + css/styles.css: {} js: js/avoindataExample.js: { preprocess: false, minified: false } dependencies: @@ -48,8 +48,7 @@ avoindataExample: avoindataSection: css: theme: - - css/editor.css: {} - - css/style.css: {} + css/styles.css: {} js: js/avoindataSection.js: { preprocess: false, minified: false } dependencies: @@ -61,5 +60,3 @@ toolbarIcons: css: theme: css/toolbar-icons.css: {} - - diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css b/drupal/modules/avoindata-ckeditor5-plugins/css/style.css deleted file mode 100644 index 66c0facdd8..0000000000 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/style.css +++ /dev/null @@ -1,2 +0,0 @@ -.external-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-line-pack:center;align-content:center}.external-link::after{content:'';width:24px;height:24px;-webkit-transform:scale(.6);transform:scale(.6);margin-left:2px;background-image:url(../images/icon-external-link.svg)}.avoindata-expander{background:#f6f9fc;border-radius:2px;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1);box-shadow:0 2px 4px 1px rgba(41,41,41,.1);border:1px solid #ecedee;margin:0}.avoindata-expander+.avoindata-expander{margin-top:-1px}.avoindata-expander.open{background:#fff}.avoindata-expander.open .avoindata-expander-content,.avoindata-expander.open .avoindata-expander-content.collapse{display:block}.avoindata-expander-header{cursor:pointer}.avoindata-expander-title{color:#2a6ebb;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:600;padding:20px 0 20px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block;max-width:90%}.avoindata-expander-content{display:none;padding:0 20px 15px 20px;color:#000;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px}.avoindata-expander-content.cke_widget_editable{display:block}.avoindata-expander-header .icon-wrapper{float:right;padding-right:20px;padding-top:24px}.avoindata-expander-header .icon-wrapper i{color:#2a6ebb}.avoindata-expander-group-toggler{text-decoration:none;color:#2a6ebb;cursor:pointer;margin-bottom:10px}.avoindata-note-header-image,.avoindata-note-icon{height:24px;width:24px;margin-left:20px;margin-top:auto}.avoindata-note{background:#f7f7f8;border-radius:0;margin-top:20px;margin-bottom:20px}.avoindata-note-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:20px;font-weight:600;line-height:28px;padding:19px 0 13px 15px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-note-title>:last-child{margin:0}.avoindata-note-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 20px}.avoindata-expander-content p:last-of-type,.avoindata-hint-content p:last-of-type,.avoindata-note-content p:last-of-type{margin-bottom:0}.avoindata-hint{margin:20px 0}.avoindata-hint-icon,.avoindata-hint-image{display:inline-block;vertical-align:top;height:24px;width:24px;margin-left:20px}.avoindata-hint-content{width:calc(100% - 45px);display:inline-block;color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:18px;font-weight:400;line-height:27px;padding:0 20px 15px 15px}.avoindata-example{background:#fff;border-radius:2px;border:1.5px solid #2a6ebb;border-left:4.5px solid #2a6ebb;margin-top:20px;margin-bottom:20px}.avoindata-example-title{color:#292929;font-family:"Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:600;line-height:24px;padding:20px 20px 6px 20px;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;display:inline-block}.avoindata-example-title>:last-child{margin:0}.avoindata-example-content{color:#292929;font-family:"Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:0 20px 20px 20px}.avoindata-section{background-color:#fff;-webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.2);box-shadow:0 2px 4px 1px rgba(41,41,41,.2);border-top:4px solid #2a6ebb;border-radius:4px 4px 0 0;margin:45px 0;padding:30px 30px}.avoindata-section:first-of-type{margin-top:0}.avoindata-section .avoindata-section-title,.avoindata-section .avoindata-section-title{margin-top:0;margin-bottom:20px;font-size:22px}.avoindata-section .avoindata-section-title p,.avoindata-section .avoindata-section-title p{line-height:34px;font-weight:600}table{border-collapse:collapse;text-align:left}table caption{color:#222;font-weight:600;text-align:left;padding:20px 0}table td,table th{padding:7px 15px;border:1px solid #c8cdd0}table th{background-color:#f7f7f8;color:#222;font-weight:600}table td{color:#292929} -/*# sourceMappingURL=maps/style.css.map */ diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css b/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css new file mode 100644 index 0000000000..63cf020eba --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css @@ -0,0 +1,412 @@ +.external-link { + display: inline-flex; + flex-direction: row; + align-items: center +} +.external-link::after { + content: ''; + width: 24px; + height: 24px; + transform: scale(.6); + background-image: url(../images/icon-external-link.svg) +} +.avoindata-expander { + background: #f6f9fc; + border-radius: 2px; + box-shadow: 0 2px 4px 1px rgba(41,41,41,.1); + border: 1px solid #ecedee; + margin: 0 +} +.avoindata-expander + .avoindata-expander { + margin-top: -1px +} +.avoindata-expander.open { + background: #fff +} +.avoindata-expander.open .avoindata-expander-content, +.avoindata-expander.open .avoindata-expander-content.collapse { + display: block +} +.avoindata-expander-header { + cursor: pointer +} +.avoindata-expander-title { + color: #2a6ebb; + font-family: "Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif; + font-size: 18px; + font-weight: 600; + padding: 20px 0 20px 20px; + display: inline-block; + width: calc(100% - 45px) +} +.avoindata-expander-content { + display: none; + padding: 0 20px 15px 20px; + color: #000; + font-family: "Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif; + font-size: 18px; + font-weight: 400; + line-height: 27px +} +.avoindata-expander-content.cke_widget_editable { + display: block +} +.avoindata-expander-header .icon-wrapper { + float: right; + padding-right: 20px; + padding-top: 24px +} +.avoindata-expander-header .icon-wrapper i { + color: #2a6ebb +} +.avoindata-expander-group-toggler { + text-decoration: none; + color: #2a6ebb; + cursor: pointer; + margin-bottom: 10px +} +.avoindata-note-header-image, +.avoindata-note-icon { + height: 24px; + width: 24px; + margin-left: 20px; + margin-top: auto +} +.avoindata-note { + background: #f7f7f8; + border-radius: 0; + margin-top: 20px; + margin-bottom: 20px +} +.avoindata-note-title { + color: #292929; + font-family: "Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif; + font-size: 20px; + font-weight: 600; + line-height: 28px; + padding: 19px 0 13px 15px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 0; + margin-inline-end: 0; + display: inline-block; + width: calc(100% - 70px) +} +.avoindata-note-title > :last-child { + margin: 0 +} +.avoindata-note-content { + color: #292929; + font-family: "Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif; + font-size: 18px; + font-weight: 400; + line-height: 27px; + padding: 0 20px 15px 20px +} +.avoindata-expander-content p:last-of-type, +.avoindata-hint-content p:last-of-type, +.avoindata-note-content p:last-of-type { + margin-bottom: 0 +} +.avoindata-hint { + margin: 20px 0 +} +.avoindata-hint-icon, +.avoindata-hint-image { + display: inline-block; + vertical-align: top; + height: 24px; + width: 24px; + margin-left: 20px +} +.avoindata-hint-content { + width: calc(100% - 45px); + display: inline-block; + color: #292929; + font-family: "Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif; + font-size: 18px; + font-weight: 400; + line-height: 27px; + padding: 0 20px 15px 15px +} +.avoindata-example { + background: #fff; + border-radius: 2px; + border: 1.5px solid #2a6ebb; + border-left: 4.5px solid #2a6ebb; + margin-top: 20px; + margin-bottom: 20px +} +.avoindata-example-title { + color: #292929; + font-family: "Source Sans Pro SemiBold","Helvetica Neue",Arial,sans-serif; + font-size: 16px; + font-weight: 600; + line-height: 24px; + padding: 20px 20px 6px 20px; + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 0; + margin-inline-end: 0; + display: block +} +.avoindata-example-title > :last-child { + margin: 0 +} +.avoindata-example-content { + color: #292929; + font-family: "Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 24px; + padding: 0 20px 20px 20px +} +.avoindata-section { + background-color: #fff; + box-shadow: 0 2px 4px 1px rgba(41,41,41,.2); + border-top: 4px solid #2a6ebb; + border-radius: 4px 4px 0 0; + margin: 45px 0; + padding: 30px 30px +} +.avoindata-section:first-of-type { + margin-top: 0 +} +.avoindata-section .avoindata-section-title, +.avoindata-section .avoindata-section__title { + margin-top: 0; + margin-bottom: 20px; + font-size: 22px +} +.avoindata-section .avoindata-section-title p, +.avoindata-section .avoindata-section__title p { + line-height: 34px; + font-weight: 600 +} +table { + border-collapse: collapse; + text-align: left +} +table caption { + color: #222; + font-weight: 600; + text-align: left; + padding: 20px 0 +} +table td, +table th { + padding: 7px 15px; + border: 1px solid #c8cdd0 +} +table th { + background-color: #f7f7f8; + color: #222; + font-weight: 600 +} +table td { + color: #292929 +} +a.external svg { + margin-bottom: -2px; + margin-left: 4px; + width: 16px; + height: 16px; + fill: #2a6ebb +} +.ck-editor__editable_inline { + height: 300px; + overflow-y: auto +} +.ck-content .external-link { + display: inline-flex; + flex-direction: row; + align-content: center +} +.ck-content .external-link::after { + content: ""; + width: 24px; + height: 24px; + transform: scale(.6); + margin-left: 2px; + background-image: url(../icons/icon-external-link.svg) +} +.ck-content .avoindata-expander { + background: #f6f9fc; + border-radius: 2px; + -webkit-box-shadow: 0 2px 4px 1px rgba(41,41,41,.1); + box-shadow: 0 2px 4px 1px rgba(41,41,41,.1); + border: 1px solid #ecedee; + margin: 0 +} +.ck-content .avoindata-expander .avoindata-expander-title { + font-size: 18px; + font-weight: 600; + line-height: 27px; + padding: 0 20px 5px 20px; + color: #2a6ebb; + display: block +} +.ck-content .avoindata-expander .avoindata-expander-content { + padding: 0 20px 15px 20px +} +.ck-content .avoindata-expander.ck-widget .avoindata-expander-content { + display: block +} +.ck-content .avoindata-expander + .avoindata-expander { + margin-top: -1px +} +.ck-content .avoindata-note { + background: #f7f7f8; + border-radius: 0; + margin-top: 20px; + margin-bottom: 20px +} +.ck-content .avoindata-note-icon { + vertical-align: text-bottom; + height: 24px; + width: 24px; + display: inline-flex; + margin: 20px 10px 0 20px +} +.ck-content .avoindata-note-title { + display: inline-flex; + font-size: 20px; + font-weight: 600; + line-height: 28px; + padding: 10px 0; + width: calc(100% - 70px) +} +.ck-content .avoindata-note-title > :last-child { + margin: 0 +} +.ck-content .avoindata-note-content { + font-size: 18px; + font-weight: 400; + line-height: 27px; + padding: 0 20px 15px 20px +} +.ck-content .avoindata-expander-content p:last-of-type, +.ck-content .avoindata-hint-content p:last-of-type, +.ck-content .avoindata-note-content p:last-of-type { + margin-bottom: 0 +} +.ck-content .avoindata-hint { + margin: 20px 0; + display: flex +} +.ck-content .avoindata-hint-icon { + height: 24px; + width: 24px; + margin: 20px 10px 0 20px +} +.ck-content .avoindata-hint-content { + flex-grow: 2; + font-size: 18px; + font-weight: 400; + line-height: 27px; + padding: 0 20px 15px 15px +} +.ck-content .avoindata-example { + background: #fff; + border-radius: 2px; + border: 1.5px solid #2a6ebb; + border-left: 4.5px solid #2a6ebb; + margin-top: 20px; + margin-bottom: 20px; + display: block +} +.ck-content .avoindata-example-title { + font-size: 16px; + font-weight: 600; + line-height: 24px; + padding: 20px 20px 6px 20px; + display: block +} +.ck-content .avoindata-example-title > :last-child { + margin: 0 +} +.ck-content .avoindata-example-content { + font-size: 16px; + font-weight: 400; + line-height: 24px; + padding: 0 20px 20px 20px; + display: block +} +.ck-content .avoindata-section { + background-color: #fff; + box-shadow: 0 2px 4px 1px rgba(41,41,41,.2); + border-top: 4px solid #2a6ebb; + border-radius: 4px 4px 0 0; + margin: 45px 0; + padding: 30px 30px; + display: block +} +.ck-content .avoindata-section:first-of-type { + margin-top: 0 +} +.ck-content .avoindata-section .avoindata-section-title { + margin-top: 0; + margin-bottom: 20px; + display: block +} +.ck-content .avoindata-section .avoindata-section-title > p { + margin: 0; + font-size: 22px; + line-height: 34px; + font-weight: 600 +} +.ck-content .avoindata-section .avoindata-section-content > p { + margin: 0; + font-size: 18px; + line-height: 27px; + font-weight: 400 +} +.avoindata-section-id-form { + padding: 8px +} +.avoindata-section-id-form .title { + padding: 6px; + padding-bottom: 12px; + font-size: 16px; + font-weight: 600 +} +.avoindata-section-id-form .ck-labeled-field-view { + padding: 6px +} +.avoindata-section-id-form .ck.ck-button.btn { + text-align: center; + vertical-align: middle; + cursor: pointer; + user-select: none; + padding: 10px 20px; + display: inline-flex; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 2px; + line-height: 1; + height: 40px; + width: fit-content; + font-weight: 700; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; + margin: 12px 6px +} +.avoindata-section-id-form .ck.ck-button.btn.btn-primary { + background: linear-gradient(0deg,#225a99 0,#2a6dbb 100%); + color: #fff; + border-color: #206b82; + box-shadow: inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075) +} +.avoindata-section-id-form .ck.ck-button.btn.btn-primary:hover { + background: linear-gradient(0deg,#2a6dbb 0,#2e77cb 100%) +} +.avoindata-section-id-form .ck.ck-button.btn.btn-secondary { + color: #2a6dbb; + border: 1px solid #2a6dbb; + background: 0 0; + box-shadow: none; + letter-spacing: .4px +} +.avoindata-section-id-form .ck.ck-button.btn.btn-secondary:hover { + background: linear-gradient(to top,#fff 0,gray 300%) +} \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css b/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css index f0461929ce..2aa8af0e8f 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/toolbar-icons.css @@ -1,19 +1,19 @@ .ckeditor5-toolbar-button-avoindataExpander { - background-image: url(../icons/icon-expander.svg?source); + background-image: url(../icons/icon-expander.svg?source); } .ckeditor5-toolbar-button-avoindataNote { - background-image: url(../icons/icon-note.svg?source); + background-image: url(../icons/icon-note.svg?source); } .ckeditor5-toolbar-button-avoindataHint { - background-image: url(../icons/icon-hint.svg?source); + background-image: url(../icons/icon-hint.svg?source); } .ckeditor5-toolbar-button-avoindataExample { - background-image: url(../icons/icon-example.svg?source); + background-image: url(../icons/icon-example.svg?source); } .ckeditor5-toolbar-button-avoindataSection { - background-image: url(../icons/icon-section.svg?source); + background-image: url(../icons/icon-section.svg?source); } diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js index 4029057341..33246060bc 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExample.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExample=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,a),i.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";a.d(n,{default:()=>s});var e=a("ckeditor5/src/core.js"),t=a("ckeditor5/src/widget.js");class o extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const a=function(e){const t=e.createElement("avoindataExample"),a=e.createElement("avoindataExampleTitle"),n=e.createElement("avoindataExampleContent");e.append(a,t),e.append(n,t);const o=e.createElement("paragraph");e.insertText("Title",o,0),e.append(o,a);const i=e.createElement("paragraph");return e.insertText("Content",i,0),e.append(i,n),t}(t);e.insertContent(a)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,a=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataExample");this.isEnabled=null!==a}}class i extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataExampleCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataExample",{isObject:!0,allowWhere:"$block"}),e.register("avoindataExampleTitle",{isLimit:!0,allowIn:"avoindataExample",allowContentOf:"$root"}),e.register("avoindataExampleContent",{isLimit:!0,allowIn:"avoindataExample",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataExampleContent")||e.endsWith("avoindataExampleTitle"))&&"avoindataExample"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataExample",view:{name:"div",classes:"avoindata-example"}}),e.for("upcast").elementToElement({model:"avoindataExampleTitle",view:{name:"div",classes:"avoindata-example-title"}}),e.for("upcast").elementToElement({model:"avoindataExampleContent",view:{name:"div",classes:"avoindata-example-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataExample",view:{name:"div",classes:"avoindata-example"}}),e.for("dataDowncast").elementToElement({model:"avoindataExampleTitle",view:{name:"div",classes:"avoindata-example-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataExampleContent",view:{name:"div",classes:"avoindata-example-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataExample",view:(e,{writer:a})=>{const n=a.createContainerElement("div",{class:"avoindata-example"});return(0,t.toWidget)(n,a,{label:"Avoindata Example"})}}),e.for("editingDowncast").elementToElement({model:"avoindataExampleTitle",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-example-title"});return(0,t.toWidgetEditable)(n,a)}}),e.for("editingDowncast").elementToElement({model:"avoindataExampleContent",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-example-content"});return(0,t.toWidgetEditable)(n,a)}})}}var l=a("ckeditor5/src/ui.js");class d extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataExample",(t=>{const a=e.commands.get("insertAvoindataExampleCommand"),n=new l.ButtonView(t);return n.set({label:e.t("Avoindata Example"),icon:'\n \n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataExampleCommand"))),n}))}}class r extends e.Plugin{static get requires(){return[i,d]}}const s={AvoindataExample:r}})(),n=n.default})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExample=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,a),i.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var o=n.length-1;o>-1&&!e;)e=n[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})();var n={};return(()=>{"use strict";a.d(n,{default:()=>s});var e=a("ckeditor5/src/core.js"),t=a("ckeditor5/src/widget.js");class o extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const a=function(e){const t=e.createElement("avoindataExample"),a=e.createElement("avoindataExampleTitle"),n=e.createElement("avoindataExampleContent");e.append(a,t),e.append(n,t);const o=e.createElement("paragraph");e.insertText("Title",o,0),e.append(o,a);const i=e.createElement("paragraph");return e.insertText("Content",i,0),e.append(i,n),t}(t);e.insertContent(a)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,a=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataExample");this.isEnabled=null!==a}}class i extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataExampleCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataExample",{isObject:!0,allowWhere:"$block"}),e.register("avoindataExampleTitle",{isLimit:!0,allowIn:"avoindataExample",allowContentOf:"$root"}),e.register("avoindataExampleContent",{isLimit:!0,allowIn:"avoindataExample",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataExampleContent")||e.endsWith("avoindataExampleTitle"))&&"avoindataExample"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataExample",view:{name:"div",classes:"avoindata-example"}}),e.for("upcast").elementToElement({model:"avoindataExampleTitle",view:{name:"div",classes:"avoindata-example-title"}}),e.for("upcast").elementToElement({model:"avoindataExampleContent",view:{name:"div",classes:"avoindata-example-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataExample",view:{name:"div",classes:"avoindata-example"}}),e.for("dataDowncast").elementToElement({model:"avoindataExampleTitle",view:{name:"div",classes:"avoindata-example-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataExampleContent",view:{name:"div",classes:"avoindata-example-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataExample",view:(e,{writer:a})=>{const n=a.createContainerElement("div",{class:"avoindata-example"});return(0,t.toWidget)(n,a,{label:"Avoindata Example"})}}),e.for("editingDowncast").elementToElement({model:"avoindataExampleTitle",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-example-title"});return(0,t.toWidgetEditable)(n,a)}}),e.for("editingDowncast").elementToElement({model:"avoindataExampleContent",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-example-content"});return(0,t.toWidgetEditable)(n,a)}})}}var r=a("ckeditor5/src/ui.js");class l extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataExample",(t=>{const a=e.commands.get("insertAvoindataExampleCommand"),n=new r.ButtonView(t);return n.set({label:e.t("Avoindata Example"),icon:'\n \n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataExampleCommand"))),n}))}}a.p;class d extends e.Plugin{static get requires(){return[i,l]}}const s={AvoindataExample:d}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js index 05768e133e..34d80db2ad 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExpander.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,a),r.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";a.d(n,{default:()=>l});var e=a("ckeditor5/src/core.js"),t=a("ckeditor5/src/widget.js");class o extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const a=function(e){const t=e.createElement("avoindataExpander"),a=e.createElement("avoindataExpanderTitle"),n=e.createElement("avoindataExpanderContent");e.append(a,t),e.append(n,t);const o=e.createElement("paragraph");e.insertText("Title",o,0),e.append(o,a);const r=e.createElement("paragraph");return e.insertText("Content",r,0),e.append(r,n),t}(t);e.insertContent(a)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,a=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataExpander");this.isEnabled=null!==a}}class r extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataExpanderCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataExpander",{isObject:!0,allowWhere:"$block"}),e.register("avoindataExpanderTitle",{isLimit:!0,allowIn:"avoindataExpander",allowContentOf:"$root"}),e.register("avoindataExpanderContent",{isLimit:!0,allowIn:"avoindataExpander",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataExpanderContent")||e.endsWith("avoindataExpanderTitle"))&&"avoindataExpander"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataExpander",view:{name:"div",classes:"avoindata-expander"}}),e.for("upcast").elementToElement({model:"avoindataExpanderTitle",view:{name:"div",classes:"avoindata-expander-title"}}),e.for("upcast").elementToElement({model:"avoindataExpanderContent",view:{name:"div",classes:"avoindata-expander-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataExpander",view:{name:"div",classes:"avoindata-expander"}}),e.for("dataDowncast").elementToStructure({model:"avoindataExpanderTitle",view:(e,{writer:t})=>t.createContainerElement("div",{class:"avoindata-expander-header"},[t.createContainerElement("div",{class:"avoindata-expander-title"},[t.createSlot()]),t.createContainerElement("span",{class:"icon-wrapper pull-right"},[t.createEmptyElement("i",{class:"fas fa-angle-down"})])])}),e.for("dataDowncast").elementToElement({model:"avoindataExpanderContent",view:{name:"div",classes:"avoindata-expander-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataExpander",view:(e,{writer:a})=>{const n=a.createContainerElement("div",{class:"avoindata-expander"});return(0,t.toWidget)(n,a,{label:"Avoindata Expander"})}}),e.for("editingDowncast").elementToElement({model:"avoindataExpanderTitle",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-expander-title"});return(0,t.toWidgetEditable)(n,a)}}),e.for("editingDowncast").elementToElement({model:"avoindataExpanderContent",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-expander-content"});return(0,t.toWidgetEditable)(n,a)}})}}var d=a("ckeditor5/src/ui.js");class i extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataExpander",(t=>{const a=e.commands.get("insertAvoindataExpanderCommand"),n=new d.ButtonView(t);return n.set({label:e.t("Avoindata Expander"),icon:'\n\t\n\t\t\n\t\t\n\t\n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataExpanderCommand"))),n}))}}class s extends e.Plugin{static get requires(){return[r,i]}}const l={AvoindataExpander:s}})(),n=n.default})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExpander=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,a)=>{e.exports=a("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,a),o.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var r=n.length-1;r>-1&&!e;)e=n[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})();var n={};return(()=>{"use strict";a.d(n,{default:()=>l});var e=a("ckeditor5/src/core.js"),t=a("ckeditor5/src/widget.js");class r extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const a=function(e){const t=e.createElement("avoindataExpander"),a=e.createElement("avoindataExpanderTitle"),n=e.createElement("avoindataExpanderContent");e.append(a,t),e.append(n,t);const r=e.createElement("paragraph");e.insertText("Title",r,0),e.append(r,a);const o=e.createElement("paragraph");return e.insertText("Content",o,0),e.append(o,n),t}(t);e.insertContent(a)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,a=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataExpander");this.isEnabled=null!==a}}class o extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataExpanderCommand",new r(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataExpander",{isObject:!0,allowWhere:"$block"}),e.register("avoindataExpanderTitle",{isLimit:!0,allowIn:"avoindataExpander",allowContentOf:"$root"}),e.register("avoindataExpanderContent",{isLimit:!0,allowIn:"avoindataExpander",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataExpanderContent")||e.endsWith("avoindataExpanderTitle"))&&"avoindataExpander"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataExpander",view:{name:"div",classes:"avoindata-expander"}}),e.for("upcast").elementToElement({model:"avoindataExpanderTitle",view:{name:"div",classes:"avoindata-expander-title"}}),e.for("upcast").elementToElement({model:"avoindataExpanderContent",view:{name:"div",classes:"avoindata-expander-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataExpander",view:{name:"div",classes:"avoindata-expander"}}),e.for("dataDowncast").elementToStructure({model:"avoindataExpanderTitle",view:(e,{writer:t})=>t.createContainerElement("div",{class:"avoindata-expander-header"},[t.createContainerElement("div",{class:"avoindata-expander-title"},[t.createSlot()]),t.createContainerElement("span",{class:"icon-wrapper pull-right"},[t.createEmptyElement("i",{class:"fas fa-angle-down"})])])}),e.for("dataDowncast").elementToElement({model:"avoindataExpanderContent",view:{name:"div",classes:"avoindata-expander-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataExpander",view:(e,{writer:a})=>{const n=a.createContainerElement("div",{class:"avoindata-expander"});return(0,t.toWidget)(n,a,{label:"Avoindata Expander"})}}),e.for("editingDowncast").elementToElement({model:"avoindataExpanderTitle",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-expander-title"});return(0,t.toWidgetEditable)(n,a)}}),e.for("editingDowncast").elementToElement({model:"avoindataExpanderContent",view:(e,{writer:a})=>{const n=a.createEditableElement("div",{class:"avoindata-expander-content"});return(0,t.toWidgetEditable)(n,a)}})}}var i=a("ckeditor5/src/ui.js");class d extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataExpander",(t=>{const a=e.commands.get("insertAvoindataExpanderCommand"),n=new i.ButtonView(t);return n.set({label:e.t("Avoindata Expander"),icon:'\n\t\n\t\t\n\t\t\n\t\n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(a,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataExpanderCommand"))),n}))}}a.p;class s extends e.Plugin{static get requires(){return[o,d]}}const l={AvoindataExpander:s}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExternalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExternalLink.js new file mode 100644 index 0000000000..0ece72ffc3 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataExternalLink.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataExternalLink=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,r)=>{e.exports=r("dll-reference CKEditor5.dll")("./src/core.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;r.g.importScripts&&(e=r.g.location+"");var t=r.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var o=t.getElementsByTagName("script");if(o.length)for(var n=o.length-1;n>-1&&!e;)e=o[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})();var o={};return(()=>{"use strict";r.d(o,{default:()=>n});var e=r("ckeditor5/src/core.js");r.p;class t extends e.Plugin{init(){const{conversion:e}=this.editor;e.for("upcast").elementToAttribute({model:"linkIsExternal",view:{name:"a",classes:["external"],attributes:["aria-label","target"]}}),e.for("upcast").add((e=>{e.on("element:svg",((e,t,r)=>{const{consumable:o}=r,{viewItem:n}=t,i={name:"svg",attributes:["viewBox"]},s={name:"use",attributes:["href"]};if(!o.test(n,i))return;if(1!==n.childCount)return;const a=n.getChild(0);a.is("element","use")&&o.test(a,s)&&a?.getAttribute("href")?.includes("avoindata_external-link")&&(o.consume(n,i),o.consume(a,s))}))}))}static get pluginName(){return"AvoindataExternalLink"}}const n={AvoindataExternalLink:t}})(),o=o.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js index 24903a02b8..39534fdb7e 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataHint.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var t={"ckeditor5/src/core.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":t=>{"use strict";t.exports=CKEditor5.dll}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var a=e[i]={exports:{}};return t[i](a,a.exports,n),a.exports}n.d=(t,e)=>{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var i=e.getElementsByTagName("script");if(i.length)for(var o=i.length-1;o>-1&&!t;)t=i[o--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})();var i={};return(()=>{"use strict";n.d(i,{default:()=>l});var t=n("ckeditor5/src/core.js"),e=n("ckeditor5/src/widget.js");class o extends t.Command{execute(){const{model:t}=this.editor;t.change((e=>{const n=function(t){const e=t.createElement("avoindataHint"),n=t.createElement("avoindataHintIcon"),i=t.createElement("avoindataHintContent");t.append(n,e),t.append(i,e);const o=t.createElement("paragraph");return t.insertText("Content",o,0),t.append(o,i),e}(e);t.insertContent(n)}))}refresh(){const{model:t}=this.editor,{selection:e}=t.document,n=t.schema.findAllowedParent(e.getFirstPosition(),"avoindataHint");this.isEnabled=null!==n}}const a=n.p+"../icons/icon-hint.svg";class r extends t.Plugin{static get requires(){return[e.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataHintCommand",new o(this.editor))}_defineSchema(){const t=this.editor.model.schema;t.register("avoindataHint",{isObject:!0,allowWhere:"$block"}),t.register("avoindataHintIcon",{isObject:!0,isContent:!0,isInline:!0,isBlock:!1,isSelectable:!1,isLimit:!1,allowIn:"avoindataHint",allowAttributes:["src","alt","class"]}),t.register("avoindataHintContent",{isLimit:!0,allowIn:"avoindataHint",allowContentOf:"$root"}),t.addChildCheck(((t,e)=>{if(t.endsWith("avoindataHintContent")&&"avoindataHint"===e.name)return!1}))}_defineConverters(){const{conversion:t}=this.editor;t.for("upcast").elementToElement({model:"avoindataHint",view:{name:"div",classes:"avoindata-hint"}}),t.for("upcast").elementToElement({model:"avoindataHintIcon",view:{name:"img",classes:"avoindata-hint-icon"}}),t.for("upcast").elementToElement({model:"avoindataHintContent",view:{name:"div",classes:"avoindata-hint-content"}}),t.for("dataDowncast").elementToElement({model:"avoindataHint",view:{name:"div",classes:"avoindata-hint"}}),t.for("downcast").elementToElement({model:"avoindataHintIcon",view:(t,{writer:e})=>e.createEmptyElement("img",{class:"avoindata-hint-icon",src:a})}),t.for("dataDowncast").elementToElement({model:"avoindataHintContent",view:{name:"div",classes:"avoindata-hint-content"}}),t.for("editingDowncast").elementToElement({model:"avoindataHint",view:(t,{writer:n})=>{const i=n.createContainerElement("div",{class:"avoindata-hint"});return(0,e.toWidget)(i,n,{label:"Avoindata Hint"})}}),t.for("editingDowncast").elementToElement({model:"avoindataHintContent",view:(t,{writer:n})=>{const i=n.createEditableElement("div",{class:"avoindata-hint-content"});return(0,e.toWidgetEditable)(i,n)}}),t.for("upcast").elementToElement({model:"avoindataHintIcon",view:{name:"img",classes:"avoindata-hint-image"}})}}var s=n("ckeditor5/src/ui.js");class d extends t.Plugin{init(){const t=this.editor;t.ui.componentFactory.add("avoindataHint",(e=>{const n=t.commands.get("insertAvoindataHintCommand"),i=new s.ButtonView(e);return i.set({label:t.t("Avoindata Hint"),icon:'\n \n \n \n\n',tooltip:!0}),i.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(i,"execute",(()=>t.execute("insertAvoindataHintCommand"))),i}))}}class c extends t.Plugin{static get requires(){return[r,d]}}const l={AvoindataHint:c}})(),i=i.default})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CKEditor5=e():(t.CKEditor5=t.CKEditor5||{},t.CKEditor5.avoindataHint=e())}(self,(()=>(()=>{var t={"ckeditor5/src/core.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(t,e,n)=>{t.exports=n("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":t=>{"use strict";t.exports=CKEditor5.dll}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var a=e[i]={exports:{}};return t[i](a,a.exports,n),a.exports}n.d=(t,e)=>{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;n.g.importScripts&&(t=n.g.location+"");var e=n.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var i=e.getElementsByTagName("script");if(i.length)for(var o=i.length-1;o>-1&&!t;)t=i[o--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=t})();var i={};return(()=>{"use strict";n.d(i,{default:()=>l});var t=n("ckeditor5/src/core.js"),e=n("ckeditor5/src/widget.js");class o extends t.Command{execute(){const{model:t}=this.editor;t.change((e=>{const n=function(t){const e=t.createElement("avoindataHint"),n=t.createElement("avoindataHintIcon"),i=t.createElement("avoindataHintContent");t.append(n,e),t.append(i,e);const o=t.createElement("paragraph");return t.insertText("Content",o,0),t.append(o,i),e}(e);t.insertContent(n)}))}refresh(){const{model:t}=this.editor,{selection:e}=t.document,n=t.schema.findAllowedParent(e.getFirstPosition(),"avoindataHint");this.isEnabled=null!==n}}const a=n.p+"../icons/icon-hint.svg";class r extends t.Plugin{static get requires(){return[e.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataHintCommand",new o(this.editor))}_defineSchema(){const t=this.editor.model.schema;t.register("avoindataHint",{isObject:!0,allowWhere:"$block"}),t.register("avoindataHintIcon",{isObject:!0,isContent:!0,isInline:!0,isBlock:!1,isSelectable:!1,isLimit:!1,allowIn:"avoindataHint",allowAttributes:["src","alt","class"]}),t.register("avoindataHintContent",{isLimit:!0,allowIn:"avoindataHint",allowContentOf:"$root"}),t.addChildCheck(((t,e)=>{if(t.endsWith("avoindataHintContent")&&"avoindataHint"===e.name)return!1}))}_defineConverters(){const{conversion:t}=this.editor;t.for("upcast").elementToElement({model:"avoindataHint",view:{name:"div",classes:"avoindata-hint"}}),t.for("upcast").elementToElement({model:"avoindataHintIcon",view:{name:"img",classes:"avoindata-hint-icon"}}),t.for("upcast").elementToElement({model:"avoindataHintContent",view:{name:"div",classes:"avoindata-hint-content"}}),t.for("dataDowncast").elementToElement({model:"avoindataHint",view:{name:"div",classes:"avoindata-hint"}}),t.for("downcast").elementToElement({model:"avoindataHintIcon",view:(t,{writer:e})=>e.createEmptyElement("img",{class:"avoindata-hint-icon",src:a})}),t.for("dataDowncast").elementToElement({model:"avoindataHintContent",view:{name:"div",classes:"avoindata-hint-content"}}),t.for("editingDowncast").elementToElement({model:"avoindataHint",view:(t,{writer:n})=>{const i=n.createContainerElement("div",{class:"avoindata-hint"});return(0,e.toWidget)(i,n,{label:"Avoindata Hint"})}}),t.for("editingDowncast").elementToElement({model:"avoindataHintContent",view:(t,{writer:n})=>{const i=n.createEditableElement("div",{class:"avoindata-hint-content"});return(0,e.toWidgetEditable)(i,n)}}),t.for("upcast").elementToElement({model:"avoindataHintIcon",view:{name:"img",classes:"avoindata-hint-image"}})}}var s=n("ckeditor5/src/ui.js");class d extends t.Plugin{init(){const t=this.editor;t.ui.componentFactory.add("avoindataHint",(e=>{const n=t.commands.get("insertAvoindataHintCommand"),i=new s.ButtonView(e);return i.set({label:t.t("Avoindata Hint"),icon:'\n \n \n \n\n',tooltip:!0}),i.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(i,"execute",(()=>t.execute("insertAvoindataHintCommand"))),i}))}}n.p;class c extends t.Plugin{static get requires(){return[r,d]}}const l={AvoindataHint:c}})(),i=i.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js index 2e54a2dcf6..4817d67591 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataNote.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function o(n){var a=t[n];if(void 0!==a)return a.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,o),i.exports}o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var a=n.length-1;a>-1&&!e;)e=n[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var n={};return(()=>{"use strict";o.d(n,{default:()=>c});var e=o("ckeditor5/src/core.js"),t=o("ckeditor5/src/widget.js");class a extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const o=function(e){const t=e.createElement("avoindataNote"),o=e.createElement("avoindataNoteIcon"),n=e.createElement("avoindataNoteTitle"),a=e.createElement("avoindataNoteContent");e.append(o,t),e.append(n,t),e.append(a,t);const i=e.createElement("paragraph");e.insertText("Title",i,0),e.append(i,n);const r=e.createElement("paragraph");return e.insertText("Content",r,0),e.append(r,a),t}(t);e.insertContent(o)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,o=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataNote");this.isEnabled=null!==o}}const i=o.p+"../icons/icon-note.svg";class r extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataNoteCommand",new a(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataNote",{isObject:!0,allowWhere:"$block"}),e.register("avoindataNoteIcon",{isObject:!0,isContent:!0,isInline:!0,isBlock:!1,isSelectable:!1,isLimit:!1,allowIn:"avoindataNote",allowAttributes:["src","alt","class"]}),e.register("avoindataNoteTitle",{isLimit:!0,allowIn:"avoindataNote",allowContentOf:"$root"}),e.register("avoindataNoteContent",{isLimit:!0,allowIn:"avoindataNote",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataNoteContent")||e.endsWith("avoindataNoteTitle"))&&"avoindataNote"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataNote",view:{name:"div",classes:"avoindata-note"}}),e.for("upcast").elementToElement({model:"avoindataNoteIcon",view:{name:"img",classes:"avoindata-note-icon"}}),e.for("upcast").elementToElement({model:"avoindataNoteTitle",view:{name:"div",classes:"avoindata-note-title"}}),e.for("upcast").elementToElement({model:"avoindataNoteContent",view:{name:"div",classes:"avoindata-note-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataNote",view:{name:"div",classes:"avoindata-note"}}),e.for("dataDowncast").elementToElement({model:"avoindataNoteIcon",view:(e,{writer:t})=>t.createUIElement("img",{class:"avoindata-note-icon",src:i,alt:"Avoindata Note icon"})}),e.for("dataDowncast").elementToElement({model:"avoindataNoteTitle",view:{name:"div",classes:"avoindata-note-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataNoteContent",view:{name:"div",classes:"avoindata-note-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataNote",view:(e,{writer:o})=>{const n=o.createContainerElement("div",{class:"avoindata-note"});return(0,t.toWidget)(n,o,{label:"Avoindata Note"})}}),e.for("editingDowncast").elementToStructure({model:"avoindataNoteIcon",view:(e,{writer:t})=>t.createUIElement("img",{class:"avoindata-note-icon",src:i,alt:"Avoindata Note icon"})}),e.for("editingDowncast").elementToElement({model:"avoindataNoteTitle",view:(e,{writer:o})=>{const n=o.createEditableElement("div",{class:"avoindata-note-title"});return(0,t.toWidgetEditable)(n,o)}}),e.for("editingDowncast").elementToElement({model:"avoindataNoteContent",view:(e,{writer:o})=>{const n=o.createEditableElement("div",{class:"avoindata-note-content"});return(0,t.toWidgetEditable)(n,o)}}),e.for("upcast").elementToElement({model:"avoindataNoteIcon",view:{name:"img",classes:"avoindata-note-header-image"}})}}var s=o("ckeditor5/src/ui.js");class d extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataNote",(t=>{const o=e.commands.get("insertAvoindataNoteCommand"),n=new s.ButtonView(t);return n.set({label:e.t("Avoindata Note"),icon:'\n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataNoteCommand"))),n}))}}class l extends e.Plugin{static get requires(){return[r,d]}}const c={AvoindataNote:l}})(),n=n.default})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataNote=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,o)=>{e.exports=o("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function o(n){var a=t[n];if(void 0!==a)return a.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,o),i.exports}o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var a=n.length-1;a>-1&&!e;)e=n[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})();var n={};return(()=>{"use strict";o.d(n,{default:()=>c});var e=o("ckeditor5/src/core.js"),t=o("ckeditor5/src/widget.js");class a extends e.Command{execute(){const{model:e}=this.editor;e.change((t=>{const o=function(e){const t=e.createElement("avoindataNote"),o=e.createElement("avoindataNoteIcon"),n=e.createElement("avoindataNoteTitle"),a=e.createElement("avoindataNoteContent");e.append(o,t),e.append(n,t),e.append(a,t);const i=e.createElement("paragraph");e.insertText("Title",i,0),e.append(i,n);const r=e.createElement("paragraph");return e.insertText("Content",r,0),e.append(r,a),t}(t);e.insertContent(o)}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,o=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataNote");this.isEnabled=null!==o}}const i=o.p+"../icons/icon-note.svg";class r extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataNoteCommand",new a(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataNote",{isObject:!0,allowWhere:"$block"}),e.register("avoindataNoteIcon",{isObject:!0,isContent:!0,isInline:!0,isBlock:!1,isSelectable:!1,isLimit:!1,allowIn:"avoindataNote",allowAttributes:["src","alt","class"]}),e.register("avoindataNoteTitle",{isLimit:!0,allowIn:"avoindataNote",allowContentOf:"$root"}),e.register("avoindataNoteContent",{isLimit:!0,allowIn:"avoindataNote",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataNoteContent")||e.endsWith("avoindataNoteTitle"))&&"avoindataNote"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:"avoindataNote",view:{name:"div",classes:"avoindata-note"}}),e.for("upcast").elementToElement({model:"avoindataNoteIcon",view:{name:"img",classes:"avoindata-note-icon"}}),e.for("upcast").elementToElement({model:"avoindataNoteTitle",view:{name:"div",classes:"avoindata-note-title"}}),e.for("upcast").elementToElement({model:"avoindataNoteContent",view:{name:"div",classes:"avoindata-note-content"}}),e.for("dataDowncast").elementToElement({model:"avoindataNote",view:{name:"div",classes:"avoindata-note"}}),e.for("dataDowncast").elementToElement({model:"avoindataNoteIcon",view:(e,{writer:t})=>t.createUIElement("img",{class:"avoindata-note-icon",src:i,alt:"Avoindata Note icon"})}),e.for("dataDowncast").elementToElement({model:"avoindataNoteTitle",view:{name:"div",classes:"avoindata-note-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataNoteContent",view:{name:"div",classes:"avoindata-note-content"}}),e.for("editingDowncast").elementToElement({model:"avoindataNote",view:(e,{writer:o})=>{const n=o.createContainerElement("div",{class:"avoindata-note"});return(0,t.toWidget)(n,o,{label:"Avoindata Note"})}}),e.for("editingDowncast").elementToStructure({model:"avoindataNoteIcon",view:(e,{writer:t})=>t.createUIElement("img",{class:"avoindata-note-icon",src:i,alt:"Avoindata Note icon"})}),e.for("editingDowncast").elementToElement({model:"avoindataNoteTitle",view:(e,{writer:o})=>{const n=o.createEditableElement("div",{class:"avoindata-note-title"});return(0,t.toWidgetEditable)(n,o)}}),e.for("editingDowncast").elementToElement({model:"avoindataNoteContent",view:(e,{writer:o})=>{const n=o.createEditableElement("div",{class:"avoindata-note-content"});return(0,t.toWidgetEditable)(n,o)}}),e.for("upcast").elementToElement({model:"avoindataNoteIcon",view:{name:"img",classes:"avoindata-note-header-image"}})}}var s=o("ckeditor5/src/ui.js");class d extends e.Plugin{init(){const e=this.editor;e.ui.componentFactory.add("avoindataNote",(t=>{const o=e.commands.get("insertAvoindataNoteCommand"),n=new s.ButtonView(t);return n.set({label:e.t("Avoindata Note"),icon:'\n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(n,"execute",(()=>e.execute("insertAvoindataNoteCommand"))),n}))}}o.p;class l extends e.Plugin{static get requires(){return[r,d]}}const c={AvoindataNote:l}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js index fbe056a10b..f8be29ee57 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/js/avoindataSection.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,i),a.exports}i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};return(()=>{"use strict";i.d(n,{default:()=>r});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js");class o extends e.Command{execute(e){const{model:t}=this.editor;t.change((i=>{const n=i.model.document.selection?.getSelectedElement();if(n&&"avoindataSection"==n.name)i.setAttribute("avoindataSectionId",e,n);else{const n=function(e,t){const i=e.createElement("avoindataSection",{avoindataSectionId:t}),n=e.createElement("avoindataSectionTitle"),o=e.createElement("avoindataSectionContent");e.append(n,i),e.append(o,i);const a=e.createElement("paragraph");e.insertText("Title",a,0),e.append(a,n);const s=e.createElement("paragraph");return e.insertText("Content",s,0),e.append(s,o),i}(i,e);t.insertContent(n);const o=i.createSelection(n.getChild(0),"in");i.setSelection(o)}}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,i=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataSection");this.isEnabled=null!==i}}class a extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataSectionCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataSection",{isObject:!0,allowWhere:"$block",allowAttributes:["avoindataSectionId"],allowContentOf:"$block"}),e.register("avoindataSectionTitle",{isLimit:!0,allowIn:"avoindataSection",allowContentOf:"$root"}),e.register("avoindataSectionContent",{isLimit:!0,allowIn:"avoindataSection",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataSectionContent")||e.endsWith("avoindataSectionTitle"))&&"avoindataSection"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:(e,{writer:t})=>t.createElement("avoindataSection",{avoindataSectionId:e.getAttribute("id")}),view:{name:"div",classes:"avoindata-section",attributes:["id"]}}),e.for("upcast").elementToElement({model:"avoindataSectionTitle",view:{name:"div",classes:"avoindata-section-title"}}),e.for("upcast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section-content"}}),e.for("dataDowncast").elementToElement({model:{name:"avoindataSection",attributes:["avoindataSectionId"]},view:(e,{writer:t})=>t.createContainerElement("div",{class:"avoindata-section",id:e.getAttribute("avoindataSectionId")})}),e.for("dataDowncast").elementToElement({model:"avoindataSectionTitle",view:{name:"div",classes:"avoindata-section-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section-content"}}),e.for("editingDowncast").elementToElement({model:{name:"avoindataSection",attributes:["avoindataSectionId"]},view:(e,{writer:i})=>{const n=i.createContainerElement("div",{class:"avoindata-section",id:e.getAttribute("avoindataSectionId")});return(0,t.toWidget)(n,i,{label:"Avoindata Section widget"})}}),e.for("editingDowncast").elementToElement({model:"avoindataSectionTitle",view:(e,{writer:i})=>{const n=i.createEditableElement("div",{class:"avoindata-section-title"});return(0,t.toWidgetEditable)(n,i)}}),e.for("editingDowncast").elementToElement({model:"avoindataSectionContent",view:(e,{writer:i})=>{const n=i.createEditableElement("div",{class:"avoindata-section-content"});return(0,t.toWidgetEditable)(n,i)}}),e.for("upcast").elementToElement({model:"avoindataSectionTitle",view:{name:"h3",classes:"avoindata-section__title"}}),e.for("upcast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section__content"}})}}var s=i("ckeditor5/src/ui.js");class d extends s.View{constructor(e){super(e),this.heading=new s.LabelView(this.locale),this.heading.setTemplate({tag:"div",attributes:{class:["title"]},children:["Avoindata section"]}),this.idInputView=this._createInput("Id"),this.saveButtonView=this._createButton("Save",null,"btn btn-primary"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton("Cancel",null,"btn btn-secondary"),this.cancelButtonView.delegate("execute").to(this,"cancel"),this.childViews=this.createCollection([this.heading,this.idInputView,this.saveButtonView,this.cancelButtonView]),this.setTemplate({tag:"form",attributes:{class:["ck","ck-reset_all-excluded","avoindata-section-id-form"],tabindex:"-1"},children:this.childViews})}render(){super.render(),(0,s.submitHandler)({view:this})}focus(){this.childViews.get(1).focus()}_createInput(e){const t=new s.LabeledFieldView(this.locale,s.createLabeledInputText);return t.label=e,t}_createButton(e,t,i){const n=new s.ButtonView;return n.set({label:e,icon:t,tooltip:!0,class:i,withText:!0}),n}}class l extends e.Plugin{static get requires(){return[s.ContextualBalloon]}init(){const e=this.editor;this._balloon=e.plugins.get(s.ContextualBalloon),this.formView=this._createFormView();const t=e.commands.get("insertAvoindataSectionCommand");e.ui.componentFactory.add("avoindataSection",(i=>{const n=new s.ButtonView(i);return n.set({label:e.t("Avoindata Section"),icon:'\n \n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(t,"value","isEnabled"),this.listenTo(n,"execute",(()=>{this._showUI()})),n}))}_createFormView(){const e=this.editor,t=new d(e.locale);return this.listenTo(t,"submit",(()=>{const i=t.idInputView.fieldView.element.value;e.model.change((t=>{e.execute("insertAvoindataSectionCommand",i)})),this._hideUI()})),this.listenTo(t,"cancel",(()=>{this._hideUI()})),(0,s.clickOutsideHandler)({emitter:t,activator:()=>this._balloon.visibleView===t,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()}),t}_showUI(){const e=this.editor.model.document.selection;this._balloon.add({view:this.formView,position:this._getBalloonPositionData()});const t=e.getSelectedElement()?.getAttribute("avoindataSectionId")||"";this.formView.idInputView.fieldView.value=t,this.formView.focus()}_hideUI(){this.formView.idInputView.fieldView.value="",this.formView.element.reset(),this._balloon.remove(this.formView),this.editor.editing.view.focus()}_getBalloonPositionData(){const e=this.editor.editing.view,t=e.document;let i=null;return i=()=>e.domConverter.viewRangeToDom(t.selection.getFirstRange()),{target:i}}}class c extends e.Plugin{static get requires(){return[a,l]}}const r={AvoindataSection:c}})(),n=n.default})())); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.CKEditor5=t():(e.CKEditor5=e.CKEditor5||{},e.CKEditor5.avoindataSection=t())}(self,(()=>(()=>{var e={"ckeditor5/src/core.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/core.js")},"ckeditor5/src/ui.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/ui.js")},"ckeditor5/src/widget.js":(e,t,i)=>{e.exports=i("dll-reference CKEditor5.dll")("./src/widget.js")},"dll-reference CKEditor5.dll":e=>{"use strict";e.exports=CKEditor5.dll}},t={};function i(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,i),a.exports}i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;i.g.importScripts&&(e=i.g.location+"");var t=i.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var o=n.length-1;o>-1&&!e;)e=n[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=e})();var n={};return(()=>{"use strict";i.d(n,{default:()=>d});var e=i("ckeditor5/src/core.js"),t=i("ckeditor5/src/widget.js");class o extends e.Command{execute(e){const{model:t}=this.editor;t.change((i=>{const n=i.model.document.selection?.getSelectedElement();if(n&&"avoindataSection"==n.name)i.setAttribute("avoindataSectionId",e,n);else{const n=function(e,t){const i=e.createElement("avoindataSection",{avoindataSectionId:t}),n=e.createElement("avoindataSectionTitle"),o=e.createElement("avoindataSectionContent");e.append(n,i),e.append(o,i);const a=e.createElement("paragraph");e.insertText("Title",a,0),e.append(a,n);const s=e.createElement("paragraph");return e.insertText("Content",s,0),e.append(s,o),i}(i,e);t.insertContent(n);const o=i.createSelection(n.getChild(0),"in");i.setSelection(o)}}))}refresh(){const{model:e}=this.editor,{selection:t}=e.document,i=e.schema.findAllowedParent(t.getFirstPosition(),"avoindataSection");this.isEnabled=null!==i}}class a extends e.Plugin{static get requires(){return[t.Widget]}init(){this._defineSchema(),this._defineConverters(),this.editor.commands.add("insertAvoindataSectionCommand",new o(this.editor))}_defineSchema(){const e=this.editor.model.schema;e.register("avoindataSection",{isObject:!0,allowWhere:"$block",allowAttributes:["avoindataSectionId"],allowContentOf:"$block"}),e.register("avoindataSectionTitle",{isLimit:!0,allowIn:"avoindataSection",allowContentOf:"$root"}),e.register("avoindataSectionContent",{isLimit:!0,allowIn:"avoindataSection",allowContentOf:"$root"}),e.addChildCheck(((e,t)=>{if((e.endsWith("avoindataSectionContent")||e.endsWith("avoindataSectionTitle"))&&"avoindataSection"===t.name)return!1}))}_defineConverters(){const{conversion:e}=this.editor;e.for("upcast").elementToElement({model:(e,{writer:t})=>t.createElement("avoindataSection",{avoindataSectionId:e.getAttribute("id")}),view:{name:"div",classes:"avoindata-section",attributes:["id"]}}),e.for("upcast").elementToElement({model:"avoindataSectionTitle",view:{name:"div",classes:"avoindata-section-title"}}),e.for("upcast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section-content"}}),e.for("dataDowncast").elementToElement({model:{name:"avoindataSection",attributes:["avoindataSectionId"]},view:(e,{writer:t})=>t.createContainerElement("div",{class:"avoindata-section",id:e.getAttribute("avoindataSectionId")})}),e.for("dataDowncast").elementToElement({model:"avoindataSectionTitle",view:{name:"div",classes:"avoindata-section-title"}}),e.for("dataDowncast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section-content"}}),e.for("editingDowncast").elementToElement({model:{name:"avoindataSection",attributes:["avoindataSectionId"]},view:(e,{writer:i})=>{const n=i.createContainerElement("div",{class:"avoindata-section",id:e.getAttribute("avoindataSectionId")});return(0,t.toWidget)(n,i,{label:"Avoindata Section widget"})}}),e.for("editingDowncast").elementToElement({model:"avoindataSectionTitle",view:(e,{writer:i})=>{const n=i.createEditableElement("div",{class:"avoindata-section-title"});return(0,t.toWidgetEditable)(n,i)}}),e.for("editingDowncast").elementToElement({model:"avoindataSectionContent",view:(e,{writer:i})=>{const n=i.createEditableElement("div",{class:"avoindata-section-content"});return(0,t.toWidgetEditable)(n,i)}}),e.for("upcast").elementToElement({model:"avoindataSectionTitle",view:{name:"h3",classes:"avoindata-section__title"}}),e.for("upcast").elementToElement({model:"avoindataSectionContent",view:{name:"div",classes:"avoindata-section__content"}})}}var s=i("ckeditor5/src/ui.js");class r extends s.View{constructor(e){super(e),this.heading=new s.LabelView(this.locale),this.heading.setTemplate({tag:"div",attributes:{class:["title"]},children:["Avoindata section"]}),this.idInputView=this._createInput("Id"),this.saveButtonView=this._createButton("Save",null,"btn btn-primary"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton("Cancel",null,"btn btn-secondary"),this.cancelButtonView.delegate("execute").to(this,"cancel"),this.childViews=this.createCollection([this.heading,this.idInputView,this.saveButtonView,this.cancelButtonView]),this.setTemplate({tag:"form",attributes:{class:["ck","ck-reset_all-excluded","avoindata-section-id-form"],tabindex:"-1"},children:this.childViews})}render(){super.render(),(0,s.submitHandler)({view:this})}focus(){this.childViews.get(1).focus()}_createInput(e){const t=new s.LabeledFieldView(this.locale,s.createLabeledInputText);return t.label=e,t}_createButton(e,t,i){const n=new s.ButtonView;return n.set({label:e,icon:t,tooltip:!0,class:i,withText:!0}),n}}class c extends e.Plugin{static get requires(){return[s.ContextualBalloon]}init(){const e=this.editor;this._balloon=e.plugins.get(s.ContextualBalloon),this.formView=this._createFormView();const t=e.commands.get("insertAvoindataSectionCommand");e.ui.componentFactory.add("avoindataSection",(i=>{const n=new s.ButtonView(i);return n.set({label:e.t("Avoindata Section"),icon:'\n \n \n \n \n\n',tooltip:!0}),n.bind("isOn","isEnabled").to(t,"value","isEnabled"),this.listenTo(n,"execute",(()=>{this._showUI()})),n}))}_createFormView(){const e=this.editor,t=new r(e.locale);return this.listenTo(t,"submit",(()=>{const i=t.idInputView.fieldView.element.value;e.model.change((t=>{e.execute("insertAvoindataSectionCommand",i)})),this._hideUI()})),this.listenTo(t,"cancel",(()=>{this._hideUI()})),(0,s.clickOutsideHandler)({emitter:t,activator:()=>this._balloon.visibleView===t,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()}),t}_showUI(){const e=this.editor.model.document.selection;this._balloon.add({view:this.formView,position:this._getBalloonPositionData()});const t=e.getSelectedElement()?.getAttribute("avoindataSectionId")||"";this.formView.idInputView.fieldView.value=t,this.formView.focus()}_hideUI(){this.formView.idInputView.fieldView.value="",this.formView.element.reset(),this._balloon.remove(this.formView),this.editor.editing.view.focus()}_getBalloonPositionData(){const e=this.editor.editing.view,t=e.document;let i=null;return i=()=>e.domConverter.viewRangeToDom(t.selection.getFirstRange()),{target:i}}}i.p;class l extends e.Plugin{static get requires(){return[a,c]}}const d={AvoindataSection:l}})(),n=n.default})())); \ No newline at end of file diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js index ae0c1cfbf9..e7a640b744 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExample/avoindataExample.js @@ -12,6 +12,7 @@ import AvoindataExampleEditing from './avoindataExampleEditing'; import AvoindataExampleUI from './avoindataExampleUI'; import { Plugin } from 'ckeditor5/src/core'; +import '../../css/styles.css'; export default class AvoindataExample extends Plugin { // Note that AvoindataExampleEditing and AvoindataExampleUI also extend `Plugin`, but these diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js index 7a4846aba6..b88da39243 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExpander/avoindataExpander.js @@ -12,6 +12,7 @@ import AvoindataExpanderEditing from './avoindataExpanderEditing'; import AvoindataExpanderUI from './avoindataExpanderUI'; import { Plugin } from 'ckeditor5/src/core'; +import '../../css/styles.css'; export default class AvoindataExpander extends Plugin { // Note that ExpanderEditing and ExpanderUI also extend `Plugin`, but these diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js new file mode 100644 index 0000000000..712b9b98d0 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js @@ -0,0 +1,114 @@ +import { Plugin } from 'ckeditor5/src/core'; +import '../../css/styles.css'; + +export default class AvoindataExternalLink extends Plugin { + init() { + const { conversion } = this.editor; + + // Upcast Converter for the old ckeditor4 plugin format + conversion.for('upcast').elementToAttribute({ + model: 'linkIsExternal', + view: { + name: 'a', + classes: ['external'], + attributes: ['aria-label', 'target'], + }, + }); + + // Extra consumption for the leftover svg icon + conversion.for('upcast').add(dispatcher => { + // Look for every view svg element. + dispatcher.on('element:svg', (evt, data, conversionApi) => { + // Get all the necessary items from the conversion API object. + const { + consumable + } = conversionApi; + + // Get view item from data object. + const { viewItem } = data; + + // Define elements consumables. + const svg = { name: 'svg', attributes: ['viewBox'] }; + const use = { name: 'use', attributes: ['href'] }; + + // Tests if the view element can be consumed. + if (!consumable.test(viewItem, svg)) { + return; + } + + // Check if there is only one child. + if (viewItem.childCount !== 1) { + return; + } + + // Get the first child element. + const firstChildItem = viewItem.getChild(0); + + // Check if the first element is a div. + if (!firstChildItem.is('element', 'use')) { + return; + } + + // Tests if the first child element can be consumed. + if (!consumable.test(firstChildItem, use)) { + return; + } + + // If a use tag inside a svg has the string 'avoindata_external-link' within the href + // we can assume it's the old ckeditor4 plugin format and simply get rid of them + if (firstChildItem?.getAttribute('href')?.includes('avoindata_external-link')) { + // Consume the main outer wrapper element. + consumable.consume(viewItem, svg); + // Consume the inner wrapper element. + consumable.consume(firstChildItem, use); + } + }); + }); + /* + const editor = this.editor; + + // `listenTo()` and `editor` are available thanks to `Plugin`. + // By using `listenTo()` you will ensure that the listener is removed when + // the plugin is destroyed. + this.listenTo(editor.data, 'ready', () => { + const linkCommand = editor.commands.get('link'); + const { selection } = editor.model.document; + + let linkCommandExecuting = false; + + linkCommand.on('execute', (evt, args) => { + const linkIsExternal = args[1]['linkIsExternal'] + + if (linkIsExternal) { + if (linkCommandExecuting) { + linkCommandExecuting = false; + return; + } + + // If the additional attribute was passed, we stop the default execution + // of the LinkCommand. We're going to create Model#change() block for undo + // and execute the LinkCommand together with setting the extra attribute. + evt.stop(); + + // Prevent infinite recursion by keeping records of when link command is + // being executed by this function. + linkCommandExecuting = true; + + // Wrapping the original command execution in a model.change() block to make sure there's a single undo step + // when the extra attribute is added. + + editor.model.change(writer => { + editor.execute('link', ...args); + const link = selection.getLastPosition().nodeBefore; + // writer.insertElement('avoindataExternalLink', selection.getLastPosition()) + }); + } + }) + }); + */ + } + + static get pluginName() { + return 'AvoindataExternalLink'; + } +} diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/index.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/index.js new file mode 100644 index 0000000000..78974da0b7 --- /dev/null +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/index.js @@ -0,0 +1,13 @@ +/** + * @file The build process always expects an index.js file. Anything exported + * here will be recognized by CKEditor 5 as an available plugin. Multiple + * plugins can be exported in this one file. + * + * I.e. this file's purpose is to make plugin(s) discoverable. + */ + +import AvoindataExternalLink from './avoindataExternalLink'; + +export default { + AvoindataExternalLink, +}; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js index 95e443a6a1..a70d005fbb 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataHint/avoindataHint.js @@ -12,6 +12,7 @@ import AvoindataHintEditing from './avoindataHintEditing'; import AvoindataHintUI from './avoindataHintUI'; import { Plugin } from 'ckeditor5/src/core'; +import '../../css/styles.css'; export default class AvoindataHint extends Plugin { // Note that AvoindataHintEditing and AvoindataHintUI also extend `Plugin`, but these diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js index 00aee81a4d..8554457ed1 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataNote/avoindataNote.js @@ -12,6 +12,7 @@ import AvoindataNoteEditing from './avoindataNoteEditing'; import AvoindataNoteUI from './avoindataNoteUI'; import { Plugin } from 'ckeditor5/src/core'; +import '../../css/styles.css'; export default class AvoindataNote extends Plugin { // Note that AvoindataNoteEditing and AvoindataNoteUI also extend `Plugin`, but these diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js index 278d47b213..77b9791ee6 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataSection/avoindataSection.js @@ -12,6 +12,7 @@ import AvoindataSectionEditing from './avoindataSectionEditing'; import AvoindataSectionUI from './avoindataSectionUI'; import { Plugin } from 'ckeditor5/src/core'; +import '../../css/styles.css'; export default class AvoindataSection extends Plugin { // Note that AvoindataSectionEditing and AvoindataSectionUI also extend `Plugin`, but these diff --git a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js index 86eb697773..769d29be60 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/webpack.config.js @@ -14,7 +14,6 @@ module.exports = []; // Loop through every subdirectory in src, each a different plugin, and build // each one in ./build. getDirectories('./src').forEach((dir) => { - console.log(dir) const bc = { mode: 'production', optimization: { diff --git a/drupal/site_config/editor.editor.ckeditor5.yml b/drupal/site_config/editor.editor.ckeditor5.yml new file mode 100644 index 0000000000..5078d6c540 --- /dev/null +++ b/drupal/site_config/editor.editor.ckeditor5.yml @@ -0,0 +1,56 @@ +langcode: fi +status: true +dependencies: + config: + - filter.format.ckeditor5 + module: + - ckeditor5 +format: ckeditor5 +editor: ckeditor5 +settings: + toolbar: + items: + - bold + - italic + - strikethrough + - superscript + - subscript + - removeFormat + - '|' + - undo + - redo + - '|' + - link + - bulletedList + - numberedList + - '|' + - blockQuote + - drupalInsertImage + - insertTable + - horizontalLine + - imce_link + - imce_image + - '|' + - sourceEditing + - '-' + - avoindataExpander + - avoindataNote + - avoindataHint + - avoindataExample + - avoindataSection + plugins: + ckeditor5_sourceEditing: + allowed_tags: { } + ckeditor5_list: + reversed: true + startIndex: true + ckeditor5_imageResize: + allow_resize: true +image_upload: + status: true + scheme: public + directory: inline-images + max_size: '' + max_dimensions: + width: 0 + height: 0 diff --git a/drupal/site_config/filter.format.ckeditor5.yml b/drupal/site_config/filter.format.ckeditor5.yml new file mode 100644 index 0000000000..48abd1547a --- /dev/null +++ b/drupal/site_config/filter.format.ckeditor5.yml @@ -0,0 +1,67 @@ +langcode: fi +status: true +dependencies: + module: + - editor +name: CKEditor5 +format: ckeditor5 +weight: -10 +filters: + filter_url: + id: filter_url + provider: filter + status: false + weight: -45 + settings: + filter_url_length: 72 + filter_html: + id: filter_html + provider: filter + status: false + weight: -50 + settings: + allowed_html: '' + filter_html_help: true + filter_html_nofollow: false + editor_file_reference: + id: editor_file_reference + provider: editor + status: true + weight: -42 + settings: { } + filter_align: + id: filter_align + provider: filter + status: true + weight: -48 + settings: { } + filter_caption: + id: filter_caption + provider: filter + status: true + weight: -46 + settings: { } + filter_htmlcorrector: + id: filter_htmlcorrector + provider: filter + status: true + weight: -43 + settings: { } + filter_html_image_secure: + id: filter_html_image_secure + provider: filter + status: false + weight: -44 + settings: { } + filter_html_escape: + id: filter_html_escape + provider: filter + status: false + weight: -49 + settings: { } + filter_autop: + id: filter_autop + provider: filter + status: false + weight: -47 + settings: { } diff --git a/opendata-assets/gulpfile.js b/opendata-assets/gulpfile.js index 79451bdd0f..6cf765c304 100644 --- a/opendata-assets/gulpfile.js +++ b/opendata-assets/gulpfile.js @@ -24,6 +24,7 @@ var paths = { drupal: "src/less/drupal/style.less", drupal_avoindata_header: "../drupal/modules/avoindata-header/resources/avoindata_header.js", drupal_ckeditor_plugins: "src/less/drupal/custom-elements.less", + drupal_ckeditor5_plugins: ["src/less/drupal/custom-elements.less", "src/less/drupal/editor.less"], templates: "src/templates/**/*", static_pages: "src/static_pages", fonts: "src/fonts/**/*", @@ -163,6 +164,19 @@ gulp.task("drupal_copy_custom_element_styles_to_plugin", (done) => { ], done) }); +// // Compiles Less files in Drupal theme directory +// // Output destination is also in Drupal theme directory +gulp.task("drupal_copy_custom_ckeditor_styles_to_plugin", (done) => { + pump([ + gulp.src(paths.src.drupal_ckeditor5_plugins), + less({paths: paths.src.drupal_ckeditor5_plugins}), + cleancss({format: 'beautify'}), + template({ timestamp: timestamp }), + concat("styles.css"), + gulp.dest("../drupal/modules/avoindata-ckeditor5-plugins/css"), + ], done) +}); + // Separate fonts to their own css to optimize their loading gulp.task("fontsCss", (done) => { pump([ @@ -341,6 +355,7 @@ gulp.task( "openapi_view", "drupal", "drupal_copy_custom_element_styles_to_plugin", + "drupal_copy_custom_ckeditor_styles_to_plugin", "fonts", "fontsCss", "scripts") @@ -371,6 +386,7 @@ gulp.task("watch_styles", () => { "ckan", "drupal", "drupal_copy_custom_element_styles_to_plugin", + "drupal_copy_custom_ckeditor_styles_to_plugin", "fontsCss", "lint" ) @@ -389,6 +405,7 @@ gulp.task("watch_drupal_styles", () => { gulp.series( "drupal", "drupal_copy_custom_element_styles_to_plugin", + "drupal_copy_custom_ckeditor_styles_to_plugin", "fontsCss", "lint" ) diff --git a/opendata-assets/src/less/drupal/custom-elements.less b/opendata-assets/src/less/drupal/custom-elements.less index 47f455a446..276337c38b 100644 --- a/opendata-assets/src/less/drupal/custom-elements.less +++ b/opendata-assets/src/less/drupal/custom-elements.less @@ -45,12 +45,8 @@ font-size: 18px; font-weight: 600; padding: 20px 0 20px 20px; - margin-block-start: 0; - margin-block-end: 0; - margin-inline-start: 0; - margin-inline-end: 0; display: inline-block; - max-width: 90%; + width: calc(100% - 45px); } .avoindata-expander-content { @@ -111,6 +107,7 @@ margin-inline-start: 0; margin-inline-end: 0; display: inline-block; + width: calc(100% - 70px); > *:last-child { margin: 0; @@ -176,7 +173,7 @@ margin-block-end: 0; margin-inline-start: 0; margin-inline-end: 0; - display: inline-block; + display: block; > *:last-child { margin: 0; diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css b/opendata-assets/src/less/drupal/editor.less similarity index 76% rename from drupal/modules/avoindata-ckeditor5-plugins/css/editor.css rename to opendata-assets/src/less/drupal/editor.less index 5b7cc4f1a5..03caee61f4 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/editor.css +++ b/opendata-assets/src/less/drupal/editor.less @@ -1,6 +1,6 @@ /* This selector targets the editable element (excluding comments). */ -.ck-editor__editable_inline:not(.ck-comment__input *) { - min-height: 300px; +.ck-editor__editable_inline { + height: 300px; overflow-y: auto; } @@ -11,7 +11,7 @@ align-content: center; &::after { - content: ''; + content: ""; width: 24px; height: 24px; transform: scale(0.6); @@ -21,12 +21,12 @@ } .avoindata-expander { - background:#f6f9fc; - border-radius:2px; - -webkit-box-shadow:0 2px 4px 1px rgba(41,41,41,.1); - box-shadow:0 2px 4px 1px rgba(41,41,41,.1); - border:1px solid #ecedee; - margin:0; + background: #f6f9fc; + border-radius: 2px; + -webkit-box-shadow: 0 2px 4px 1px rgba(41, 41, 41, 0.1); + box-shadow: 0 2px 4px 1px rgba(41, 41, 41, 0.1); + border: 1px solid #ecedee; + margin: 0; .avoindata-expander-title { font-size: 18px; @@ -34,15 +34,20 @@ line-height: 27px; padding: 0 20px 5px 20px; color: #2a6ebb; + display: block; } .avoindata-expander-content { padding: 0 20px 15px 20px; } + + &.ck-widget .avoindata-expander-content { + display: block; + } } .avoindata-expander + .avoindata-expander { - margin-top:-1px + margin-top: -1px; } .avoindata-note { @@ -92,9 +97,9 @@ } .avoindata-hint-icon { - height: 24px; - width: 24px; - margin: 20px 10px 0 20px; + height: 24px; + width: 24px; + margin: 20px 10px 0 20px; } .avoindata-hint-content { @@ -112,6 +117,7 @@ border-left: 4.5px solid #2a6ebb; margin-top: 20px; margin-bottom: 20px; + display: block; } .avoindata-example-title { @@ -119,10 +125,7 @@ font-weight: 600; line-height: 24px; padding: 20px 20px 6px 20px; - margin-block-start: 0; - margin-block-end: 0; - margin-inline-start: 0; - margin-inline-end: 0; + display: block; > *:last-child { margin: 0; @@ -134,15 +137,17 @@ font-weight: normal; line-height: 24px; padding: 0 20px 20px 20px; + display: block; } .avoindata-section { background-color: #fff; - box-shadow: 0 2px 4px 1px rgba(41,41,41,.2); + box-shadow: 0 2px 4px 1px rgba(41, 41, 41, 0.2); border-top: 4px solid #2a6ebb; border-radius: 4px 4px 0 0; margin: 45px 0; padding: 30px 30px; + display: block; &:first-of-type { margin-top: 0; @@ -151,8 +156,9 @@ .avoindata-section-title { margin-top: 0; margin-bottom: 20px; + display: block; - &>p { + & > p { margin: 0; font-size: 22px; line-height: 34px; @@ -161,7 +167,7 @@ } .avoindata-section-content { - &>p { + & > p { margin: 0; font-size: 18px; line-height: 27px; @@ -200,17 +206,23 @@ height: 40px; width: fit-content; font-weight: bold; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; margin: 12px 6px; &.btn-primary { - background: linear-gradient(0deg,#225a99 0,#2a6dbb 100%); + background: linear-gradient(0deg, #225a99 0, #2a6dbb 100%); color: white; border-color: #206b82; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.15), + 0 1px 1px rgba(0, 0, 0, 0.075); &:hover { - background: linear-gradient(0deg,#2a6dbb 0,#2e77cb 100%); + background: linear-gradient(0deg, #2a6dbb 0, #2e77cb 100%); } } @@ -219,12 +231,11 @@ border: 1px solid #2a6dbb; background: 0 0; box-shadow: none; - letter-spacing: .4px; + letter-spacing: 0.4px; &:hover { - background: linear-gradient(to top,white 0,gray 300%); + background: linear-gradient(to top, white 0, gray 300%); } } } } - From 93e980b1542e845f16d1078a878b09d72222d90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Fri, 6 Oct 2023 14:51:45 +0200 Subject: [PATCH 12/30] Lint --- .../css/styles.css | 155 +++++++++--------- opendata-assets/gulpfile.js | 82 +++++---- .../src/less/drupal/custom-elements.less | 2 +- opendata-assets/src/less/drupal/editor.less | 25 ++- 4 files changed, 142 insertions(+), 122 deletions(-) diff --git a/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css b/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css index 63cf020eba..27b62500e1 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css +++ b/drupal/modules/avoindata-ckeditor5-plugins/css/styles.css @@ -1,34 +1,34 @@ .external-link { display: inline-flex; flex-direction: row; - align-items: center + align-items: center; } .external-link::after { content: ''; width: 24px; height: 24px; transform: scale(.6); - background-image: url(../images/icon-external-link.svg) + background-image: url(../images/icon-external-link.svg); } .avoindata-expander { background: #f6f9fc; border-radius: 2px; box-shadow: 0 2px 4px 1px rgba(41,41,41,.1); border: 1px solid #ecedee; - margin: 0 + margin: 0; } .avoindata-expander + .avoindata-expander { - margin-top: -1px + margin-top: -1px; } .avoindata-expander.open { - background: #fff + background: #fff; } .avoindata-expander.open .avoindata-expander-content, .avoindata-expander.open .avoindata-expander-content.collapse { - display: block + display: block; } .avoindata-expander-header { - cursor: pointer + cursor: pointer; } .avoindata-expander-title { color: #2a6ebb; @@ -37,46 +37,46 @@ font-weight: 600; padding: 20px 0 20px 20px; display: inline-block; - width: calc(100% - 45px) + width: calc(100% - 45px); } .avoindata-expander-content { display: none; - padding: 0 20px 15px 20px; + padding: 0 20px 15px; color: #000; font-family: "Source Sans Pro Regular","Helvetica Neue",Arial,sans-serif; font-size: 18px; font-weight: 400; - line-height: 27px + line-height: 27px; } .avoindata-expander-content.cke_widget_editable { - display: block + display: block; } .avoindata-expander-header .icon-wrapper { float: right; padding-right: 20px; - padding-top: 24px + padding-top: 24px; } .avoindata-expander-header .icon-wrapper i { - color: #2a6ebb + color: #2a6ebb; } .avoindata-expander-group-toggler { text-decoration: none; color: #2a6ebb; cursor: pointer; - margin-bottom: 10px + margin-bottom: 10px; } .avoindata-note-header-image, .avoindata-note-icon { height: 24px; width: 24px; margin-left: 20px; - margin-top: auto + margin-top: auto; } .avoindata-note { background: #f7f7f8; border-radius: 0; margin-top: 20px; - margin-bottom: 20px + margin-bottom: 20px; } .avoindata-note-title { color: #292929; @@ -90,10 +90,10 @@ margin-inline-start: 0; margin-inline-end: 0; display: inline-block; - width: calc(100% - 70px) + width: calc(100% - 70px); } .avoindata-note-title > :last-child { - margin: 0 + margin: 0; } .avoindata-note-content { color: #292929; @@ -101,15 +101,15 @@ font-size: 18px; font-weight: 400; line-height: 27px; - padding: 0 20px 15px 20px + padding: 0 20px 15px; } .avoindata-expander-content p:last-of-type, .avoindata-hint-content p:last-of-type, .avoindata-note-content p:last-of-type { - margin-bottom: 0 + margin-bottom: 0; } .avoindata-hint { - margin: 20px 0 + margin: 20px 0; } .avoindata-hint-icon, .avoindata-hint-image { @@ -117,7 +117,7 @@ vertical-align: top; height: 24px; width: 24px; - margin-left: 20px + margin-left: 20px; } .avoindata-hint-content { width: calc(100% - 45px); @@ -127,7 +127,7 @@ font-size: 18px; font-weight: 400; line-height: 27px; - padding: 0 20px 15px 15px + padding: 0 20px 15px 15px; } .avoindata-example { background: #fff; @@ -135,7 +135,7 @@ border: 1.5px solid #2a6ebb; border-left: 4.5px solid #2a6ebb; margin-top: 20px; - margin-bottom: 20px + margin-bottom: 20px; } .avoindata-example-title { color: #292929; @@ -143,15 +143,15 @@ font-size: 16px; font-weight: 600; line-height: 24px; - padding: 20px 20px 6px 20px; + padding: 20px 20px 6px; margin-block-start: 0; margin-block-end: 0; margin-inline-start: 0; margin-inline-end: 0; - display: block + display: block; } .avoindata-example-title > :last-child { - margin: 0 + margin: 0; } .avoindata-example-content { color: #292929; @@ -159,7 +159,7 @@ font-size: 16px; font-weight: 400; line-height: 24px; - padding: 0 20px 20px 20px + padding: 0 20px 20px; } .avoindata-section { background-color: #fff; @@ -167,60 +167,60 @@ border-top: 4px solid #2a6ebb; border-radius: 4px 4px 0 0; margin: 45px 0; - padding: 30px 30px + padding: 30px 30px; } .avoindata-section:first-of-type { - margin-top: 0 + margin-top: 0; } .avoindata-section .avoindata-section-title, .avoindata-section .avoindata-section__title { margin-top: 0; margin-bottom: 20px; - font-size: 22px + font-size: 22px; } .avoindata-section .avoindata-section-title p, .avoindata-section .avoindata-section__title p { line-height: 34px; - font-weight: 600 + font-weight: 600; } table { border-collapse: collapse; - text-align: left + text-align: left; } table caption { color: #222; font-weight: 600; text-align: left; - padding: 20px 0 + padding: 20px 0; } table td, table th { padding: 7px 15px; - border: 1px solid #c8cdd0 + border: 1px solid #c8cdd0; } table th { background-color: #f7f7f8; color: #222; - font-weight: 600 + font-weight: 600; } table td { - color: #292929 + color: #292929; } a.external svg { margin-bottom: -2px; margin-left: 4px; width: 16px; height: 16px; - fill: #2a6ebb + fill: #2a6ebb; } .ck-editor__editable_inline { height: 300px; - overflow-y: auto + overflow-y: auto; } .ck-content .external-link { display: inline-flex; flex-direction: row; - align-content: center + align-content: center; } .ck-content .external-link::after { content: ""; @@ -228,45 +228,44 @@ a.external svg { height: 24px; transform: scale(.6); margin-left: 2px; - background-image: url(../icons/icon-external-link.svg) + background-image: url(../icons/icon-external-link.svg); } .ck-content .avoindata-expander { background: #f6f9fc; border-radius: 2px; - -webkit-box-shadow: 0 2px 4px 1px rgba(41,41,41,.1); box-shadow: 0 2px 4px 1px rgba(41,41,41,.1); border: 1px solid #ecedee; - margin: 0 + margin: 0; } .ck-content .avoindata-expander .avoindata-expander-title { font-size: 18px; font-weight: 600; line-height: 27px; - padding: 0 20px 5px 20px; + padding: 0 20px 5px; color: #2a6ebb; - display: block + display: block; } .ck-content .avoindata-expander .avoindata-expander-content { - padding: 0 20px 15px 20px + padding: 0 20px 15px; } .ck-content .avoindata-expander.ck-widget .avoindata-expander-content { - display: block + display: block; } .ck-content .avoindata-expander + .avoindata-expander { - margin-top: -1px + margin-top: -1px; } .ck-content .avoindata-note { background: #f7f7f8; border-radius: 0; margin-top: 20px; - margin-bottom: 20px + margin-bottom: 20px; } .ck-content .avoindata-note-icon { vertical-align: text-bottom; height: 24px; width: 24px; display: inline-flex; - margin: 20px 10px 0 20px + margin: 20px 10px 0 20px; } .ck-content .avoindata-note-title { display: inline-flex; @@ -274,37 +273,37 @@ a.external svg { font-weight: 600; line-height: 28px; padding: 10px 0; - width: calc(100% - 70px) + width: calc(100% - 70px); } .ck-content .avoindata-note-title > :last-child { - margin: 0 + margin: 0; } .ck-content .avoindata-note-content { font-size: 18px; font-weight: 400; line-height: 27px; - padding: 0 20px 15px 20px + padding: 0 20px 15px; } .ck-content .avoindata-expander-content p:last-of-type, .ck-content .avoindata-hint-content p:last-of-type, .ck-content .avoindata-note-content p:last-of-type { - margin-bottom: 0 + margin-bottom: 0; } .ck-content .avoindata-hint { margin: 20px 0; - display: flex + display: flex; } .ck-content .avoindata-hint-icon { height: 24px; width: 24px; - margin: 20px 10px 0 20px + margin: 20px 10px 0 20px; } .ck-content .avoindata-hint-content { flex-grow: 2; font-size: 18px; font-weight: 400; line-height: 27px; - padding: 0 20px 15px 15px + padding: 0 20px 15px 15px; } .ck-content .avoindata-example { background: #fff; @@ -313,24 +312,24 @@ a.external svg { border-left: 4.5px solid #2a6ebb; margin-top: 20px; margin-bottom: 20px; - display: block + display: block; } .ck-content .avoindata-example-title { font-size: 16px; font-weight: 600; line-height: 24px; - padding: 20px 20px 6px 20px; - display: block + padding: 20px 20px 6px; + display: block; } .ck-content .avoindata-example-title > :last-child { - margin: 0 + margin: 0; } .ck-content .avoindata-example-content { font-size: 16px; font-weight: 400; line-height: 24px; - padding: 0 20px 20px 20px; - display: block + padding: 0 20px 20px; + display: block; } .ck-content .avoindata-section { background-color: #fff; @@ -338,40 +337,40 @@ a.external svg { border-top: 4px solid #2a6ebb; border-radius: 4px 4px 0 0; margin: 45px 0; - padding: 30px 30px; - display: block + padding: 30px; + display: block; } .ck-content .avoindata-section:first-of-type { - margin-top: 0 + margin-top: 0; } .ck-content .avoindata-section .avoindata-section-title { margin-top: 0; margin-bottom: 20px; - display: block + display: block; } .ck-content .avoindata-section .avoindata-section-title > p { margin: 0; font-size: 22px; line-height: 34px; - font-weight: 600 + font-weight: 600; } .ck-content .avoindata-section .avoindata-section-content > p { margin: 0; font-size: 18px; line-height: 27px; - font-weight: 400 + font-weight: 400; } .avoindata-section-id-form { - padding: 8px + padding: 8px; } .avoindata-section-id-form .title { padding: 6px; padding-bottom: 12px; font-size: 16px; - font-weight: 600 + font-weight: 600; } .avoindata-section-id-form .ck-labeled-field-view { - padding: 6px + padding: 6px; } .avoindata-section-id-form .ck.ck-button.btn { text-align: center; @@ -389,24 +388,24 @@ a.external svg { width: fit-content; font-weight: 700; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; - margin: 12px 6px + margin: 12px 6px; } .avoindata-section-id-form .ck.ck-button.btn.btn-primary { background: linear-gradient(0deg,#225a99 0,#2a6dbb 100%); color: #fff; border-color: #206b82; - box-shadow: inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075) + box-shadow: inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075); } .avoindata-section-id-form .ck.ck-button.btn.btn-primary:hover { - background: linear-gradient(0deg,#2a6dbb 0,#2e77cb 100%) + background: linear-gradient(0deg,#2a6dbb 0,#2e77cb 100%); } .avoindata-section-id-form .ck.ck-button.btn.btn-secondary { color: #2a6dbb; border: 1px solid #2a6dbb; background: 0 0; box-shadow: none; - letter-spacing: .4px + letter-spacing: .4px; } .avoindata-section-id-form .ck.ck-button.btn.btn-secondary:hover { - background: linear-gradient(to top,#fff 0,gray 300%) -} \ No newline at end of file + background: linear-gradient(to top,#fff 0,gray 300%); +} diff --git a/opendata-assets/gulpfile.js b/opendata-assets/gulpfile.js index d4539f10dc..705b1af503 100644 --- a/opendata-assets/gulpfile.js +++ b/opendata-assets/gulpfile.js @@ -43,7 +43,7 @@ var paths = { drupalTheme: "../drupal/modules/avoindata-theme" }; -if (!fs.existsSync(paths.src.fontawesome)){ +if (!fs.existsSync(paths.src.fontawesome)) { paths.src.fontawesome = "./node_modules/@fortawesome/fontawesome-free"; } @@ -97,17 +97,18 @@ gulp.task('lint', (done) => { gulp.src(paths.src.less + '/**/*.less'), gulpStylelint({ failAfterError: true, - reporters:[ - {formatter: 'string', console: true} - ]}) + reporters: [ + { formatter: 'string', console: true } + ] + }) ], done) }); -gulp.task("ckan",(done) => { +gulp.task("ckan", (done) => { pump([ gulp.src(paths.src.ckan + "/*.less"), sourcemaps.init(), - less({paths: [paths.src.ckan]}), + less({ paths: [paths.src.ckan] }), prefixer(), cleancss({ keepBreaks: false }), concat("ckan.css"), @@ -117,7 +118,7 @@ gulp.task("ckan",(done) => { ], done) }); -gulp.task("openapi_view",(done) => { +gulp.task("openapi_view", (done) => { pump([ gulp.src(paths.src.less + "/openapi_view.less"), sourcemaps.init(), @@ -138,7 +139,7 @@ gulp.task("drupal", (done) => { pump([ gulp.src(paths.src.drupal), sourcemaps.init(), - less({paths: [paths.src.drupal]}), + less({ paths: [paths.src.drupal] }), prefixer(), template({ timestamp: timestamp }), cleancss({ keepBreaks: false }), @@ -154,7 +155,7 @@ gulp.task("drupal_copy_custom_element_styles_to_plugin", (done) => { pump([ gulp.src(paths.src.drupal_ckeditor_plugins), sourcemaps.init(), - less({paths: [paths.src.drupal_ckeditor_plugins]}), + less({ paths: [paths.src.drupal_ckeditor_plugins] }), prefixer(), template({ timestamp: timestamp }), cleancss({ keepBreaks: false }), @@ -169,8 +170,29 @@ gulp.task("drupal_copy_custom_element_styles_to_plugin", (done) => { gulp.task("drupal_copy_custom_ckeditor_styles_to_plugin", (done) => { pump([ gulp.src(paths.src.drupal_ckeditor5_plugins), - less({paths: paths.src.drupal_ckeditor5_plugins}), - cleancss({format: 'beautify'}), + less({ paths: paths.src.drupal_ckeditor5_plugins }), + cleancss({ + format: { + semicolonAfterLastProperty: true, + indentBy: 2, + breaks: { + afterAtRule: 2, + afterBlockBegins: 1, + afterBlockEnds: 2, + afterComment: 1, + afterProperty: 1, + afterRuleBegins: 1, + afterRuleEnds: 1, + beforeBlockEnds: 1, + betweenSelectors: 1 + }, + spaces: { + aroundSelectorRelation: true, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false` + beforeBlockBegins: true, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false` + beforeValue: true // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false` + } + } + }), template({ timestamp: timestamp }), concat("styles.css"), gulp.dest("../drupal/modules/avoindata-ckeditor5-plugins/css"), @@ -182,7 +204,7 @@ gulp.task("fontsCss", (done) => { pump([ gulp.src(paths.src.fontsCss), sourcemaps.init(), - less({paths: [paths.src.fontsCss]}), + less({ paths: [paths.src.fontsCss] }), prefixer(), template({ timestamp: timestamp }), cleancss({ keepBreaks: false }), @@ -204,8 +226,8 @@ gulp.task("images", (done) => { }), imagemin.svgo({ plugins: [ - {removeViewBox: true}, - {cleanupIDs: false} + { removeViewBox: true }, + { cleanupIDs: false } ] }) ]), @@ -225,13 +247,13 @@ gulp.task("templates", (done) => { gulp.task("static_css", gulp.series('images', (done) => { - pump([ - gulp.src(paths.src.static_pages + "/css/main.css"), - base64('../../resources/images'), - concat("error.css"), - gulp.dest(paths.drupalTheme + "/css") - ], done) -})); + pump([ + gulp.src(paths.src.static_pages + "/css/main.css"), + base64('../../resources/images'), + concat("error.css"), + gulp.dest(paths.drupalTheme + "/css") + ], done) + })); gulp.task( "static_pages", @@ -269,7 +291,7 @@ gulp.task("bootstrap_scripts", (done) => { gulp.task("bootstrap_styles", (done) => { pump([ gulp.src(paths.src.bootstrap_styles + "/bootstrap.less"), - less({paths: [paths.src.bootstrap_styles]}), + less({ paths: [paths.src.bootstrap_styles] }), concat("bootstrap.css"), gulp.dest(paths.dist + "/vendor"), cleancss({ keepBreaks: false }), @@ -289,9 +311,9 @@ gulp.task('copy:libs', (done) => { pump([ gulp.src(npmDist({ excludes: ['/@fortawesome/**/*'] - }), {base: './node_modules'}), + }), { base: './node_modules' }), rename((path) => { - if (path.extname === '.js' || path.extname === '.css'){ + if (path.extname === '.js' || path.extname === '.css') { path.basename = path.basename.replace(".min", ""); } }), @@ -313,12 +335,12 @@ gulp.task("vendor", "bootstrap_scripts", "bootstrap_styles", "bootstrap_fonts", (done) => { - pump([ - gulp.src(paths.src.root + "/vendor/**/*"), - gulp.dest(paths.drupalTheme + "/vendor"), - gulp.dest(paths.ckanResources + "/vendor"), - ], done) - }) + pump([ + gulp.src(paths.src.root + "/vendor/**/*"), + gulp.dest(paths.drupalTheme + "/vendor"), + gulp.dest(paths.ckanResources + "/vendor"), + ], done) + }) ); gulp.task( diff --git a/opendata-assets/src/less/drupal/custom-elements.less b/opendata-assets/src/less/drupal/custom-elements.less index 81d0a7ccc6..d5f6e73413 100644 --- a/opendata-assets/src/less/drupal/custom-elements.less +++ b/opendata-assets/src/less/drupal/custom-elements.less @@ -10,7 +10,7 @@ width: 24px; height: 24px; transform: scale(0.6); - background-image: url(../images/icon-external-link.svg); + background-image: url("../images/icon-external-link.svg"); } } diff --git a/opendata-assets/src/less/drupal/editor.less b/opendata-assets/src/less/drupal/editor.less index 03caee61f4..2557cb7a2d 100644 --- a/opendata-assets/src/less/drupal/editor.less +++ b/opendata-assets/src/less/drupal/editor.less @@ -16,15 +16,14 @@ height: 24px; transform: scale(0.6); margin-left: 2px; - background-image: url(../icons/icon-external-link.svg); + background-image: url("../icons/icon-external-link.svg"); } } .avoindata-expander { background: #f6f9fc; border-radius: 2px; - -webkit-box-shadow: 0 2px 4px 1px rgba(41, 41, 41, 0.1); - box-shadow: 0 2px 4px 1px rgba(41, 41, 41, 0.1); + box-shadow: 0 2px 4px 1px rgb(41 41 41 / 10%); border: 1px solid #ecedee; margin: 0; @@ -32,13 +31,13 @@ font-size: 18px; font-weight: 600; line-height: 27px; - padding: 0 20px 5px 20px; + padding: 0 20px 5px; color: #2a6ebb; display: block; } .avoindata-expander-content { - padding: 0 20px 15px 20px; + padding: 0 20px 15px; } &.ck-widget .avoindata-expander-content { @@ -51,7 +50,7 @@ } .avoindata-note { - background: rgb(247, 247, 248); + background: rgb(247 247 248); border-radius: 0; margin-top: 20px; margin-bottom: 20px; @@ -82,7 +81,7 @@ font-size: 18px; font-weight: normal; line-height: 27px; - padding: 0 20px 15px 20px; + padding: 0 20px 15px; } .avoindata-expander-content p:last-of-type, @@ -124,7 +123,7 @@ font-size: 16px; font-weight: 600; line-height: 24px; - padding: 20px 20px 6px 20px; + padding: 20px 20px 6px; display: block; > *:last-child { @@ -136,17 +135,17 @@ font-size: 16px; font-weight: normal; line-height: 24px; - padding: 0 20px 20px 20px; + padding: 0 20px 20px; display: block; } .avoindata-section { background-color: #fff; - box-shadow: 0 2px 4px 1px rgba(41, 41, 41, 0.2); + box-shadow: 0 2px 4px 1px rgb(41 41 41 / 20%); border-top: 4px solid #2a6ebb; border-radius: 4px 4px 0 0; margin: 45px 0; - padding: 30px 30px; + padding: 30px; display: block; &:first-of-type { @@ -218,8 +217,8 @@ color: white; border-color: #206b82; box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.15), - 0 1px 1px rgba(0, 0, 0, 0.075); + inset 0 1px 0 rgb(255 255 255 / 15%), + 0 1px 1px rgb(0 0 0 / 7.5%); &:hover { background: linear-gradient(0deg, #2a6dbb 0, #2e77cb 100%); From 5eac64e38bf55caf4aa82c1bd046cf52f7783463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Fri, 6 Oct 2023 16:13:33 +0200 Subject: [PATCH 13/30] AV-2017: Add permissions for the editor and publisher roles --- drupal/scripts/init_drupal.sh | 2 +- drupal/site_config/user.role.editor.yml | 1 + drupal/site_config/user.role.publisher.yml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/drupal/scripts/init_drupal.sh b/drupal/scripts/init_drupal.sh index 284e7895ca..ca454c7155 100644 --- a/drupal/scripts/init_drupal.sh +++ b/drupal/scripts/init_drupal.sh @@ -111,7 +111,7 @@ drush config:delete core.entity_view_display.node.page.default drush config:delete pathauto.settings || true drush config:delete captcha.captcha_point.contact_message_feedback_form || true drush config:delete core.base_field_override.node.article.promote || true -drush config:delete editor.editor.full_html +drush config:delete editor.editor.full_html || true # enable custom modules echo "enable custom modules.." diff --git a/drupal/site_config/user.role.editor.yml b/drupal/site_config/user.role.editor.yml index 9537ee7cff..de216d5cbc 100644 --- a/drupal/site_config/user.role.editor.yml +++ b/drupal/site_config/user.role.editor.yml @@ -52,5 +52,6 @@ permissions: - 'translate user-defined strings' - 'use text format filtered_html' - 'use text format full_html' + - 'use text format ckeditor5' - 'view own unpublished content' - 'view revisions' diff --git a/drupal/site_config/user.role.publisher.yml b/drupal/site_config/user.role.publisher.yml index 8855f2e72b..839248091e 100644 --- a/drupal/site_config/user.role.publisher.yml +++ b/drupal/site_config/user.role.publisher.yml @@ -92,6 +92,7 @@ permissions: - 'use text format basic_html' - 'use text format filtered_html' - 'use text format full_html' + - 'use text format ckeditor5' - 'use text format restricted_html' - 'view article revisions' - 'view article unpublished content' From 43b07b9a3907f27404d80ba3f5e455d44fd7aca0 Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Mon, 9 Oct 2023 09:31:20 +0300 Subject: [PATCH 14/30] AV-1959: Fix event filter and message formatting --- cdk/lib/monitoring-stack.ts | 6 ++---- cdk/lib/send-to-zulip.function.ts | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cdk/lib/monitoring-stack.ts b/cdk/lib/monitoring-stack.ts index ae6b627f09..f2c33e1070 100644 --- a/cdk/lib/monitoring-stack.ts +++ b/cdk/lib/monitoring-stack.ts @@ -26,10 +26,8 @@ export class MonitoringStack extends Stack { eventPattern: { source: ['aws.ecs'], detail: { - eventName: ['SERVICE_TASK_START_IMPAIRED', - 'SERVICE_DISCOVERY_INSTANCE_UNHEALTHY', - 'SERVICE_TASK_PLACEMENT_FAILURE', - 'SERVICE_TASK_CONFIGURATION_FAILURE'] + desiredStatus: ['STOPPED'], + stoppedReason: [{wildcard: '*health*'}] } }, targets: [sendToDeveloperZulipTarget, taskHealthCheckFailLogGroupTarget], diff --git a/cdk/lib/send-to-zulip.function.ts b/cdk/lib/send-to-zulip.function.ts index d9dd3c4562..a870d7ddb6 100644 --- a/cdk/lib/send-to-zulip.function.ts +++ b/cdk/lib/send-to-zulip.function.ts @@ -5,7 +5,22 @@ import FormData = require('form-data'); const { ZULIP_API_URL, ZULIP_API_USER, ZULIP_API_KEY_SECRET, ZULIP_STREAM, ZULIP_TOPIC } = process.env; +function eventMessage(event: any) { + const {detail} = event; + if(detail?.eventName) { + // Generic event + const {resources} = event; + return `${detail?.eventName}: ${resources?.join(', ')}`; + } else if(detail?.stoppedReason) { + // Container stopped event + const {taskArn, group, stoppedReason} = detail; + return `${taskArn} (${group}): ${stoppedReason}`; + } else { + return 'Unknown message type'; + } +} export const handler: Handler = async (event: any) => { + console.log(event); if(!ZULIP_API_URL || !ZULIP_API_USER || !ZULIP_API_KEY_SECRET || !ZULIP_STREAM || !ZULIP_TOPIC) { return { @@ -21,8 +36,7 @@ export const handler: Handler = async (event: any) => { const response = await secretsManagerClient.send(command); const zulipApiKey = response.SecretString; - const { resources, detail } = event; - const message = `${detail?.eventName}: ${resources?.join(', ')}`; + const message = eventMessage(event); const data = new FormData(); data.append('type', 'stream'); From 8510646cc06896df5d7df3884d256f813a8d1b20 Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Mon, 9 Oct 2023 09:44:59 +0300 Subject: [PATCH 15/30] AV-2055: Administrator does not need permissions, everything is permitted anyhow --- .../site_config/user.role.administrator.yml | 116 +----------------- 1 file changed, 1 insertion(+), 115 deletions(-) diff --git a/drupal/site_config/user.role.administrator.yml b/drupal/site_config/user.role.administrator.yml index 70e0ebb0ca..10084dfb6d 100644 --- a/drupal/site_config/user.role.administrator.yml +++ b/drupal/site_config/user.role.administrator.yml @@ -5,118 +5,4 @@ id: administrator label: administrator weight: 2 is_admin: true -permissions: - - 'access administration pages' - - 'access all views' - - 'access comments' - - 'access content' - - 'access content overview' - - 'access contextual links' - - 'access dashboard' - - 'access draggableviews' - - 'access overlay' - - 'access rules debug' - - 'access site in maintenance mode' - - 'access site reports' - - 'access toolbar' - - 'access user profiles' - - 'administer CAPTCHA settings' - - 'administer actions' - - 'administer blocks' - - 'administer ckeditor' - - 'administer comment blocks' - - 'administer comments' - - 'administer content translations' - - 'administer content types' - - 'administer custom username validation' - - 'administer features' - - 'administer fields' - - 'administer filters' - - 'administer honeypot' - - 'administer image styles' - - 'administer imce' - - 'administer languages' - - 'administer menu' - - 'administer modules' - - 'administer node expire' - - 'administer nodes' - - 'administer pathauto' - - 'administer permissions' - - 'administer recaptcha' - - 'administer rules' - - 'administer search' - - 'administer services' - - 'administer sharethis' - - 'administer shortcuts' - - 'administer site configuration' - - 'administer software updates' - - 'administer taxonomy' - - 'administer themes' - - 'administer url aliases' - - 'administer users' - - 'administer uuid' - - 'administer views' - - 'administer xmlsitemap' - - 'block IP addresses' - - 'bypass honeypot protection' - - 'bypass node access' - - 'bypass rules access' - - 'cancel account' - - 'change own username' - - 'create article content' - - 'create page content' - - 'create url aliases' - - 'customize ckeditor' - - 'customize shortcut links' - - 'delete any article content' - - 'delete any page content' - - 'delete own article content' - - 'delete own page content' - - 'delete revisions' - - 'delete terms in 1' - - 'display admin pages in another language' - - 'edit any article content' - - 'edit any page content' - - 'edit node expire' - - 'edit own article content' - - 'edit own comments' - - 'edit own page content' - - 'edit terms in 1' - - 'export nodes' - - 'export own nodes' - - 'generate features' - - 'get a system variable' - - 'get any binary files' - - 'get own binary files' - - 'import or export menu' - - 'manage features' - - 'notify of path changes' - - 'opt-in or out of tracking' - - 'override custom username validation' - - 'perform unlimited index queries' - - 'post comments' - - 'rename features' - - 'revert revisions' - - 'save file information' - - 'search content' - - 'select account cancellation method' - - 'services menu retrieve menu' - - 'set a system variable' - - 'skip CAPTCHA' - - 'skip comment approval' - - 'switch shortcut sets' - - 'translate admin strings' - - 'translate blocks' - - 'translate content' - - 'translate interface' - - 'translate user-defined strings' - - 'use PHP for tracking visibility' - - 'use PHP to import nodes' - - 'use advanced search' - - 'use all enabled languages' - - 'use ctools import' - - 'use text format filtered_html' - - 'use text format full_html' - - 'view own unpublished content' - - 'view revisions' - - 'view the administration theme' +permissions: {} From 6d8b62198da62c18ef76de49ca7307580db323d0 Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Mon, 9 Oct 2023 10:11:46 +0300 Subject: [PATCH 16/30] AV-2055: Remove invalid permissions from anonymous user --- drupal/site_config/user.role.anonymous.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drupal/site_config/user.role.anonymous.yml b/drupal/site_config/user.role.anonymous.yml index e959639e37..09309091a7 100644 --- a/drupal/site_config/user.role.anonymous.yml +++ b/drupal/site_config/user.role.anonymous.yml @@ -9,6 +9,4 @@ permissions: - 'access comments' - 'access content' - 'access site-wide contact form' - - 'search content' - - 'services menu retrieve menu' - - 'use text format filtered_html' + From 31a6c462758eab196288f40fe2a9d729c7f95b57 Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Mon, 9 Oct 2023 10:41:31 +0300 Subject: [PATCH 17/30] AV-2055: Remove invalid permissions of authenticated users --- drupal/site_config/user.role.authenticated.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/drupal/site_config/user.role.authenticated.yml b/drupal/site_config/user.role.authenticated.yml index a813bda593..f6400d243d 100644 --- a/drupal/site_config/user.role.authenticated.yml +++ b/drupal/site_config/user.role.authenticated.yml @@ -13,6 +13,4 @@ permissions: - 'access content' - 'access site-wide contact form' - 'post comments' - - 'search content' - 'skip comment approval' - - 'use text format filtered_html' From f53d81dc3ce615fc4d0d79b5ebabda252ec72c92 Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Mon, 9 Oct 2023 12:24:49 +0300 Subject: [PATCH 18/30] AV-1959: Remove unnecessary logging --- cdk/lib/send-to-zulip.function.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cdk/lib/send-to-zulip.function.ts b/cdk/lib/send-to-zulip.function.ts index a870d7ddb6..f1133c0480 100644 --- a/cdk/lib/send-to-zulip.function.ts +++ b/cdk/lib/send-to-zulip.function.ts @@ -20,7 +20,6 @@ function eventMessage(event: any) { } } export const handler: Handler = async (event: any) => { - console.log(event); if(!ZULIP_API_URL || !ZULIP_API_USER || !ZULIP_API_KEY_SECRET || !ZULIP_STREAM || !ZULIP_TOPIC) { return { @@ -55,8 +54,8 @@ export const handler: Handler = async (event: any) => { await new Promise((resolve, reject) => { const req = https.request(options, (res: any) => { - console.log('Response from Zulip API:', res.statusCode); if(res.statusCode != 200) { + console.log('Response from Zulip API:', res.statusCode); res.on('data', (chunk: any) => { console.log(chunk.toString()); }).on('end', () => { From 2e8ede26a54874363510ec2143ee9d2496e1d14b Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Mon, 9 Oct 2023 12:32:39 +0300 Subject: [PATCH 19/30] AV-1959: Don't generate secret in CDK --- cdk/lib/send-to-zulip.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdk/lib/send-to-zulip.ts b/cdk/lib/send-to-zulip.ts index 3093fc2554..9722e497ee 100644 --- a/cdk/lib/send-to-zulip.ts +++ b/cdk/lib/send-to-zulip.ts @@ -9,7 +9,7 @@ export class SendToZulip extends Construct { super(scope, id); // Task restart zulip reporting - const zulipSecret = new sm.Secret(this, `${props.environment}_zulip_api_key`); + const zulipSecret = sm.Secret.fromSecretNameV2(this, 'sZulipSecret', `${props.environment}_zulip_api_key`); this.lambda = new NodejsFunction(this, 'function', { environment: { From 0c9ad2e1d3a683eeb547ad5159a7d61e921a090e Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Mon, 9 Oct 2023 12:54:38 +0300 Subject: [PATCH 20/30] AV-2055: Delete editor role --- docker/.env.template | 19 ++++----- drupal/scripts/init_drupal.sh | 2 + drupal/site_config/user.role.editor.yml | 56 ------------------------- 3 files changed, 9 insertions(+), 68 deletions(-) delete mode 100644 drupal/site_config/user.role.editor.yml diff --git a/docker/.env.template b/docker/.env.template index c59240f800..a32161eb68 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -50,21 +50,16 @@ SENTRY_ENV="local" # drupal + ckan roles ROLES_CKAN_ADMIN=ckan_admin -ROLES_EDITOR=editor ROLES_PUBLISHER=publisher # initial users -USERS_0_USER=test-editor -USERS_0_PASS=test-editor -USERS_0_EMAIL=editor@localhost -USERS_0_ROLES="ckan_admin editor" -USERS_1_USER=test-publisher -USERS_1_PASS=test-publisher -USERS_1_EMAIL=publisher@localhost -USERS_1_ROLES="publisher" -USERS_2_USER=test-user -USERS_2_PASS=test-user -USERS_2_EMAIL=user@localhost +USERS_0_USER=test-publisher +USERS_0_PASS=test-publisher +USERS_0_EMAIL=publisher@localhost +USERS_0_ROLES="publisher" +USERS_1_USER=test-user +USERS_1_PASS=test-user +USERS_1_EMAIL=user@localhost # postgres DB_CKAN_HOST=postgres diff --git a/drupal/scripts/init_drupal.sh b/drupal/scripts/init_drupal.sh index 2e606c8aa5..392fe73c7c 100644 --- a/drupal/scripts/init_drupal.sh +++ b/drupal/scripts/init_drupal.sh @@ -87,6 +87,8 @@ drush config:delete core.entity_view_display.node.page.search_result drush config:delete core.entity_view_display.node.page.teaser || true drush config:delete field.field.node.page.field_basic_page_comments || true drush config:delete field.storage.node.field_basic_page_comments || true +drush config:delete user.role.editor || true + # uninstall modules echo "uninstall modules.." diff --git a/drupal/site_config/user.role.editor.yml b/drupal/site_config/user.role.editor.yml deleted file mode 100644 index 9537ee7cff..0000000000 --- a/drupal/site_config/user.role.editor.yml +++ /dev/null @@ -1,56 +0,0 @@ -langcode: en -status: true -dependencies: { } -id: editor -label: editor -weight: 3 -is_admin: null -permissions: - - 'access comments' - - 'access content overview' - - 'access draggableviews' - - 'access toolbar' - - 'administer comments' - - 'administer menu' - - 'administer nodes' - - 'administer url aliases' - - 'bypass protected submissions validation' - - 'create article content' - - 'create event content' - - 'create page content' - - 'create service_alert content' - - 'create tutorial content' - - 'create url aliases' - - 'customize shortcut links' - - 'delete any article content' - - 'delete any event content' - - 'delete any page content' - - 'delete any service_alert content' - - 'delete any tutorial content' - - 'delete own article content' - - 'delete own event content' - - 'delete own page content' - - 'delete own service_alert content' - - 'delete own tutorial content' - - 'delete revisions' - - 'edit any article content' - - 'edit any event content' - - 'edit any page content' - - 'edit any service_alert content' - - 'edit any tutorial content' - - 'edit own article content' - - 'edit own comments' - - 'edit own event content' - - 'edit own page content' - - 'edit own service_alert content' - - 'edit own tutorial content' - - 'post comments' - - 'revert revisions' - - 'search content' - - 'translate content' - - 'translate interface' - - 'translate user-defined strings' - - 'use text format filtered_html' - - 'use text format full_html' - - 'view own unpublished content' - - 'view revisions' From 4b1aca895d98a1f6083f2b33c6ea457bde61a27b Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Mon, 9 Oct 2023 13:35:02 +0300 Subject: [PATCH 21/30] AV-2055: Clean up invalid permissions from publisher role --- drupal/site_config/user.role.publisher.yml | 24 ---------------------- 1 file changed, 24 deletions(-) diff --git a/drupal/site_config/user.role.publisher.yml b/drupal/site_config/user.role.publisher.yml index 8855f2e72b..c772d08d90 100644 --- a/drupal/site_config/user.role.publisher.yml +++ b/drupal/site_config/user.role.publisher.yml @@ -9,7 +9,6 @@ permissions: - 'access administration pages' - 'access comments' - 'access content overview' - - 'access draggableviews' - 'access shortcuts' - 'access taxonomy overview' - 'access toolbar' @@ -26,17 +25,13 @@ permissions: - 'administer url aliases' - 'administer user display' - 'administer user form display' - - 'bypass protected submissions validation' - 'create avoindata_article content' - 'create avoindata_event content' - 'create avoindata_guide_page content' - 'create avoindata_servicemessage content' - 'create content translations' - - 'create event content' - 'create page content' - - 'create service_alert content' - 'create terms in tags' - - 'create tutorial content' - 'create url aliases' - 'customize shortcut links' - 'delete any article content' @@ -44,53 +39,35 @@ permissions: - 'delete any avoindata_event content' - 'delete any avoindata_guide_page content' - 'delete any avoindata_servicemessage content' - - 'delete any event content' - 'delete any page content' - - 'delete any service_alert content' - - 'delete any tutorial content' - 'delete content translations' - 'delete own article content' - 'delete own avoindata_article content' - 'delete own avoindata_event content' - 'delete own avoindata_guide_page content' - 'delete own avoindata_servicemessage content' - - 'delete own event content' - 'delete own page content' - - 'delete own service_alert content' - - 'delete own tutorial content' - - 'delete revisions' - 'delete terms in tags' - 'edit any article content' - 'edit any avoindata_article content' - 'edit any avoindata_event content' - 'edit any avoindata_guide_page content' - 'edit any avoindata_servicemessage content' - - 'edit any event content' - 'edit any page content' - - 'edit any service_alert content' - - 'edit any tutorial content' - 'edit own article content' - 'edit own avoindata_article content' - 'edit own avoindata_event content' - 'edit own avoindata_guide_page content' - 'edit own avoindata_servicemessage content' - 'edit own comments' - - 'edit own event content' - 'edit own page content' - - 'edit own service_alert content' - - 'edit own tutorial content' - 'edit terms in tags' - 'post comments' - - 'revert revisions' - - 'search content' - 'translate avoindata_guide_page node' - - 'translate content' - 'translate interface' - 'translate page node' - - 'translate user-defined strings' - 'update content translations' - 'use text format basic_html' - - 'use text format filtered_html' - 'use text format full_html' - 'use text format restricted_html' - 'view article revisions' @@ -106,5 +83,4 @@ permissions: - 'view own unpublished content' - 'view page revisions' - 'view page unpublished content' - - 'view revisions' - 'view the administration theme' From 9c2fabe750b0dd9ca7fee9b0fba07a26314f2b48 Mon Sep 17 00:00:00 2001 From: YTP Bot Date: Mon, 9 Oct 2023 10:57:56 +0000 Subject: [PATCH 22/30] [skip ci] .env.template updated by new image tags --- docker/.env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/.env.template b/docker/.env.template index 71a206c878..12c95ec6a0 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -3,7 +3,7 @@ REGISTRY="" REPOSITORY="" # opendata images -CKAN_IMAGE_TAG="8dc72f94000aea3be4fb11962d7d7885380336ad" +CKAN_IMAGE_TAG="90ed839ddb171c828af411ea0f79bcf40e3441bc" DRUPAL_IMAGE_TAG="8dc72f94000aea3be4fb11962d7d7885380336ad" SOLR_IMAGE_TAG="acedaa3c1d35875178b6d104fe413bef0bbdd155" NGINX_IMAGE_TAG="cc823d149f1f80af4354a6f38973cec9fb994cc1" From 4fdb342843e6a0ea7caa393c9e896740f043f65c Mon Sep 17 00:00:00 2001 From: Teemu Erkkola Date: Mon, 9 Oct 2023 14:49:42 +0300 Subject: [PATCH 23/30] AV-1959: Fix secret name --- cdk/lib/send-to-zulip.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdk/lib/send-to-zulip.ts b/cdk/lib/send-to-zulip.ts index 9722e497ee..e95972369d 100644 --- a/cdk/lib/send-to-zulip.ts +++ b/cdk/lib/send-to-zulip.ts @@ -9,7 +9,7 @@ export class SendToZulip extends Construct { super(scope, id); // Task restart zulip reporting - const zulipSecret = sm.Secret.fromSecretNameV2(this, 'sZulipSecret', `${props.environment}_zulip_api_key`); + const zulipSecret = sm.Secret.fromSecretNameV2(this, 'sZulipSecret', `/${props.environment}/zulip_api_key`); this.lambda = new NodejsFunction(this, 'function', { environment: { From 86274bcb878c88cf14f7a495e4dc3ae5e81e6921 Mon Sep 17 00:00:00 2001 From: YTP Bot Date: Mon, 9 Oct 2023 12:35:27 +0000 Subject: [PATCH 24/30] [skip ci] .env.template updated by new image tags --- docker/.env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/.env.template b/docker/.env.template index 12c95ec6a0..cc47e248ff 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -3,7 +3,7 @@ REGISTRY="" REPOSITORY="" # opendata images -CKAN_IMAGE_TAG="90ed839ddb171c828af411ea0f79bcf40e3441bc" +CKAN_IMAGE_TAG="25b1c2a3aa2469cefa1804dd891f425490446731" DRUPAL_IMAGE_TAG="8dc72f94000aea3be4fb11962d7d7885380336ad" SOLR_IMAGE_TAG="acedaa3c1d35875178b6d104fe413bef0bbdd155" NGINX_IMAGE_TAG="cc823d149f1f80af4354a6f38973cec9fb994cc1" From 13a7508324b639b45dd80ff0af648cd1be404099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Mon, 9 Oct 2023 20:09:44 +0200 Subject: [PATCH 25/30] AV-2017: Cleanup missed commented out code --- .../avoindataExternalLink.js | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js index 712b9b98d0..15bd8baeeb 100644 --- a/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js +++ b/drupal/modules/avoindata-ckeditor5-plugins/src/avoindataExternalLink/avoindataExternalLink.js @@ -64,48 +64,6 @@ export default class AvoindataExternalLink extends Plugin { } }); }); - /* - const editor = this.editor; - - // `listenTo()` and `editor` are available thanks to `Plugin`. - // By using `listenTo()` you will ensure that the listener is removed when - // the plugin is destroyed. - this.listenTo(editor.data, 'ready', () => { - const linkCommand = editor.commands.get('link'); - const { selection } = editor.model.document; - - let linkCommandExecuting = false; - - linkCommand.on('execute', (evt, args) => { - const linkIsExternal = args[1]['linkIsExternal'] - - if (linkIsExternal) { - if (linkCommandExecuting) { - linkCommandExecuting = false; - return; - } - - // If the additional attribute was passed, we stop the default execution - // of the LinkCommand. We're going to create Model#change() block for undo - // and execute the LinkCommand together with setting the extra attribute. - evt.stop(); - - // Prevent infinite recursion by keeping records of when link command is - // being executed by this function. - linkCommandExecuting = true; - - // Wrapping the original command execution in a model.change() block to make sure there's a single undo step - // when the extra attribute is added. - - editor.model.change(writer => { - editor.execute('link', ...args); - const link = selection.getLastPosition().nodeBefore; - // writer.insertElement('avoindataExternalLink', selection.getLastPosition()) - }); - } - }) - }); - */ } static get pluginName() { From 926597a1ebab93abc6d631958b32a5aae21be315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eetu=20Mansikkam=C3=A4ki?= Date: Mon, 9 Oct 2023 20:11:39 +0200 Subject: [PATCH 26/30] AV-2017: Replace ckeditor4 with 5 as default editor --- .../install/editor.editor.full_html.yml | 98 ++++++++----------- .../site_config/editor.editor.ckeditor5.yml | 56 ----------- .../site_config/filter.format.ckeditor5.yml | 67 ------------- .../site_config/filter.format.full_html.yml | 53 +++++++--- 4 files changed, 82 insertions(+), 192 deletions(-) delete mode 100644 drupal/site_config/editor.editor.ckeditor5.yml delete mode 100644 drupal/site_config/filter.format.ckeditor5.yml diff --git a/drupal/modules/avoindata-theme/config/install/editor.editor.full_html.yml b/drupal/modules/avoindata-theme/config/install/editor.editor.full_html.yml index f6b90875e4..f21323f232 100644 --- a/drupal/modules/avoindata-theme/config/install/editor.editor.full_html.yml +++ b/drupal/modules/avoindata-theme/config/install/editor.editor.full_html.yml @@ -4,71 +4,53 @@ dependencies: config: - filter.format.full_html module: - - ckeditor + - ckeditor5 format: full_html -editor: ckeditor +editor: ckeditor5 settings: toolbar: - rows: - - - - - name: Formatting - items: - - Bold - - Italic - - Strike - - Superscript - - Subscript - - '-' - - RemoveFormat - - - name: Linking - items: - - DrupalLink - - DrupalUnlink - - - name: Lists - items: - - BulletedList - - NumberedList - - - name: Media - items: - - Blockquote - - DrupalImage - - Table - - HorizontalRule - - ImceLink - - ImceImage - - - name: 'Block Formatting' - items: - - Format - - - name: Tools - items: - - Styles - - ShowBlocks - - Source - - - name: 'Avoindata elements' - items: - - avoindata_expander - - avoindata_note - - avoindata_hint - - avoindata_example - - avoindata_external-link - - avoindata_section + items: + - bold + - italic + - strikethrough + - superscript + - subscript + - removeFormat + - '|' + - undo + - redo + - '|' + - link + - bulletedList + - numberedList + - '|' + - blockQuote + - drupalInsertImage + - insertTable + - horizontalLine + - imce_link + - imce_image + - '|' + - sourceEditing + - '-' + - avoindataExpander + - avoindataNote + - avoindataHint + - avoindataExample + - avoindataSection plugins: - stylescombo: - styles: 'table.table.table-responsive|Responsive table' - language: - language_list: un + ckeditor5_sourceEditing: + allowed_tags: { } + ckeditor5_list: + reversed: true + startIndex: true + ckeditor5_imageResize: + allow_resize: true image_upload: status: true scheme: public directory: inline-images max_size: '' max_dimensions: - width: null - height: null + width: 0 + height: 0 diff --git a/drupal/site_config/editor.editor.ckeditor5.yml b/drupal/site_config/editor.editor.ckeditor5.yml deleted file mode 100644 index 5078d6c540..0000000000 --- a/drupal/site_config/editor.editor.ckeditor5.yml +++ /dev/null @@ -1,56 +0,0 @@ -langcode: fi -status: true -dependencies: - config: - - filter.format.ckeditor5 - module: - - ckeditor5 -format: ckeditor5 -editor: ckeditor5 -settings: - toolbar: - items: - - bold - - italic - - strikethrough - - superscript - - subscript - - removeFormat - - '|' - - undo - - redo - - '|' - - link - - bulletedList - - numberedList - - '|' - - blockQuote - - drupalInsertImage - - insertTable - - horizontalLine - - imce_link - - imce_image - - '|' - - sourceEditing - - '-' - - avoindataExpander - - avoindataNote - - avoindataHint - - avoindataExample - - avoindataSection - plugins: - ckeditor5_sourceEditing: - allowed_tags: { } - ckeditor5_list: - reversed: true - startIndex: true - ckeditor5_imageResize: - allow_resize: true -image_upload: - status: true - scheme: public - directory: inline-images - max_size: '' - max_dimensions: - width: 0 - height: 0 diff --git a/drupal/site_config/filter.format.ckeditor5.yml b/drupal/site_config/filter.format.ckeditor5.yml deleted file mode 100644 index 48abd1547a..0000000000 --- a/drupal/site_config/filter.format.ckeditor5.yml +++ /dev/null @@ -1,67 +0,0 @@ -langcode: fi -status: true -dependencies: - module: - - editor -name: CKEditor5 -format: ckeditor5 -weight: -10 -filters: - filter_url: - id: filter_url - provider: filter - status: false - weight: -45 - settings: - filter_url_length: 72 - filter_html: - id: filter_html - provider: filter - status: false - weight: -50 - settings: - allowed_html: '' - filter_html_help: true - filter_html_nofollow: false - editor_file_reference: - id: editor_file_reference - provider: editor - status: true - weight: -42 - settings: { } - filter_align: - id: filter_align - provider: filter - status: true - weight: -48 - settings: { } - filter_caption: - id: filter_caption - provider: filter - status: true - weight: -46 - settings: { } - filter_htmlcorrector: - id: filter_htmlcorrector - provider: filter - status: true - weight: -43 - settings: { } - filter_html_image_secure: - id: filter_html_image_secure - provider: filter - status: false - weight: -44 - settings: { } - filter_html_escape: - id: filter_html_escape - provider: filter - status: false - weight: -49 - settings: { } - filter_autop: - id: filter_autop - provider: filter - status: false - weight: -47 - settings: { } diff --git a/drupal/site_config/filter.format.full_html.yml b/drupal/site_config/filter.format.full_html.yml index c38bca58cc..0794ab471f 100644 --- a/drupal/site_config/filter.format.full_html.yml +++ b/drupal/site_config/filter.format.full_html.yml @@ -1,36 +1,67 @@ -uuid: f3fa6205-6e90-4588-80af-fcc113eb01ba langcode: fi status: true dependencies: module: - editor -_core: - default_config_hash: WNeK5FbcY8pXgEpbD_KgRzlF1-5PL3BJXwqaBctPTqw name: 'Full HTML' format: full_html weight: -10 filters: + filter_url: + id: filter_url + provider: filter + status: false + weight: -45 + settings: + filter_url_length: 72 + filter_html: + id: filter_html + provider: filter + status: false + weight: -50 + settings: + allowed_html: '' + filter_html_help: true + filter_html_nofollow: false + editor_file_reference: + id: editor_file_reference + provider: editor + status: true + weight: -42 + settings: { } filter_align: id: filter_align provider: filter status: true - weight: 8 + weight: -48 settings: { } filter_caption: id: filter_caption provider: filter status: true - weight: 9 + weight: -46 settings: { } filter_htmlcorrector: id: filter_htmlcorrector provider: filter status: true - weight: 10 + weight: -43 settings: { } - editor_file_reference: - id: editor_file_reference - provider: editor - status: true - weight: 11 + filter_html_image_secure: + id: filter_html_image_secure + provider: filter + status: false + weight: -44 + settings: { } + filter_html_escape: + id: filter_html_escape + provider: filter + status: false + weight: -49 + settings: { } + filter_autop: + id: filter_autop + provider: filter + status: false + weight: -47 settings: { } From cc7bcbd8b862f834feeca7a4f83c5eb7af6551df Mon Sep 17 00:00:00 2001 From: YTP Bot Date: Mon, 9 Oct 2023 20:06:03 +0000 Subject: [PATCH 27/30] [skip ci] .env.template updated by new image tags --- docker/.env.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/.env.template b/docker/.env.template index cc47e248ff..16f47a19dd 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -3,8 +3,8 @@ REGISTRY="" REPOSITORY="" # opendata images -CKAN_IMAGE_TAG="25b1c2a3aa2469cefa1804dd891f425490446731" -DRUPAL_IMAGE_TAG="8dc72f94000aea3be4fb11962d7d7885380336ad" +CKAN_IMAGE_TAG="dea73d1b66e194ccd535709e99d6753f31faa320" +DRUPAL_IMAGE_TAG="dea73d1b66e194ccd535709e99d6753f31faa320" SOLR_IMAGE_TAG="acedaa3c1d35875178b6d104fe413bef0bbdd155" NGINX_IMAGE_TAG="cc823d149f1f80af4354a6f38973cec9fb994cc1" DATAPUSHER_IMAGE_TAG="37245d2426ed6218a7352115d4147139defc9d8e" From 8a72fa4738f0bb47f28df99858e91155f109601c Mon Sep 17 00:00:00 2001 From: YTP Bot Date: Tue, 10 Oct 2023 07:21:39 +0000 Subject: [PATCH 28/30] [skip ci] .env.template updated by new image tags --- docker/.env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/.env.template b/docker/.env.template index abb1412673..aac638b9dd 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -4,7 +4,7 @@ REPOSITORY="" # opendata images CKAN_IMAGE_TAG="dea73d1b66e194ccd535709e99d6753f31faa320" -DRUPAL_IMAGE_TAG="dea73d1b66e194ccd535709e99d6753f31faa320" +DRUPAL_IMAGE_TAG="52fab2f9b6753ba17521d4ee2abe0d2ee07f4214" SOLR_IMAGE_TAG="acedaa3c1d35875178b6d104fe413bef0bbdd155" NGINX_IMAGE_TAG="cc823d149f1f80af4354a6f38973cec9fb994cc1" DATAPUSHER_IMAGE_TAG="37245d2426ed6218a7352115d4147139defc9d8e" From 05a37d119360ab5df7b6e55e6c274f9ef72c550d Mon Sep 17 00:00:00 2001 From: Jari Voutilainen Date: Tue, 10 Oct 2023 11:22:51 +0300 Subject: [PATCH 29/30] AV-2055: Delete leftover role actions which prevent updating existing old environments --- drupal/scripts/init_drupal.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drupal/scripts/init_drupal.sh b/drupal/scripts/init_drupal.sh index f2101f0fce..c704e94f3d 100644 --- a/drupal/scripts/init_drupal.sh +++ b/drupal/scripts/init_drupal.sh @@ -88,6 +88,9 @@ drush config:delete core.entity_view_display.node.page.teaser drush config:delete field.field.node.page.field_basic_page_comments || true drush config:delete field.storage.node.field_basic_page_comments || true drush config:delete user.role.editor || true +drush config:delete system.action.user_add_role_action.editor || true +drush config:delete system.action.user_remove_role_action.editor || true + # uninstall modules From b59723fcbf67a76cb06c36c548d4e6e02d47d8a0 Mon Sep 17 00:00:00 2001 From: YTP Bot Date: Tue, 10 Oct 2023 09:26:03 +0000 Subject: [PATCH 30/30] [skip ci] .env.template updated by new image tags --- docker/.env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/.env.template b/docker/.env.template index aac638b9dd..58ba12257f 100644 --- a/docker/.env.template +++ b/docker/.env.template @@ -4,7 +4,7 @@ REPOSITORY="" # opendata images CKAN_IMAGE_TAG="dea73d1b66e194ccd535709e99d6753f31faa320" -DRUPAL_IMAGE_TAG="52fab2f9b6753ba17521d4ee2abe0d2ee07f4214" +DRUPAL_IMAGE_TAG="95386bfb4bd93d3d5506827f91dace1a2ab03088" SOLR_IMAGE_TAG="acedaa3c1d35875178b6d104fe413bef0bbdd155" NGINX_IMAGE_TAG="cc823d149f1f80af4354a6f38973cec9fb994cc1" DATAPUSHER_IMAGE_TAG="37245d2426ed6218a7352115d4147139defc9d8e"