diff --git a/.env b/.env new file mode 100644 index 000000000..d5df24f48 --- /dev/null +++ b/.env @@ -0,0 +1,166 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# https://symfony.com/doc/current/configuration/secrets.html +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=5d7359397339ffc379bacf82cbcd07e5 +###< symfony/framework-bundle ### + +###> ibexa/oss ### +SEARCH_ENGINE=legacy +# Uncomment following line if you want to change the purge type. +# By default it will use `local` purge when running locally +# and `varnish` for Platform.sh installations. +# HTTPCACHE_PURGE_TYPE=local +HTTPCACHE_DEFAULT_TTL=86400 +HTTPCACHE_PURGE_SERVER=http://localhost:80 +HTTPCACHE_VARNISH_INVALIDATE_TOKEN= +# Uncomment following line if you want to enable translation-aware behavior for HTTP cache. +# HTTPCACHE_TRANSLATION_AWARE_ENABLED=true +TRUSTED_PROXIES=127.0.0.1 +CACHE_POOL=cache.tagaware.filesystem +# When using Redis or memcached adapter, you can configure it using DSN: +# - https://symfony.com/doc/4.4/components/cache/adapters/redis_adapter.html#configure-the-connection +# - https://symfony.com/doc/4.4/components/cache/adapters/memcached_adapter.html#configure-the-connection +CACHE_DSN=localhost +CACHE_NAMESPACE=ibexa +DATABASE_CHARSET=utf8mb4 +DATABASE_COLLATION=utf8mb4_unicode_520_ci +# Needed by Doctrine Bundle / ORM to prevent it from opening a connection during situations where there is no service yet. +# See: https://symfony.com/doc/current/reference/configuration/doctrine.html#doctrine-dbal-configuration +DATABASE_VERSION=mariadb-10.3.0 +SESSION_HANDLER_ID=session.handler.native_file +SESSION_SAVE_PATH=%kernel.project_dir%/var/sessions/%kernel.environment% +SOLR_DSN=http://localhost:8983/solr +SOLR_CORE=collection1 +IBEXA_EDITION=oss +###< ibexa/oss ### + +###> ibexa/content ### +SEARCH_ENGINE=legacy +# Uncomment following line if you want to change the purge type. +# By default it will use `local` purge when running locally +# and `varnish` for Platform.sh installations. +# HTTPCACHE_PURGE_TYPE=local +HTTPCACHE_DEFAULT_TTL=86400 +HTTPCACHE_PURGE_SERVER=http://localhost:80 +HTTPCACHE_VARNISH_INVALIDATE_TOKEN= +# Uncomment following line if you want to enable translation-aware behavior for HTTP cache. +# HTTPCACHE_TRANSLATION_AWARE_ENABLED=true +TRUSTED_PROXIES=127.0.0.1 +CACHE_POOL=cache.tagaware.filesystem +# When using Redis or memcached adapter, you can configure it using DSN: +# - https://symfony.com/doc/4.4/components/cache/adapters/redis_adapter.html#configure-the-connection +# - https://symfony.com/doc/4.4/components/cache/adapters/memcached_adapter.html#configure-the-connection +CACHE_DSN=localhost +CACHE_NAMESPACE=ezp +DATABASE_CHARSET=utf8mb4 +DATABASE_COLLATION=utf8mb4_unicode_520_ci +# Needed by Doctrine Bundle / ORM to prevent it from opening a connection during situations where there is no service yet. +# See: https://symfony.com/doc/current/reference/configuration/doctrine.html#doctrine-dbal-configuration +DATABASE_VERSION=mariadb-10.3.0 +SESSION_HANDLER_ID=session.handler.native_file +SESSION_SAVE_PATH=%kernel.project_dir%/var/sessions/%kernel.environment% +SOLR_DSN=http://localhost:8983/solr +SOLR_CORE=collection1 +# Enable Personalization by setting valid id, key and uri +PERSONALIZATION_CUSTOMER_ID=0 +PERSONALIZATION_LICENSE_KEY= +PERSONALIZATION_HOST_URI= +ELASTICSEARCH_DSN=http://localhost:9200 +# Enable fastly by setting valid service_id and key +# In order for this to work you also need to have EzSystemsPlatformFastlyCacheBundle installed +# FASTLY_SERVICE_ID="" +# FASTLY_KEY="" +IBEXA_EDITION=content +IBEXA_VARIATION_HANDLER_IDENTIFIER=alias +###< ibexa/content ### + +###> ibexa/experience ### +SEARCH_ENGINE=legacy +# Uncomment following line if you want to change the purge type. +# By default it will use `local` purge when running locally +# and `varnish` for Platform.sh installations. +# HTTPCACHE_PURGE_TYPE=local +HTTPCACHE_DEFAULT_TTL=86400 +HTTPCACHE_PURGE_SERVER=http://localhost:80 +HTTPCACHE_VARNISH_INVALIDATE_TOKEN= +# Uncomment following line if you want to enable translation-aware behavior for HTTP cache. +# HTTPCACHE_TRANSLATION_AWARE_ENABLED=true +TRUSTED_PROXIES=127.0.0.1 +CACHE_POOL=cache.tagaware.filesystem +# When using Redis or memcached adapter, you can configure it using DSN: +# - https://symfony.com/doc/4.4/components/cache/adapters/redis_adapter.html#configure-the-connection +# - https://symfony.com/doc/4.4/components/cache/adapters/memcached_adapter.html#configure-the-connection +CACHE_DSN=localhost +CACHE_NAMESPACE=ezp +DATABASE_CHARSET=utf8mb4 +DATABASE_COLLATION=utf8mb4_unicode_520_ci +# Needed by Doctrine Bundle / ORM to prevent it from opening a connection during situations where there is no service yet. +# See: https://symfony.com/doc/current/reference/configuration/doctrine.html#doctrine-dbal-configuration +DATABASE_VERSION=mariadb-10.3.0 +SESSION_HANDLER_ID=session.handler.native_file +SESSION_SAVE_PATH=%kernel.project_dir%/var/sessions/%kernel.environment% +SOLR_DSN=http://localhost:8983/solr +SOLR_CORE=collection1 +# Enable Personalization by setting valid id, key and uri +PERSONALIZATION_CUSTOMER_ID=0 +PERSONALIZATION_LICENSE_KEY= +PERSONALIZATION_HOST_URI= +ELASTICSEARCH_DSN=http://localhost:9200 +# Enable fastly by setting valid service_id and key +# In order for this to work you also need to have EzSystemsPlatformFastlyCacheBundle installed +# FASTLY_SERVICE_ID="" +# FASTLY_KEY="" +IBEXA_EDITION=experience +# Default LOCK_DSN value (semaphore) makes project require additional 'sysvsem' PHP extension. +# If you have that extension feel free to reconfigure this env value back to 'semaphore'. +# 'flock' is safe replacement and is backward compatible. Required by Symfony Rate Limiter. +IBEXA_LOCK_DSN=flock +IBEXA_VARIATION_HANDLER_IDENTIFIER=alias +###< ibexa/experience ### + +###> nelmio/cors-bundle ### +CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$' +###< nelmio/cors-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +# +# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" +# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8&charset=utf8mb4" +DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8" +###< doctrine/doctrine-bundle ### + +###> lexik/jwt-authentication-bundle ### +JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem +JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem +JWT_PASSPHRASE=c2998c0c11144e0b4757d2fc2870e1dd150f62461182c84fd44e34215fe21444 +###< lexik/jwt-authentication-bundle ### + +###> symfony/lock ### +# Choose one of the stores below +# postgresql+advisory://db_user:db_password@localhost/db_name +LOCK_DSN=flock +###< symfony/lock ### + +###> symfony/swiftmailer-bundle ### +# For Gmail as a transport, use: "gmail://username:password@localhost" +# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" +# Delivery is disabled by default via "null://localhost" +MAILER_URL=null://localhost +###< symfony/swiftmailer-bundle ### diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..50036ad15 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,15 @@ +| Question | Answer +| ---------------------------------------- | ------------------ +| **JIRA issue** | EZP-XXXXX +| **Type** | feature/bug/improvement +| **Target Ibexa version** | `v3.x` - please update `x` accordingly +| **BC breaks** | yes/no +| **Doc needed** | yes/no + + + +#### Checklist: +- [ ] Provided PR description. +- [ ] Tested the solution manually. +- [ ] Checked that target branch is set correctly. +- [ ] Asked for a review (ping `@ibexa/engineering`). diff --git a/.gitignore.dist b/.gitignore.dist new file mode 100644 index 000000000..866dcced5 --- /dev/null +++ b/.gitignore.dist @@ -0,0 +1,25 @@ + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> liip/imagine-bundle ### +/public/media/cache/ +###< liip/imagine-bundle ### + +###> lexik/jwt-authentication-bundle ### +/config/jwt/*.pem +###< lexik/jwt-authentication-bundle ### + +###> symfony/webpack-encore-bundle ### +/node_modules/ +/public/build/ +npm-debug.log +yarn-error.log +###< symfony/webpack-encore-bundle ### diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..3beeadf2c --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14.18.3 \ No newline at end of file diff --git a/.platform.app.yaml b/.platform.app.yaml new file mode 100644 index 000000000..7439b5072 --- /dev/null +++ b/.platform.app.yaml @@ -0,0 +1,250 @@ +# This file describes an application. You can have multiple applications +# in the same project. + +# Please see https://doc.ibexa.co/en/latest/getting_started/install_on_ibexa_cloud/ for Ibexa DXP specific getting started instructions. +# Full documentation: https://docs.platform.sh +# Ibexa DXP requirements: https://doc.ibexa.co/en/latest/getting_started/requirements/#ibexa-cloud-requirements-and-setup + +# The name of this app. Must be unique within a project. +name: app + +dependencies: + nodejs: + yarn: "*" + n: "*" + php: + composer/composer: '^2.0' + +# The type of the application to build. +type: php:8.1 + +build: + # "none" means we're running composer manually, see build hook + # We currently need to do this to install newer version of Node.js + flavor: "none" + +# The relationships of the application with services or other applications. +# The left-hand side is the name of the relationship as it will be exposed +# to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand +# side is in the form `:`. +relationships: + database: 'mysqldb:user' + # Uncomment if you want to store dfs tables in a separate database: + #dfs_database: 'mysqldb:dfs' + rediscache: 'rediscache:redis' + # [Recommended] To have an isolated and persisted Redis instance for sessions, uncomment + # this relationship and the corresponding service in .platform/services.yaml + #redissession: 'redissession:redis' + # If you wish to use solr, uncomment this relationship and the corresponding service in .platform/services.yaml + #solr: 'solrsearch:collection1' + # If you wish to use elasticsearch, uncomment this relationship and the corresponding service in .platform/services.yaml + #elasticsearch: 'elasticsearch:elasticsearch' + +variables: + php: + # Example of setting php.ini config + #"display_errors": "On" + memory_limit: 512M + # The default OPcache configuration is not suited for Symfony applications + opcache.memory_consumption: 256 + opcache.max_accelerated_files: 20000 + # We recommend enabling the following opcache.validate_timestamps setting in production, but then opcache_reset() must be called every time you clear symfony cache. + #opcache.validate_timestamps: 0 + + # Applications that open many PHP files, such as Symfony projects, should use at least these values + realpath_cache_size: 4096K + realpath_cache_ttl: 600 + env: + # Location for N to store node versions + N_PREFIX: /app/.global + # We disable Symfony Proxy (CacheKernel), as we rather use Varnish + APP_HTTP_CACHE: 0 + # Warning: Only for Varnish on Platform.sh to workaround missing IP. Disable if you use Fastly or Symfony Proxy where this would be a security issue! + TRUSTED_PROXIES: "REMOTE_ADDR" + # Change this if you use a different env than "prod" + # If you change to "dev" remove "--no-dev" from the `composer install` command. + APP_ENV: prod + # Uncomment if you want to use DFS clustering: + # NOTE: Recommended on PE Dedicated cluster setup. Required if using Legacy Bridge on PE dedicated cluster setup. + #PLATFORMSH_DFS_NFS_PATH: 'dfsdata' + +# The configuration of app when it is exposed to the web. +web: + locations: + "/": + # The public directory of the app, relative to its root. + root: "public" + # The front-controller script to send non-static requests to. + passthru: "/index.php" + # The number of seconds whitelisted (static) content should be cache + expires: 600 + # Deny by default, allow in rules below as necessary + allow: false + rules: + # This appears redundant, but looks can be deceiving. + # Disable .php(3) and other executable extensions in the var directory + '^/var/.*(?i)\.(php3?|phar|phtml|sh|exe|pl|bin)$': + allow: false + # Serve storage/images|images-versioned directly + '^/var/([^/]+/)?storage/images(-versioned)?/.*': + allow: true + '^/favicon\.ico': + allow: true + '^/robots\.txt': + allow: true + '^/bundles/': + allow: true + '^/assets/': + allow: true + '^/build/': + allow: true + # Comment this if in "dev" mode + '^/(css|js|fonts?)/.*\.(css|js|otf|eot|ttf|svg|woff)': + allow: true + +# The size of the persistent disk of the application (in MB). +disk: 3072 + +# The mounts that will be performed when the package is deployed. +mounts: + # PE Cluster Note: By default will set all to shared, so if moving to PE dedicated cluster you should ask platform.sh + # Support to make sure at least cache + logs are local, while you can let public/var be shared if you prefer that over DFS. + 'var/cache': + source: local + source_path: cache + 'var/log': + source: local + source_path: log + # [PE Cluster] For cluster it's recommended to rather use a performant shared session storage like Redis/Memcached. + 'var/sessions': + source: local + source_path: sessions + 'var/encore': + source: local + source_path: encore + 'public/var': + source: local + source_path: var + 'src/Migrations/Ibexa': + source: local + source_path: migrations + 'config/graphql/types/ibexa': + source: local + source_path: graphql_types +# Uncomment if you need to use Kaliop Migrations on your setup and not able to get it to write to "var" dir. +# 'src/AppBundle/MigrationVersions/References': +# source: local +# source_path: MigrationVersionsReferences +# Uncomment if you want to use DFS clustering, required if using Legacy Bridge on PE dedicated cluster setup. +# 'dfsdata': +# # Platform.sh Staff: This MUST be shared on cluster, all others SHOULD be local for performance reasons +# source: local +# source_path: dfsdata + +# The hooks that will be performed when the package is deployed. +hooks: + # Build hook, done before connected to services, disk is still writable here + build: | + set -e + + # Install the version specified in the .nvmrc file + # but only if N command exists + hash n && n auto + + # Reset the location hash to recognize the newly installed version + hash -r + + if [ -z "$COMPOSER_AUTH" ]; then + echo "TIP: If you need to authenticate against Github/Gitlab/updates.ibexa.co, use COMPOSER_AUTH env variable" + echo "See: https://docs.platform.sh/guides/general/composer-auth.html#set-the-envcomposer_auth-project-variable" + fi + + composer install --no-dev --prefer-dist --no-progress --no-interaction --optimize-autoloader + + # Deploy hook, access to services & done once (per cluster, not per node), only mounts are writable at this point + # Note: Http traffic is paused while this is running, so for prod code this should finish as fast as possible, < 30s + deploy: | + set -e + + if [ ! -f public/var/.platform.installed ]; then + # Configure ElasticSearch mappings + ##php bin/console ibexa:elasticsearch:put-index-template + + # To workaround issues with p.sh Varnish we clear container cache & temporary set Symfony Proxy + export SKIP_HTTPCACHE_PURGE="1" + rm -Rf var/cache/$APP_ENV/* + php bin/console cache:pool:clear cache.redis + sh bin/platformsh_prestart_cacheclear.sh + SKIP_HTTPCACHE_PURGE="1" php -d memory_limit=-1 bin/console ibexa:install + unset SKIP_HTTPCACHE_PURGE + php bin/console ibexa:graphql:generate-schema + + touch public/var/.platform.installed + fi + + # Now that mounts are available, clear cache on mount. + # Note: Skip on PE Cluster setup using e.g. "if [$PLATFORM_BRANCH" != 'production']; then" & get p.sh to enable this on internal per node "pre_start" hook + sh bin/platformsh_prestart_cacheclear.sh + + # If you also need to clear Redis cache on every deploy, you can either use this command or redis-cli + # Normally this should only be needed if cached data structures changes (upgrades), or you change data via sql (e.g. restore backup) + ##php bin/console cache:pool:clear cache.redis + + # Example of additional deploy hooks if you use doctrine and/or kaliop migration bundle + ##php bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration + ##php bin/console kaliop:migration:migrate --no-interaction --no-debug + + # When using Solr / ElasticSearch, there are two cases where you'll need to rebuild indexes: + # - When Solr / ElasticSearch / search configuration changes + # - On database import/restore + # So in development it might be convenient to rebuild indexes, slowing down deploy time + ##php bin/console ibexa:reindex --processes=auto + + # When using Varnish/Fastly, HttpCache is not cleared when clearing Symfony Cache folder above, you need to + # clear cache yourself when for instance templates or config affecting responses change, for instance with: + ##bin/console fos:httpcache:invalidate:tag ez-all + # Depending on your VCL, buy default this would trigger a soft purge (expiry) and allow grace period, however + # even so if your change only affected certain subset of content, ideally you should only clear specific tags: + ##bin/console fos:httpcache:invalidate:tag l44 c33 ct2 ... + + # It is possible to manipulate your Fastly VCL configuration directly from command line using Fastly CLI. + # Official documentation on how to install: https://developer.fastly.com/learning/tools/cli#installing + # Example VCL snippet upload using vcl_recv hook (remember about FASTLY_SERVICE_ID and FASTLY_KEY environmental variables): + ##fastly vcl custom create --name="Ibexa VCL" --main --version=latest --autoclone --content=vendor/ibexa/fastly/fastly/ez_main.vcl + ##fastly vcl snippet create --name="Shielding" --version=active --autoclone --type recv --content=vendor/ibexa/fastly/fastly/snippet_re_enable_shielding.vcl + + # Post deploy hook, like deploy but after being deployed and live, for deploy tasks we can do asynchronously + # Tip: As this is running while web is running, and it's async, avoid doing anything like cache clearing that affects web requests here. + #post_deploy: | + # set -e + +# The configuration of scheduled execution. +# see https://docs.platform.sh/configuration/app/cron.html#cron-jobs +# +# Tip: Crons work like on traditional dedicated servers, they share resources with web, so: +# - For long runing heavy operations, consider using background "workers" with event queuing. +# - To disable certain features during a cronjob, you can usually do it with env variable or php variable, example: "php -d newrelic.enabled=false bin/console my:import" +crons: + frequent: + # NOTE: The minimum interval between cron runs is 5 minutes, even if specified as less. + # Except for PE. There crons can be run every minute. + # So if you are not on PE please change specs to "*/5 * * * *" to avoid warning on each deploy. + spec: "* * * * *" + cmd: "php bin/console ibexa:cron:run" + weekly: + spec: "0 0 * * 0" + cmd: "php bin/console ibexa:check-urls --quiet" + +runtime: + extensions: + - xsl + - imagick + - readline + - redis + - igbinary + - sodium + #- apcu + #- name: 'blackfire' + # configuration: + # server_id: 'xxxx-xxx-xxx-xxx-xxxx' + # server_token: 'xxxx' diff --git a/.platform/routes.yaml b/.platform/routes.yaml new file mode 100644 index 000000000..1525d9283 --- /dev/null +++ b/.platform/routes.yaml @@ -0,0 +1,11 @@ +"https://{default}/": + type: upstream + upstream: "varnish:http" + cache: + # As this does not support Vary, and purging, we can't use this as Sf Proxy drop in. + # However it is possible to enable this for anonymous traffic when backend sends expiry headers. + enabled: false + +"https://www.{default}/": + type: redirect + to: "https://{default}/" diff --git a/.platform/services.yaml b/.platform/services.yaml new file mode 100644 index 000000000..2cf8be09e --- /dev/null +++ b/.platform/services.yaml @@ -0,0 +1,87 @@ +# Default settings in order to set up Ibexa DXP installation on Ibexa Cloud dev instances +# +# Note: Like on own servers, make sure to tune Redis/Solr/Varnish/MySQL memory/disk size for your installation to avoid issues. +# Reach out to platform.sh support to get help on this and insight into your disk/memory usage. + +mysqldb: + type: mariadb:10.4 + disk: 1024 + configuration: + schemas: + - main + # Uncomment if you want to store dfs tables in a separate database: + #- dfs + endpoints: + user: + default_schema: main + privileges: + main: admin + # Uncomment if you want to store dfs tables in a separate database: + #dfs: + # default_schema: dfs + # privileges: + # dfs: admin + +# For use by Symfony Cache (used by Ibexa DXP SPI Persistence Cache) +rediscache: + type: 'redis:5.0' + # For cache you might need to increase the size of your plan if your installation has a sizeable amount of content. + # Check with platform.sh staff if in doubt on this, and if it would make sense to configure larger redis size here. + # size: L + configuration: + # Note: If using RedisTagAwareAdapter it requires one of the 'volatile-*' eviction policies + # https://docs.platform.sh/configuration/services/redis.html#eviction-policy + # https://doc.ezplatform.com/en/latest/getting_started/requirements/ + maxmemory_policy: volatile-lru + +# If you wish to have a separate Redis instance for sessions, uncomment +# this service and the corresponding relationship in .platform.app.yaml. +#redissession: +# type: 'redis:5.0' +# configuration: +# maxmemory_policy: allkeys-lru +# +# Alternatively if you have a requirement that sessions are persisted across server/redis restarts, +# have storage space to spare for this, and don't mind a bit slower instance type of redis +#redissession: +# type: redis-persistent:5.0 +# Disk size should be bigger than Redis' "maxmemory" setting due to https://redis.io/topics/persistence#log-rewriting. +# The memory given to Redis depends on your plan and "size: ". Adjust "disk: " accordingly. +# disk: 512 +# configuration: +# maxmemory_policy: allkeys-lru + +# If you wish to use solr, uncomment this service and the corresponding relationship in .platform.app.yaml. +# Also, you need to generate the config using: +# vendor/ezsystems/ezplatform-solr-search-engine/bin/generate-solr-config.sh +# Multi core setup is currently not supported on Platform.sh. Sharding does not work as the cores are +# unable to reach each other +#solrsearch: +# type: solr:7.7 +# disk: 512 +# configuration: +# configsets: +# mainconfig: !archive "configsets/solr6" +# cores: +# collection1: +# core_properties: | +# configSet=mainconfig +# schema=schema.xml +# endpoints: +# collection1: +# core: collection1 + +# If you wish to use elasticsearch, uncomment this service and the corresponding relationship in .platform.app.yaml. +#elasticsearch: +# type: elasticsearch:7.7 +# disk: 512 + +# Due to logic in Ibexa\Bundle\Core\DependencyInjection\IbexaCoreExtension, do not change the service name to something different from 'varnish' +varnish: + type: 'varnish:6.0' + relationships: + app: "app:http" + configuration: + vcl: !include + type: string + path: varnish.vcl diff --git a/.platform/varnish.vcl b/.platform/varnish.vcl new file mode 100644 index 000000000..36a571da3 --- /dev/null +++ b/.platform/varnish.vcl @@ -0,0 +1,341 @@ +// Varnish VCL for Platform.sh with: +// - Varnish 6.0 or higher (6.0LTS recommended, and is what we mainly test against) +// - Varnish xkey vmod (via varnish-modules package 0.10.2 or higher, or via Varnish Plus) +// - eZ Platform 3.x or higher with ezplatform-http-cache (this) bundle +// + +// Not applicable on Platform.sh: +//vcl 4.0; +//import std; +import xkey; + +// Includes not available on Platform.sh, so inlining parameters.vlc: +acl invalidators { + "127.0.0.1"; + "192.168.0.0"/16; +} + +// ACL for debuggers IP +acl debuggers { + "127.0.0.1"; + "192.168.0.0"/16; +} + +// Called at the beginning of a request, after the complete request has been received +sub vcl_recv { + + // Set the backend + //set req.backend_hint = ezplatform; + // Platform.sh specific: + set req.backend_hint = app.backend(); + + // Add a Surrogate-Capability header to announce ESI support. + set req.http.Surrogate-Capability = "abc=ESI/1.0"; + + // Ensure that the Symfony Router generates URLs correctly with Varnish + if (req.http.X-Forwarded-Proto == "https" ) { + set req.http.X-Forwarded-Port = "443"; + } else { + set req.http.X-Forwarded-Port = "80"; + } + + // Trigger cache purge if needed + call ez_purge; + + // Don't cache requests other than GET and HEAD. + if (req.method != "GET" && req.method != "HEAD") { + return (pass); + } + + // Don't cache Authenticate & Authorization + // You may remove this when using REST API with basic auth. + if (req.http.Authenticate || req.http.Authorization) { + if (client.ip ~ debuggers) { + set req.http.X-Debug = "Not Cached according to configuration (Authorization)"; + } + return (hash); + } + + // Remove all cookies besides Session ID, as JS tracker cookies and so will make the responses effectively un-cached + if (req.http.cookie) { + set req.http.cookie = ";" + req.http.cookie; + set req.http.cookie = regsuball(req.http.cookie, "; +", ";"); + set req.http.cookie = regsuball(req.http.cookie, ";(eZSESSID[^=]*)=", "; \1="); + set req.http.cookie = regsuball(req.http.cookie, ";(ibexa-[^=]*)=", "; \1="); + set req.http.cookie = regsuball(req.http.cookie, ";[^ ][^;]*", ""); + set req.http.cookie = regsuball(req.http.cookie, "^[; ]+|[; ]+$", ""); + + if (req.http.cookie == "") { + // If there are no more cookies, remove the header to get page cached. + unset req.http.cookie; + } + } + + // Do a standard lookup on assets (these don't vary by user context hash) + // Note that file extension list below is not extensive, so consider completing it to fit your needs. + if (req.url ~ "\.(css|js|gif|jpe?g|bmp|png|tiff?|ico|img|tga|wmf|svg|swf|ico|mp3|mp4|m4a|ogg|mov|avi|wmv|zip|gz|pdf|ttf|eot|wof)$") { + return (hash); + } + + // Sort the query string for cache normalization. + set req.url = std.querysort(req.url); + + // Retrieve client user context hash and add it to the forwarded request. + call ez_user_context_hash; + + // If it passes all these tests, do a lookup anyway. + return (hash); +} + +// Called when a cache lookup is successful. The object being hit may be stale: It can have a zero or negative ttl with only grace or keep time left. +sub vcl_hit { + if (obj.ttl >= 0s) { + // A pure unadulterated hit, deliver it + return (deliver); + } + + if (obj.ttl + obj.grace > 0s) { + // Object is in grace, logic below in this block is what differs from default: + // https://varnish-cache.org/docs/5.2/users-guide/vcl-grace.html#grace-mode + if (!std.healthy(req.backend_hint)) { + // Service is unhealthy, deliver from cache + return (deliver); + } else if (req.http.cookie) { + // Request it by a user with session, refresh the cache to avoid issues for editors and forum users + return (miss); + } + + // By default deliver cache, automatically triggers a background fetch + return (deliver); + } + + // fetch & deliver once we get the result + return (miss); +} + +// Called when the requested object has been retrieved from the backend +sub vcl_backend_response { + + if (bereq.http.accept ~ "application/vnd.fos.user-context-hash" + && beresp.status >= 500 + ) { + return (abandon); + } + + // Check for ESI acknowledgement and remove Surrogate-Control header + if (beresp.http.Surrogate-Control ~ "ESI/1.0") { + unset beresp.http.Surrogate-Control; + set beresp.do_esi = true; + } + + // Make Varnish keep all objects for up to 1 hour beyond their TTL, see vcl_hit for Request logic on this + set beresp.grace = 1h; + + // Compressing the content + if (beresp.http.Content-Type ~ "application/javascript" + || beresp.http.Content-Type ~ "application/json" + || beresp.http.Content-Type ~ "application/vnd.ms-fontobject" + || beresp.http.Content-Type ~ "application/vnd.ibexa.api" + || beresp.http.Content-Type ~ "application/x-font-ttf" + || beresp.http.Content-Type ~ "image/svg+xml" + || beresp.http.Content-Type ~ "text/css" + || beresp.http.Content-Type ~ "text/plain" + ) { + set beresp.do_gzip = true; + } +} + +// Handle purge +// You may add FOSHttpCacheBundle tagging rules +// See http://foshttpcache.readthedocs.org/en/latest/varnish-configuration.html#id4 +sub ez_purge { + // Retrieve purge token, needs to be here due to restart, match for PURGE method done within + call ez_invalidate_token; + + # Adapted with acl from vendor/friendsofsymfony/http-cache/resources/config/varnish/fos_tags_xkey.vcl + if (req.method == "PURGEKEYS") { + call ez_purge_acl; + + # If neither of the headers are provided we return 400 to simplify detecting wrong configuration + if (!req.http.xkey-purge && !req.http.xkey-softpurge) { + return (synth(400, "Neither header XKey-Purge or XKey-SoftPurge set")); + } + + # Based on provided header invalidate (purge) and/or expire (softpurge) the tagged content + set req.http.n-gone = 0; + set req.http.n-softgone = 0; + if (req.http.xkey-purge) { + set req.http.n-gone = xkey.purge(req.http.xkey-purge); + } + + if (req.http.xkey-softpurge) { + set req.http.n-softgone = xkey.softpurge(req.http.xkey-softpurge); + } + + return (synth(200, "Purged "+req.http.n-gone+" objects, expired "+req.http.n-softgone+" objects")); + } + + # Adapted with acl from vendor/friendsofsymfony/http-cache/resources/config/varnish/fos_purge.vcl + if (req.method == "PURGE") { + call ez_purge_acl; + + return (purge); + } +} + +sub ez_purge_acl { + if (req.http.x-invalidate-token) { + if (req.http.x-invalidate-token != req.http.x-backend-invalidate-token) { + return (synth(405, "Method not allowed")); + } + } else if (!client.ip ~ invalidators) { + return (synth(405, "Method not allowed")); + } +} + +// Sub-routine to get client user context hash, used to for being able to vary page cache on user rights. +sub ez_user_context_hash { + + // Prevent tampering attacks on the hash mechanism + if (req.restarts == 0 + && (req.http.accept ~ "application/vnd.fos.user-context-hash" + || req.http.x-user-context-hash + ) + ) { + return (synth(400, "Bad Request")); + } + + if (req.restarts == 0 && (req.method == "GET" || req.method == "HEAD")) { + // Backup accept header, if set + if (req.http.accept) { + set req.http.x-fos-original-accept = req.http.accept; + } + set req.http.accept = "application/vnd.fos.user-context-hash"; + + // Backup original URL + set req.http.x-fos-original-url = req.url; + set req.url = "/_fos_user_context_hash"; + + // Force the lookup, the backend must tell not to cache or vary on all + // headers that are used to build the hash. + return (hash); + } + + // Rebuild the original request which now has the hash. + if (req.restarts > 0 + && req.http.accept == "application/vnd.fos.user-context-hash" + ) { + set req.url = req.http.x-fos-original-url; + unset req.http.x-fos-original-url; + if (req.http.x-fos-original-accept) { + set req.http.accept = req.http.x-fos-original-accept; + unset req.http.x-fos-original-accept; + } else { + // If accept header was not set in original request, remove the header here. + unset req.http.accept; + } + + // Force the lookup, the backend must tell not to cache or vary on the + // user context hash to properly separate cached data. + + return (hash); + } +} + +// Sub-routine to get invalidate token. +sub ez_invalidate_token { + // Prevent tampering attacks on the token mechanisms + if (req.restarts == 0 + && (req.http.accept ~ "application/vnd.ezplatform.invalidate-token" + || req.http.x-backend-invalidate-token + ) + ) { + return (synth(400, "Bad Request")); + } + + if (req.restarts == 0 && (req.method == "PURGE" || req.method == "PURGEKEYS") && req.http.x-invalidate-token) { + set req.http.accept = "application/vnd.ezplatform.invalidate-token"; + + // Backup original http properties + set req.http.x-fos-token-url = req.url; + set req.http.x-fos-token-method = req.method; + + set req.url = "/_ibexa_http_invalidatetoken"; + + // Force the lookup + return (hash); + } + + // Rebuild the original request which now has the invalidate token. + if (req.restarts > 0 + && req.http.accept == "application/vnd.ezplatform.invalidate-token" + ) { + set req.url = req.http.x-fos-token-url; + set req.method = req.http.x-fos-token-method; + unset req.http.x-fos-token-url; + unset req.http.x-fos-token-method; + unset req.http.accept; + } +} + +sub vcl_deliver { + // On receiving the invalidate token response, copy the invalidate token to the original + // request and restart. + if (req.restarts == 0 + && resp.http.content-type ~ "application/vnd.ezplatform.invalidate-token" + ) { + set req.http.x-backend-invalidate-token = resp.http.x-invalidate-token; + + return (restart); + } + + // On receiving the hash response, copy the hash header to the original + // request and restart. + if (req.restarts == 0 + && resp.http.content-type ~ "application/vnd.fos.user-context-hash" + ) { + set req.http.x-user-context-hash = resp.http.x-user-context-hash; + + return (restart); + } + + // If we get here, this is a real response that gets sent to the client. + + // Remove the vary on user context hash, this is nothing public. Keep all + // other vary headers. + if (resp.http.Vary ~ "X-User-Context-Hash") { + set resp.http.Vary = regsub(resp.http.Vary, "(?i),? *X-User-Context-Hash *", ""); + set resp.http.Vary = regsub(resp.http.Vary, "^, *", ""); + if (resp.http.Vary == "") { + unset resp.http.Vary; + } + + // If we vary by user hash, we'll also adjust the cache control headers going out by default to avoid sending + // large ttl meant for Varnish to shared proxies and such. We assume only session cookie is left after vcl_recv. + if (req.http.cookie) { + // When in session where we vary by user hash we by default avoid caching this in shared proxies & browsers + // For browser cache with it revalidating against varnish, use for instance "private, no-cache" instead + set resp.http.cache-control = "private, no-cache, no-store, must-revalidate"; + } else if (resp.http.cache-control ~ "public") { + // For non logged in users we allow caching on shared proxies (mobile network accelerators, planes, ...) + // But only for a short while, as there is no way to purge them + set resp.http.cache-control = "public, s-maxage=600, stale-while-revalidate=300, stale-if-error=300"; + } + } + + if (client.ip ~ debuggers) { + // Add X-Cache header if debugging is enabled + if (obj.hits > 0) { + set resp.http.X-Cache = "HIT"; + set resp.http.X-Cache-Hits = obj.hits; + set resp.http.X-Cache-TTL = obj.ttl; + } else { + set resp.http.X-Cache = "MISS"; + } + } else { + // Remove tag headers when delivering to non debug client + unset resp.http.xkey; + // Sanity check to prevent ever exposing the hash to a non debug client. + unset resp.http.x-user-context-hash; + } +} diff --git a/README.md b/README.md index a583d0c80..bc83d9e25 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,38 @@ -# Platform.sh templates -This repository contains templates for hosting Ibexa DXP on Platform.sh. -> WARNING: Do not use this repository for setting up local installations of Ibexa DXP. -Such installations are not supported. -Visit our official documentation to learn more about the supported way of starting Ibexa DXP projects. +# Ibexa Flex website skeleton -## COPYRIGHT +This is a Symfony Flex website skeleton allowing installation of all editions of +[Ibexa DXP](https://www.ibexa.co/products) and Ibexa Open Source. + +## Installation + +For installation instructions of Ibexa DXP see either +[the official documentation](https://doc.ibexa.co/) or packages for specific editions: +* [Ibexa Content](https://github.com/ibexa/content) +* [Ibexa Experience](https://github.com/ibexa/experience) +* [Ibexa Commerce](https://github.com/ibexa/commerce) + +Ibexa DXP is licensed under Ibexa Business Use License Agreement (Ibexa BUL) and requires +a subscription. Learn more about [Ibexa DXP](https://www.ibexa.co/products). +For installation instructions of Ibexa Open Source see [ibexa/oss](https://github.com/ibexa/oss) +package. + +## COPYRIGHT Copyright (C) 1999-2021 Ibexa AS (formerly eZ Systems AS). All rights reserved. ## LICENSE - This source code is available separately under the following licenses: A - Ibexa Business Use License Agreement (Ibexa BUL), -version 2.4 or later versions (as license terms may be updated from time to time) +version 2.3 or later versions (as license terms may be updated from time to time) Ibexa BUL is granted by having a valid Ibexa DXP (formerly eZ Platform Enterprise) subscription, as described at: https://www.ibexa.co/product For the full Ibexa BUL license text, please see: -- LICENSE-bul file placed in the root of this source code, or -- https://www.ibexa.co/software-information/licenses-and-agreements (latest version applies) +https://www.ibexa.co/software-information/licenses-and-agreements (latest version applies) AND -B - Ibexa Trial and Test License Agreement (Ibexa TTL), -version 2.2 or later versions (as license terms may be updated from time to time) -Trial can be granted by Ibexa, reach out to Ibexa AS for evaluation access: https://www.ibexa.co/about-ibexa/contact-us -For the full Ibexa TTL license text, please see: +B - GNU General Public License, version 2 +Grants an copyleft open source license with ABSOLUTELY NO WARRANTY. For the full GPL license text, please see: - LICENSE file placed in the root of this source code, or -- https://www.ibexa.co/software-information/licenses-and-agreements (latest version applies) +- https://www.gnu.org/licenses/old-licenses/gpl-2.0.html diff --git a/assets/app.js b/assets/app.js new file mode 100644 index 000000000..bb0a6aa13 --- /dev/null +++ b/assets/app.js @@ -0,0 +1,12 @@ +/* + * Welcome to your app's main JavaScript file! + * + * We recommend including the built version of this JavaScript file + * (and its CSS file) in your base layout (base.html.twig). + */ + +// any CSS you import will output into a single css file (app.css in this case) +import './styles/app.css'; + +// start the Stimulus application +import './bootstrap'; diff --git a/assets/bootstrap.js b/assets/bootstrap.js new file mode 100644 index 000000000..4ab2df643 --- /dev/null +++ b/assets/bootstrap.js @@ -0,0 +1,11 @@ +import { startStimulusApp } from '@symfony/stimulus-bridge'; + +// Registers Stimulus controllers from controllers.json and in the controllers/ directory +export const app = startStimulusApp(require.context( + '@symfony/stimulus-bridge/lazy-controller-loader!./controllers', + true, + /\.[jt]sx?$/ +)); + +// register any custom, 3rd party controllers here +// app.register('some_controller_name', SomeImportedController); diff --git a/assets/controllers.json b/assets/controllers.json new file mode 100644 index 000000000..a1c6e90cf --- /dev/null +++ b/assets/controllers.json @@ -0,0 +1,4 @@ +{ + "controllers": [], + "entrypoints": [] +} diff --git a/assets/controllers/hello_controller.js b/assets/controllers/hello_controller.js new file mode 100644 index 000000000..e847027bd --- /dev/null +++ b/assets/controllers/hello_controller.js @@ -0,0 +1,16 @@ +import { Controller } from '@hotwired/stimulus'; + +/* + * This is an example Stimulus controller! + * + * Any element with a data-controller="hello" attribute will cause + * this controller to be executed. The name "hello" comes from the filename: + * hello_controller.js -> "hello" + * + * Delete this file or adapt it for your use! + */ +export default class extends Controller { + connect() { + this.element.textContent = 'Hello Stimulus! Edit me in assets/controllers/hello_controller.js'; + } +} diff --git a/assets/images/caret-down.svg b/assets/images/caret-down.svg new file mode 100755 index 000000000..8ac6b1a9d --- /dev/null +++ b/assets/images/caret-down.svg @@ -0,0 +1,4 @@ + +caret-down + + diff --git a/assets/images/content.png b/assets/images/content.png new file mode 100644 index 000000000..1d49c14e1 Binary files /dev/null and b/assets/images/content.png differ diff --git a/assets/images/development.svg b/assets/images/development.svg new file mode 100644 index 000000000..503209ef8 --- /dev/null +++ b/assets/images/development.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/documentation.svg b/assets/images/documentation.svg new file mode 100644 index 000000000..c9948a761 --- /dev/null +++ b/assets/images/documentation.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/experience.svg b/assets/images/experience.svg new file mode 100644 index 000000000..9c9756370 --- /dev/null +++ b/assets/images/experience.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/header-background.png b/assets/images/header-background.png new file mode 100644 index 000000000..cae7e28f7 Binary files /dev/null and b/assets/images/header-background.png differ diff --git a/assets/images/oss.svg b/assets/images/oss.svg new file mode 100644 index 000000000..47a588736 --- /dev/null +++ b/assets/images/oss.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/php-api.svg b/assets/images/php-api.svg new file mode 100644 index 000000000..d04a1beeb --- /dev/null +++ b/assets/images/php-api.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/rest-api.svg b/assets/images/rest-api.svg new file mode 100644 index 000000000..099fd0082 --- /dev/null +++ b/assets/images/rest-api.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/support-background.png b/assets/images/support-background.png new file mode 100644 index 000000000..67e10c595 Binary files /dev/null and b/assets/images/support-background.png differ diff --git a/assets/images/support.png b/assets/images/support.png new file mode 100644 index 000000000..ed03b369e Binary files /dev/null and b/assets/images/support.png differ diff --git a/assets/images/training-background.png b/assets/images/training-background.png new file mode 100644 index 000000000..dac433b9d Binary files /dev/null and b/assets/images/training-background.png differ diff --git a/assets/images/training.svg b/assets/images/training.svg new file mode 100644 index 000000000..3ceedf1e5 --- /dev/null +++ b/assets/images/training.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/tutorials-icon.svg b/assets/images/tutorials-icon.svg new file mode 100644 index 000000000..763471c73 --- /dev/null +++ b/assets/images/tutorials-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/tutorials.svg b/assets/images/tutorials.svg new file mode 100644 index 000000000..a49f9f5cd --- /dev/null +++ b/assets/images/tutorials.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/user.svg b/assets/images/user.svg new file mode 100644 index 000000000..46eefebde --- /dev/null +++ b/assets/images/user.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/js/react.blocks.js b/assets/js/react.blocks.js new file mode 100644 index 000000000..24e8a3ed4 --- /dev/null +++ b/assets/js/react.blocks.js @@ -0,0 +1,47 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; + +(function (global, doc) { + const reactComponents = {}; + const cache = {}; + const context = require.context( + '../page-builder/react/blocks', + true, + /\.js$/ + ); + + if (!context) { + return; + } + + context.keys().forEach((key) => (cache[key] = context(key))); + + for (const key in cache) { + const components = cache[key].default; + + for (const component in components) { + reactComponents[component] = components[component]; + } + } + + const reactBlocks = [...doc.querySelectorAll('.ibexa-react-block')]; + + reactBlocks.forEach((reactBlock) => { + const { componentName, props: componentProps } = reactBlock.dataset; + const props = JSON.parse(componentProps).attributes; + const ReactComponent = reactComponents[componentName]; + const reactBlockRoot = createRoot(reactBlock); + + reactBlockRoot.render(); + }); + + window.getReactComponent = (name) => { + return reactComponents[name]; + }; + + window.renderReactComponent = (container, Component, props) => { + const reactBlockRoot = createRoot(container); + + reactBlockRoot.render(); + }; +})(window, document); diff --git a/assets/js/welcome.page.js b/assets/js/welcome.page.js new file mode 100644 index 000000000..d340cd995 --- /dev/null +++ b/assets/js/welcome.page.js @@ -0,0 +1,12 @@ +(function (global, doc) { + const btnDown = doc.querySelector('.ibexa-welcome-header__go-down'); + + btnDown.addEventListener('click', () => { + const header = doc.querySelector('.ibexa-welcome-header'); + + global.scrollTo({ + top: header.offsetHeight, + behavior: 'smooth', + }); + }); +})(window, document); diff --git a/assets/scss/_contact.scss b/assets/scss/_contact.scss new file mode 100644 index 000000000..573d8fe80 --- /dev/null +++ b/assets/scss/_contact.scss @@ -0,0 +1,38 @@ +.ibexa-welcome-contact { + background-image: url('/assets/images/support-background.png'); + + &__block { + padding: 23px 0 38px; + } + + .ibexa-welcome-block-header { + font-size: 28px; + line-height: 42px; + margin: 60px 0 8px; + } + + .ibexa-welcome-paragraph { + margin: 0 0 40px 0; + } + + .ibexa-welcome-btn { + margin: 0 0 40px 0; + } +} + +@media only screen and (max-width: 768px) { + .ibexa-welcome-contact { + .ibexa-welcome-block-header { + margin-top: 0; + } + + .ibexa-welcome-column { + margin-top: 0; + } + + .ibexa-welcome-btn { + margin-bottom: 0; + } + } +} + diff --git a/assets/scss/_custom-normalize.scss b/assets/scss/_custom-normalize.scss new file mode 100644 index 000000000..4cd982c31 --- /dev/null +++ b/assets/scss/_custom-normalize.scss @@ -0,0 +1,5 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} diff --git a/assets/scss/_documentation.scss b/assets/scss/_documentation.scss new file mode 100644 index 000000000..061c58e98 --- /dev/null +++ b/assets/scss/_documentation.scss @@ -0,0 +1,17 @@ +.ibexa-welcome-documentation-hub { + .ibexa-welcome-circle { + margin: 16px; + width: 96px; + height: 96px; + background: radial-gradient( + 35.33% 35.33% at 32.17% 6.51%, + rgba(220, 2, 61, 0.1) 0%, + rgba(202, 11, 63, 1e-5) 100% + ), + #e0e0e8; + } + + .ibexa-welcome-btn { + margin: auto 0 0; + } +} diff --git a/assets/scss/_footer.scss b/assets/scss/_footer.scss new file mode 100644 index 000000000..15b6b7839 --- /dev/null +++ b/assets/scss/_footer.scss @@ -0,0 +1,13 @@ +.ibexa-welcome-footer { + background-color: $ibexa-welcome-color-dark-600; + + .ibexa-welcome-paragraph { + margin: 18px 0; + color: $ibexa-welcome-color-light; + font-weight: 700; + + a { + color: $ibexa-welcome-color-light; + } + } +} diff --git a/assets/scss/_header.scss b/assets/scss/_header.scss new file mode 100644 index 000000000..bbfa5e9ff --- /dev/null +++ b/assets/scss/_header.scss @@ -0,0 +1,99 @@ +.ibexa-welcome-header { + height: 100vh; + min-height: 820px; + background-image: url('/assets/images/header-background.png'); + background-size: cover; + color: $ibexa-welcome-color-light; + position: relative; + + &__logo { + margin-top: 40px; + } + + &__go-down { + background: none; + border: 0; + outline: none; + fill: $ibexa-welcome-color-light; + position: absolute; + bottom: 50px; + left: calc(50% - 22px); + cursor: pointer; + } + + .ibexa-welcome-section-header { + font-size: 60px; + line-height: 82px; + margin: 200px 0 40px; + } + + .ibexa-welcome-paragraph { + font-size: 22px; + line-height: 36px; + font-weight: 600; + margin: 0 0 40px 0; + } + + .ibexa-welcome-img { + margin-top: 150px; + margin-right: -300px; + } + + .ibexa-welcome-btn + .ibexa-welcome-btn { + margin-left: 24px; + } +} + +@media only screen and (max-width: 1700px) { + .ibexa-welcome-header { + .ibexa-welcome-img { + width: 100%; + margin-right: 0; + } + } +} + +@media only screen and (max-width: 1200px) { + .ibexa-welcome-header { + &__img-column { + display: none; + } + } +} + +@media only screen and (max-width: 600px) { + .ibexa-welcome-header { + .ibexa-welcome-section-header { + font-size: 48px; + line-height: 72px; + margin-top: 100px; + } + } +} + +@media only screen and (max-width: 1700px) { + .ibexa-welcome-header { + .ibexa-welcome-img { + width: 100%; + margin-right: 0; + } + } +} + +@media only screen and (max-width: 1200px) { + .ibexa-welcome-header { + &__img-column { + display: none; + } + } +} + +@media only screen and (max-width: 600px) { + .ibexa-welcome-header { + .ibexa-welcome-section-header { + font-size: 48px; + line-height: 72px; + margin-top: 100px; + } + } +} diff --git a/assets/scss/_main.scss b/assets/scss/_main.scss new file mode 100644 index 000000000..5825fce43 --- /dev/null +++ b/assets/scss/_main.scss @@ -0,0 +1,163 @@ +html { + position: relative; + min-height: 100%; +} + +body { + font-size: 16px; + line-height: 24px; + letter-spacing: 0.12px; + color: $ibexa-welcome-color-dark; + overflow-x: hidden; + font-family: 'Noto Sans', sans-serif; + font-weight: 400; + font-style: normal; +} + +.logo { + max-width: 117px; + max-height: 33px; +} + +.ibexa-welcome-container { + max-width: 1170px; + margin: 0 auto; +} + +.ibexa-welcome-blocks { + margin-top: 32px; +} + +.ibexa-welcome-row { + display: flex; +} + +.ibexa-welcome-column { + display: flex; + flex: 1; + flex-direction: column; + align-items: flex-start; + + & + & { + margin-left: 30px; + } + + &--center { + align-items: center; + text-align: center; + } +} + +.ibexa-welcome-section-header { + font-size: 48px; + line-height: 72px; + font-family: 'Work Sans', sans-serif; + font-weight: 600; + letter-spacing: 0.27px; + margin: 72px 0 24px; +} + +.ibexa-welcome-block-header { + font-size: 22px; + line-height: 36px; + font-family: 'Work Sans', sans-serif; + font-weight: 600; + margin: 14px 0 20px; +} + +.ibexa-welcome-circle { + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.ibexa-welcome-paragraph { + margin-bottom: 20px; +} + +.ibexa-welcome-btn { + display: inline-flex; + justify-content: center; + align-items: center; + white-space: nowrap; + outline: none; + font-weight: 600; + font-size: 14px; + line-height: 21px; + padding: 14px 16px; + border-width: 1px; + border-style: solid; + border-radius: 10px; + color: $ibexa-welcome-color-main; + cursor: pointer; + text-decoration: none; + transition: all $ibexa-welcome-transition-duration $ibexa-welcome-transition; + + &:hover { + border-color: $ibexa-welcome-color-dark; + color: $ibexa-welcome-color-dark; + } + + &--filled { + color: $ibexa-welcome-color-light; + fill: $ibexa-welcome-color-light; + border-width: 0; + background: linear-gradient( + to right, + $ibexa-welcome-color-extra-red 0%, + $ibexa-welcome-color-main 100% + ); + + &:hover { + color: $ibexa-welcome-color-light; + box-shadow: 0 0 0 transparent, + 0 22px 24px 0 rgba($ibexa-welcome-color-extra-red, 0.2); + } + } +} + +.ibexa-welcome-link { + text-decoration: underline; + color: $ibexa-welcome-color-dark; + font-weight: 600; + font-size: 14px; + line-height: 21px; +} + +.ibexa-welcome-img { + display: inline-flex; + flex: 1; + + &--center { + align-self: center; + } + + &--right { + align-self: flex-end; + } +} + +@media only screen and (max-width: 1200px) { + .ibexa-welcome-container { + padding-left: 32px; + padding-right: 32px; + } +} + +@media only screen and (max-width: 768px) { + .ibexa-welcome-row { + flex-direction: column; + } + + .ibexa-welcome-img { + display: none; + } + + .ibexa-welcome-column { + & + & { + margin-top: 30px; + margin-left: 0; + } + } +} diff --git a/assets/scss/_training.scss b/assets/scss/_training.scss new file mode 100644 index 000000000..a7a73e711 --- /dev/null +++ b/assets/scss/_training.scss @@ -0,0 +1,55 @@ +.ibexa-welcome-training-platform { + &__block { + background: center url('/assets/images/training-background.png'); + background-size: cover; + border-radius: 10px; + max-height: 286px; + margin: 50px 0; + padding: 50px 60px; + color: $ibexa-welcome-color-light; + } + + &__img-column { + flex: 0; + } + + .ibexa-welcome-column { + align-items: center; + } + + .ibexa-welcome-block-header { + font-size: 28px; + line-height: 42px; + margin: 0 0 8px; + } + + .ibexa-welcome-paragraph { + margin: 0 0 40px 0; + } +} + +@media only screen and (max-width: 900px) { + .ibexa-welcome-training-platform { + &__img-column { + display: none; + } + } +} + +@media only screen and (max-width: 768px) { + .ibexa-welcome-training-platform { + &__block { + padding-top: 32px; + padding-bottom: 32px; + max-height: 100%; + } + + &__img-column { + display: none; + } + + .ibexa-welcome-column { + margin-top: 0; + } + } +} diff --git a/assets/scss/_tutorials.scss b/assets/scss/_tutorials.scss new file mode 100644 index 000000000..8aee12248 --- /dev/null +++ b/assets/scss/_tutorials.scss @@ -0,0 +1,81 @@ +.ibexa-welcome-tutorials-and-resources { + &__subheader { + max-width: 500px; + font-weight: 600; + } + + &__block { + background-color: $ibexa-welcome-color-light-600; + padding: 30px 22px 16px 48px; + border-radius: 10px; + + .ibexa-welcome-paragraph { + margin: 0 0 40px 0; + } + + .ibexa-welcome-link { + margin: auto 0 0 auto; + } + + .ibexa-welcome-circle { + width: 54px; + height: 54px; + background: $ibexa-welcome-color-light; + } + + &--get-started { + padding: 50px 60px; + margin: 76px 0 25px; + + .ibexa-welcome-block-header { + font-size: 28px; + line-height: 42px; + margin: 0 0 8px; + } + + .ibexa-welcome-link { + margin-left: 0; + } + + .ibexa-welcome-img { + margin-top: -130px; + margin-right: -25px; + } + } + + &--tutorials { + flex-basis: 25%; + } + + &--rest-api { + flex-basis: 42%; + } + + &--php-api { + flex-basis: 33%; + } + } +} + +@media only screen and (max-width: 1200px) { + .ibexa-welcome-tutorials-and-resources { + &__img-column { + display: none; + } + } +} + +@media only screen and (max-width: 768px) { + .ibexa-welcome-tutorials-and-resources { + &__block { + padding: 30px 22px 16px 48px; + + &--get-started { + .ibexa-welcome-link { + margin-left: auto; + } + } + + } + } +} diff --git a/assets/scss/normalize.css b/assets/scss/normalize.css new file mode 100644 index 000000000..192eb9ce4 --- /dev/null +++ b/assets/scss/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/assets/scss/variables.scss b/assets/scss/variables.scss new file mode 100644 index 000000000..dbfbc10d1 --- /dev/null +++ b/assets/scss/variables.scss @@ -0,0 +1,12 @@ +$ibexa-welcome-color-main: #ae1164; + +$ibexa-welcome-color-dark-600: #0b1117; +$ibexa-welcome-color-dark: #131c26; + +$ibexa-welcome-color-light-600: #f9f9fa; +$ibexa-welcome-color-light: #ffffff; + +$ibexa-welcome-color-extra-red: #db0032; + +$ibexa-welcome-transition: cubic-bezier(0.25, 0.8, 0.25, 1); +$ibexa-welcome-transition-duration: 0.4s; diff --git a/assets/scss/welcome-page.scss b/assets/scss/welcome-page.scss new file mode 100644 index 000000000..4c381657c --- /dev/null +++ b/assets/scss/welcome-page.scss @@ -0,0 +1,11 @@ +@import 'normalize.css'; +@import 'custom-normalize'; +@import 'variables'; + +@import 'main'; +@import 'header'; +@import 'documentation'; +@import 'tutorials'; +@import 'training'; +@import 'contact'; +@import 'footer'; diff --git a/assets/styles/app.css b/assets/styles/app.css new file mode 100644 index 000000000..cb33b1315 --- /dev/null +++ b/assets/styles/app.css @@ -0,0 +1,3 @@ +body { + background-color: lightgray; +} diff --git a/bin/console b/bin/console new file mode 100755 index 000000000..c933dc535 --- /dev/null +++ b/bin/console @@ -0,0 +1,17 @@ +#!/usr/bin/env php + doctrine/doctrine-bundle ### + database: + ports: + - "5432" +###< doctrine/doctrine-bundle ### diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 000000000..1abf6c65d --- /dev/null +++ b/compose.yaml @@ -0,0 +1,21 @@ +version: '3' + +services: +###> doctrine/doctrine-bundle ### + database: + image: postgres:${POSTGRES_VERSION:-16}-alpine + environment: + POSTGRES_DB: ${POSTGRES_DB:-app} + # You should definitely change the password in production + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} + POSTGRES_USER: ${POSTGRES_USER:-app} + volumes: + - database_data:/var/lib/postgresql/data:rw + # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/db/data:/var/lib/postgresql/data:rw +###< doctrine/doctrine-bundle ### + +volumes: +###> doctrine/doctrine-bundle ### + database_data: +###< doctrine/doctrine-bundle ### diff --git a/composer.json b/composer.json new file mode 100644 index 000000000..82d667a57 --- /dev/null +++ b/composer.json @@ -0,0 +1,78 @@ +{ + "type": "project", + "license": "proprietary", + "require": { + "php": ">=7.4", + "ext-ctype": "*", + "ext-iconv": "*", + "http-interop/http-factory-guzzle": "^1.2", + "ibexa/experience": "4.5.6", + "symfony/console": "5.4.*", + "symfony/dotenv": "5.4.*", + "symfony/flex": "^1.17|^2", + "symfony/framework-bundle": "5.4.*", + "symfony/runtime": "5.4.*", + "symfony/yaml": "5.4.*" + }, + "config": { + "allow-plugins": { + "composer/package-versions-deprecated": true, + "ibexa/post-install": true, + "php-http/discovery": true, + "symfony/flex": true, + "symfony/runtime": true + }, + "optimize-autoloader": true, + "preferred-install": { + "*": "dist" + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd", + "yarn install": "script", + "ibexa:encore:compile --config-name app": "symfony-cmd", + "bazinga:js-translation:dump %PUBLIC_DIR%/assets --merge-domains": "symfony-cmd", + "ibexa:encore:compile": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": true, + "require": "5.4.*", + "endpoint": "https://api.github.com/repos/ibexa/recipes/contents/index.json?ref=flex/main" + } + }, + "repositories": { + "ibexa": { + "type": "composer", + "url": "https://updates.ibexa.co" + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..12948caa8 --- /dev/null +++ b/composer.lock @@ -0,0 +1,18265 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "bdd8a8a10769d1ee44c069c936f91591", + "packages": [ + { + "name": "babdev/pagerfanta-bundle", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/BabDev/PagerfantaBundle.git", + "reference": "98bd0756de82080ace1a2e41e66f618e469da943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/BabDev/PagerfantaBundle/zipball/98bd0756de82080ace1a2e41e66f618e469da943", + "reference": "98bd0756de82080ace1a2e41e66f618e469da943", + "shasum": "" + }, + "require": { + "pagerfanta/pagerfanta": "^2.7", + "php": "^7.2 || ^8.0", + "symfony/config": "^3.4 || ^4.4 || ^5.3", + "symfony/dependency-injection": "^3.4 || ^4.4 || ^5.3", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-foundation": "^3.4 || ^4.4 || ^5.3", + "symfony/http-kernel": "^3.4 || ^4.4 || ^5.3", + "symfony/property-access": "^3.4 || ^4.4 || ^5.3", + "symfony/routing": "^3.4 || ^4.4 || ^5.3" + }, + "conflict": { + "twig/twig": "<1.35 || >=2.0,<2.5", + "white-october/pagerfanta-bundle": "*" + }, + "require-dev": { + "doctrine/annotations": "^1.8", + "jms/serializer": "^3.0", + "jms/serializer-bundle": "^3.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^0.12.94", + "phpstan/phpstan-phpunit": "^0.12.21", + "phpstan/phpstan-symfony": "^0.12.41", + "phpunit/phpunit": "^8.5 || ^9.3", + "symfony/phpunit-bridge": "^4.4 || ^5.3", + "symfony/serializer": "^3.4 || ^4.4 || ^5.3", + "symfony/translation": "^3.4 || ^4.4 || ^5.3", + "symfony/twig-bridge": "^3.4 || ^4.4 || ^5.3", + "symfony/twig-bundle": "^3.4 || ^4.4 || ^5.3", + "twig/twig": "^1.35 || ^2.5 || ^3.0" + }, + "suggest": { + "jms/serializer-bundle": "To use the Pagerfanta class with the JMS Serializer", + "symfony/serializer": "To use the Pagerfanta class with the Symfony Serializer", + "symfony/translation": "To use the Pagerfanta views with translation support", + "twig/twig": "To integrate Pagerfanta with Twig through extensions" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "BabDev\\PagerfantaBundle\\": "" + }, + "exclude-from-classmap": [ + "Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Bundle integrating Pagerfanta with Symfony", + "keywords": [ + "pagerfanta", + "pagination", + "symfony" + ], + "support": { + "issues": "https://github.com/BabDev/PagerfantaBundle/issues", + "source": "https://github.com/BabDev/PagerfantaBundle/tree/v2.11.0" + }, + "funding": [ + { + "url": "https://github.com/mbabker", + "type": "github" + } + ], + "time": "2021-08-01T16:42:35+00:00" + }, + { + "name": "behat/transliterator", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Transliterator.git", + "reference": "baac5873bac3749887d28ab68e2f74db3a4408af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Transliterator/zipball/baac5873bac3749887d28ab68e2f74db3a4408af", + "reference": "baac5873bac3749887d28ab68e2f74db3a4408af", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "chuyskywalker/rolling-curl": "^3.1", + "php-yaoi/php-yaoi": "^1.0", + "phpunit/phpunit": "^8.5.25 || ^9.5.19" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Behat\\Transliterator\\": "src/Behat/Transliterator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Artistic-1.0" + ], + "description": "String transliterator", + "keywords": [ + "i18n", + "slug", + "transliterator" + ], + "support": { + "issues": "https://github.com/Behat/Transliterator/issues", + "source": "https://github.com/Behat/Transliterator/tree/v1.5.0" + }, + "time": "2022-03-30T09:27:43+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-20T15:40:13+00:00" + }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-17T14:14:24+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "cron/cron", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/Cron/Cron.git", + "reference": "78ca6947e26b3941d89a4a01cc08971e900c054e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cron/Cron/zipball/78ca6947e26b3941d89a4a01cc08971e900c054e", + "reference": "78ca6947e26b3941d89a4a01cc08971e900c054e", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/process": "^4.0|^5.0|^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries De Peuter", + "email": "dries@nousefreak.be" + } + ], + "description": "Cronjobs", + "support": { + "issues": "https://github.com/Cron/Cron/issues", + "source": "https://github.com/Cron/Cron/tree/1.9.0" + }, + "time": "2023-11-04T17:18:48+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.14.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.3" + }, + "time": "2023-02-01T09:20:38+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "420480fc085bc65f3c956af13abe8e7546f94813" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/420480fc085bc65f3c956af13abe8e7546f94813", + "reference": "420480fc085bc65f3c956af13abe8e7546f94813", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2024-03-05T22:28:45+00:00" + }, + { + "name": "doctrine/common", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.4.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2022-10-09T11:47:59+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.13.9", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.4.6", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^4.4", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.22.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.9" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-05-02T20:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "22d53b2c5ad03929628fb4a928b01135585b7179" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/22d53b2c5ad03929628fb4a928b01135585b7179", + "reference": "22d53b2c5ad03929628fb4a928b01135585b7179", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1", + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^2.13.1 || ^3.3.2", + "doctrine/persistence": "^2.2 || ^3", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "symfony/config": "^4.4.3 || ^5.4 || ^6.0", + "symfony/console": "^4.4 || ^5.4 || ^6.0", + "symfony/dependency-injection": "^4.4.18 || ^5.4 || ^6.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^4.4.22 || ^5.4 || ^6.0", + "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + }, + "conflict": { + "doctrine/orm": "<2.11 || >=3.0", + "twig/twig": "<1.34 || >=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "doctrine/orm": "^2.11 || ^3.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3 || ^10.0", + "psalm/plugin-phpunit": "^0.16.1", + "psalm/plugin-symfony": "^3", + "psr/log": "^1.1.4 || ^2.0 || ^3.0", + "symfony/phpunit-bridge": "^6.1", + "symfony/property-info": "^4.4 || ^5.4 || ^6.0", + "symfony/proxy-manager-bridge": "^4.4 || ^5.4 || ^6.0", + "symfony/security-bundle": "^4.4 || ^5.4 || ^6.0", + "symfony/twig-bridge": "^4.4 || ^5.4 || ^6.0", + "symfony/validator": "^4.4 || ^5.4 || ^6.0", + "symfony/web-profiler-bundle": "^4.4 || ^5.4 || ^6.0", + "symfony/yaml": "^4.4 || ^5.4 || ^6.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^4.7" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.7.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2022-12-07T12:07:11+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1dd42906a5fb9c5960723e2ebb45c68006493835", + "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^2.4", + "doctrine/migrations": "^3.2", + "php": "^7.2|^8.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.6 || ^3", + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", + "symfony/phpunit-bridge": "^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2023-11-13T19:44:41+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:51:15+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:35:39+00:00" + }, + { + "name": "doctrine/migrations", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "362f07ff732a2b4498be919561536800cec29500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/362f07ff732a2b4498be919561536800cec29500", + "reference": "362f07ff732a2b4498be919561536800cec29500", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/dbal": "^2.11 || ^3.0", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.2 || ^8.0", + "psr/log": "^1.1.3 || ^2 || ^3", + "symfony/console": "^3.4 || ^4.4.16 || ^5.0 || ^6.0", + "symfony/stopwatch": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3 || ^2.0", + "doctrine/sql-formatter": "^1.0", + "ergebnis/composer-normalize": "^2.9", + "ext-pdo_sqlite": "*", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.4", + "symfony/cache": "^3.4.26 || ^4.2.12 || ^5.0 || ^6.0", + "symfony/process": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "suggest": { + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 4, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.4.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2023-09-07T12:23:11+00:00" + }, + { + "name": "doctrine/orm", + "version": "2.19.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "40a0964f06e142e173b783c45688e5f5efaed6aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/40a0964f06e142e173b783c45688e5f5efaed6aa", + "reference": "40a0964f06e142e173b783c45688e5f5efaed6aa", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.12.1 || ^2.1.1", + "doctrine/collections": "^1.5 || ^2.1", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^2 || ^3", + "doctrine/persistence": "^2.4 || ^3", + "ext-ctype": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.13 || ^2", + "doctrine/coding-standard": "^9.0.2 || ^12.0", + "phpbench/phpbench": "^0.16.10 || ^1.0", + "phpstan/phpstan": "~1.4.10 || 1.10.59", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "4.30.0 || 5.22.2" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.19.2" + }, + "time": "2024-03-18T19:12:56+00:00" + }, + { + "name": "doctrine/persistence", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "477da35bd0255e032826f440b94b3e37f2d56f42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/477da35bd0255e032826f440b94b3e37f2d56f42", + "reference": "477da35bd0255e032826f440b94b3e37f2d56f42", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^11", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.9.4", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.3.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2024-03-12T14:54:36+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "a321d114e0a18e6497f8a2cd6f890e000cc17ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a321d114e0a18e6497f8a2cd6f890e000cc17ecc", + "reference": "a321d114e0a18e6497f8a2cd6f890e000cc17ecc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.2.0" + }, + "time": "2023-08-16T21:49:04+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.6", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-06-01T07:04:22+00:00" + }, + { + "name": "elasticsearch/elasticsearch", + "version": "v7.17.2", + "source": { + "type": "git", + "url": "git@github.com:elastic/elasticsearch-php.git", + "reference": "2d302233f2bb0926812d82823bb820d405e130fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/2d302233f2bb0926812d82823bb820d405e130fc", + "reference": "2d302233f2bb0926812d82823bb820d405e130fc", + "shasum": "" + }, + "require": { + "ext-json": ">=1.3.7", + "ezimuel/ringphp": "^1.1.2", + "php": "^7.3 || ^8.0", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "ext-yaml": "*", + "ext-zip": "*", + "mockery/mockery": "^1.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.3", + "squizlabs/php_codesniffer": "^3.4", + "symfony/finder": "~4.0" + }, + "suggest": { + "ext-curl": "*", + "monolog/monolog": "Allows for client-level logging and tracing" + }, + "type": "library", + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Elasticsearch\\": "src/Elasticsearch/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0", + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Zachary Tong" + }, + { + "name": "Enrico Zimuel" + } + ], + "description": "PHP Client for Elasticsearch", + "keywords": [ + "client", + "elasticsearch", + "search" + ], + "time": "2023-04-21T15:31:12+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown/issues", + "source": "https://github.com/erusev/parsedown/tree/1.7.x" + }, + "time": "2019-12-30T22:54:17+00:00" + }, + { + "name": "ezimuel/guzzlestreams", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/ezimuel/guzzlestreams.git", + "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezimuel/guzzlestreams/zipball/b4b5a025dfee70d6cd34c780e07330eb93d5b997", + "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Fork of guzzle/streams (abandoned) to be used with elasticsearch-php", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "stream" + ], + "support": { + "source": "https://github.com/ezimuel/guzzlestreams/tree/3.1.0" + }, + "time": "2022-10-24T12:58:50+00:00" + }, + { + "name": "ezimuel/ringphp", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ezimuel/ringphp.git", + "reference": "7887fc8488013065f72f977dcb281994f5fde9f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezimuel/ringphp/zipball/7887fc8488013065f72f977dcb281994f5fde9f4", + "reference": "7887fc8488013065f72f977dcb281994f5fde9f4", + "shasum": "" + }, + "require": { + "ezimuel/guzzlestreams": "^3.0.1", + "php": ">=5.4.0", + "react/promise": "~2.0" + }, + "replace": { + "guzzlehttp/ringphp": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~9.0" + }, + "suggest": { + "ext-curl": "Guzzle will use specific adapters if cURL is present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Ring\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php", + "support": { + "source": "https://github.com/ezimuel/ringphp/tree/1.2.2" + }, + "time": "2022-12-07T11:28:53+00:00" + }, + { + "name": "ezsystems/diff", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/ezsystems/diff.git", + "reference": "6459cfbb3beafafda30bb068dd53c37dfffc32e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezsystems/diff/zipball/6459cfbb3beafafda30bb068dd53c37dfffc32e8", + "reference": "6459cfbb3beafafda30bb068dd53c37dfffc32e8", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "replace": { + "sebastian/diff": "*" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "source": "https://github.com/ezsystems/diff/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-16T07:46:35+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.18", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2024-03-20T12:50:41+00:00" + }, + { + "name": "friendsofsymfony/http-cache", + "version": "2.15.3", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSHttpCache.git", + "reference": "39f6b356fb253f95067b3c29139949ddbcae3934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSHttpCache/zipball/39f6b356fb253f95067b3c29139949ddbcae3934", + "reference": "39f6b356fb253f95067b3c29139949ddbcae3934", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "php-http/client-common": "^1.1.0 || ^2.0", + "php-http/client-implementation": "^1.0 || ^2.0", + "php-http/discovery": "^1.12", + "php-http/message": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "symfony/event-dispatcher": "^4.3 || ^5.0 || ^6.0", + "symfony/options-resolver": "^4.3 || ^5.0 || ^6.0" + }, + "conflict": { + "toflar/psr6-symfony-http-cache-store": "<2.2.1" + }, + "require-dev": { + "mockery/mockery": "^1.3.1", + "monolog/monolog": "^1.0", + "php-http/guzzle7-adapter": "^0.1.1", + "php-http/mock-client": "^1.2", + "symfony/http-kernel": "^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.0 || ^6.0", + "symfony/process": "^4.3 || ^5.0 || ^6.0" + }, + "suggest": { + "friendsofsymfony/http-cache-bundle": "For integration with the Symfony framework", + "monolog/monolog": "For logging issues while invalidating" + }, + "type": "library", + "autoload": { + "psr-4": { + "FOS\\HttpCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Liip AG", + "homepage": "http://www.liip.ch/" + }, + { + "name": "Driebit", + "email": "tech@driebit.nl", + "homepage": "http://www.driebit.nl" + }, + { + "name": "Community contributions", + "homepage": "https://github.com/friendsofsymfony/FOSHttpCache/contributors" + } + ], + "description": "Tools to manage HTTP caching proxies with PHP", + "homepage": "https://github.com/friendsofsymfony/FOSHttpCache", + "keywords": [ + "caching", + "http", + "invalidation", + "nginx", + "purge", + "varnish" + ], + "support": { + "issues": "https://github.com/FriendsOfSymfony/FOSHttpCache/issues", + "source": "https://github.com/FriendsOfSymfony/FOSHttpCache/tree/2.15.3" + }, + "time": "2023-12-11T10:07:11+00:00" + }, + { + "name": "friendsofsymfony/http-cache-bundle", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle.git", + "reference": "70f641381efa77307b22a56b98f1f8b60b27bb23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSHttpCacheBundle/zipball/70f641381efa77307b22a56b98f1f8b60b27bb23", + "reference": "70f641381efa77307b22a56b98f1f8b60b27bb23", + "shasum": "" + }, + "require": { + "friendsofsymfony/http-cache": "^2.15", + "php": "^7.3 || ^8.0", + "symfony/framework-bundle": "^4.4.0 || ^5.0 || ^6.0", + "symfony/http-foundation": "^4.4.0 || ^5.0 || ^6.0", + "symfony/http-kernel": "^4.4.0 || ^5.0 || ^6.0" + }, + "conflict": { + "symfony/monolog-bridge": "<3.4.4", + "twig/twig": "<1.12.0" + }, + "require-dev": { + "doctrine/annotations": "^1.11", + "guzzlehttp/guzzle": "^7.2", + "matthiasnoback/symfony-dependency-injection-test": "^4.0", + "mockery/mockery": "^1.3.2", + "monolog/monolog": "*", + "php-http/discovery": "^1.13", + "php-http/guzzle7-adapter": "^0.1.1", + "php-http/httplug": "^2.2.0", + "php-http/message": "^1.0 || ^2.0", + "sebastian/exporter": "^2.0", + "sensio/framework-extra-bundle": "^4.0 || ^5.5.1 || ^6.0", + "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", + "symfony/console": "^4.4 || ^5.0 || ^6.0", + "symfony/css-selector": "^4.4 || ^5.0 || ^6.0", + "symfony/expression-language": "^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^4.4 || ^5.0 || ^6.0", + "symfony/monolog-bundle": "^3.0", + "symfony/phpunit-bridge": "v5.3.7", + "symfony/routing": "^4.4 || ^5.0 || ^6.0", + "symfony/security-bundle": "^4.4 || ^5.0 || ^6.0", + "symfony/twig-bundle": "^4.4 || ^5.0 || ^6.0", + "symfony/yaml": "^4.4 || ^5.0 || ^6.0", + "twig/twig": "^2.13" + }, + "suggest": { + "jean-beru/fos-http-cache-cloudfront": "To use CloudFront proxy", + "sensio/framework-extra-bundle": "For Tagged Cache Invalidation", + "symfony/console": "To send invalidation requests from the command line", + "symfony/expression-language": "For Tagged Cache Invalidation" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "FOS\\HttpCacheBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Liip AG", + "homepage": "http://www.liip.ch/" + }, + { + "name": "Driebit", + "email": "tech@driebit.nl", + "homepage": "http://www.driebit.nl" + }, + { + "name": "Community contributions", + "homepage": "https://github.com/friendsofsymfony/FOSHttpCacheBundle/contributors" + } + ], + "description": "Set path based HTTP cache headers and send invalidation requests to your HTTP cache", + "homepage": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle", + "keywords": [ + "caching", + "esi", + "http", + "invalidation", + "purge", + "varnish" + ], + "support": { + "issues": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle/issues", + "source": "https://github.com/FriendsOfSymfony/FOSHttpCacheBundle/tree/2.17.0" + }, + "time": "2023-10-10T09:15:19+00:00" + }, + { + "name": "friendsofsymfony/jsrouting-bundle", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSJsRoutingBundle.git", + "reference": "c978fabc6a21a77052ff3fe927b41111ec944f0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSJsRoutingBundle/zipball/c978fabc6a21a77052ff3fe927b41111ec944f0d", + "reference": "c978fabc6a21a77052ff3fe927b41111ec944f0d", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0", + "symfony/console": "~3.4|^4.4.20|^5.0", + "symfony/framework-bundle": "~3.4|^4.4.20|^5.0", + "symfony/serializer": "~3.4|^4.4.20|^5.0", + "willdurand/jsonp-callback-validator": "~1.1" + }, + "require-dev": { + "symfony/expression-language": "~3.4|^4.4.20|^5.0", + "symfony/phpunit-bridge": "^5.3" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "FOS\\JsRoutingBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "will+git@drnd.me" + }, + { + "name": "FriendsOfSymfony Community", + "homepage": "https://github.com/friendsofsymfony/FOSJsRoutingBundle/contributors" + } + ], + "description": "A pretty nice way to expose your Symfony2 routing to client applications.", + "homepage": "http://friendsofsymfony.github.com", + "keywords": [ + "Js Routing", + "javascript", + "routing" + ], + "support": { + "issues": "https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/issues", + "source": "https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/tree/2.8.0" + }, + "time": "2021-12-15T08:51:04+00:00" + }, + { + "name": "gedmo/doctrine-extensions", + "version": "v3.13.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", + "reference": "291d0c527d2dc9ee07b888c9a4e2a179893f08ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/291d0c527d2dc9ee07b888c9a4e2a179893f08ab", + "reference": "291d0c527d2dc9ee07b888c9a4e2a179893f08ab", + "shasum": "" + }, + "require": { + "behat/transliterator": "^1.2", + "doctrine/annotations": "^1.13 || ^2.0", + "doctrine/collections": "^1.2 || ^2.0", + "doctrine/common": "^2.13 || ^3.0", + "doctrine/event-manager": "^1.2 || ^2.0", + "doctrine/persistence": "^2.2 || ^3.0", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/cache": "^4.4 || ^5.3 || ^6.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1 || ^3.0 <3.2", + "doctrine/mongodb-odm": "<2.3", + "doctrine/orm": "<2.10.2 || 2.16.0 || 2.16.1", + "sebastian/comparator": "<2.0" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/doctrine-bundle": "^2.3", + "doctrine/mongodb-odm": "^2.3", + "doctrine/orm": "^2.10.2", + "friendsofphp/php-cs-fixer": "^3.4.0 <3.10", + "nesbot/carbon": "^2.55", + "phpstan/phpstan": "^1.10.2", + "phpstan/phpstan-doctrine": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.5", + "rector/rector": "^0.15.20", + "symfony/console": "^4.4 || ^5.3 || ^6.0", + "symfony/phpunit-bridge": "^6.0", + "symfony/yaml": "^4.4 || ^5.3 || ^6.0" + }, + "suggest": { + "doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM", + "doctrine/orm": "to use the extensions with the ORM" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.13-dev" + } + }, + "autoload": { + "psr-4": { + "Gedmo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gediminas Morkevicius", + "email": "gediminas.morkevicius@gmail.com" + }, + { + "name": "Gustavo Falco", + "email": "comfortablynumb84@gmail.com" + }, + { + "name": "David Buchmann", + "email": "david@liip.ch" + } + ], + "description": "Doctrine behavioral extensions", + "homepage": "http://gediminasm.org/", + "keywords": [ + "Blameable", + "behaviors", + "doctrine", + "extensions", + "gedmo", + "loggable", + "nestedset", + "odm", + "orm", + "sluggable", + "sortable", + "timestampable", + "translatable", + "tree", + "uploadable" + ], + "support": { + "email": "gediminas.morkevicius@gmail.com", + "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.13.0", + "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" + }, + "funding": [ + { + "url": "https://github.com/l3pp4rd", + "type": "github" + }, + { + "url": "https://github.com/mbabker", + "type": "github" + }, + { + "url": "https://github.com/phansys", + "type": "github" + }, + { + "url": "https://github.com/stof", + "type": "github" + } + ], + "time": "2023-09-06T13:16:12+00:00" + }, + { + "name": "gregwar/captcha", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Gregwar/Captcha.git", + "reference": "229d3cdfe33d6f1349e0aec94a26e9205a6db08e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/229d3cdfe33d6f1349e0aec94a26e9205a6db08e", + "reference": "229d3cdfe33d6f1349e0aec94a26e9205a6db08e", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "php": ">=5.3.0", + "symfony/finder": "*" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gregwar\\": "src/Gregwar" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Passault", + "email": "g.passault@gmail.com", + "homepage": "http://www.gregwar.com/" + }, + { + "name": "Jeremy Livingston", + "email": "jeremy.j.livingston@gmail.com" + } + ], + "description": "Captcha generator", + "homepage": "https://github.com/Gregwar/Captcha", + "keywords": [ + "bot", + "captcha", + "spam" + ], + "support": { + "issues": "https://github.com/Gregwar/Captcha/issues", + "source": "https://github.com/Gregwar/Captcha/tree/v1.2.1" + }, + "time": "2023-09-26T13:45:37+00:00" + }, + { + "name": "gregwar/captcha-bundle", + "version": "v2.1.5", + "source": { + "type": "git", + "url": "https://github.com/Gregwar/CaptchaBundle.git", + "reference": "2f96c759abae9c914856b9b9fc909268ba98a625" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/2f96c759abae9c914856b9b9fc909268ba98a625", + "reference": "2f96c759abae9c914856b9b9fc909268ba98a625", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "gregwar/captcha": "^1.1.9", + "php": ">=7.1.3", + "symfony/form": "~4.0|~5.0", + "symfony/framework-bundle": "~4.0|~5.0", + "symfony/translation": "~4.0|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "require-dev": { + "symplify/easy-coding-standard": "^6.1" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Gregwar\\CaptchaBundle\\": "/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Passault", + "email": "g.passault@gmail.com", + "homepage": "http://www.gregwar.com/" + }, + { + "name": "Jeremy Livingston", + "email": "jeremy.j.livingston@gmail.com" + } + ], + "description": "Captcha bundle", + "homepage": "https://github.com/Gregwar/CaptchaBundle", + "keywords": [ + "Symfony2", + "bot", + "captcha", + "code", + "security", + "spam", + "symfony", + "visual" + ], + "support": { + "issues": "https://github.com/Gregwar/CaptchaBundle/issues", + "source": "https://github.com/Gregwar/CaptchaBundle/tree/v2.1.5" + }, + "time": "2021-04-20T07:20:37+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.8", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.9", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-06-20T22:16:07+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-05-21T12:31:43+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:00:37+00:00" + }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7||^2.0", + "php": ">=7.3", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" + }, + "time": "2021-07-21T13:50:14+00:00" + }, + { + "name": "ibexa/admin-ui", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/admin-ui.git", + "reference": "f239e20fbb783fbe6a3cdae49a63273e00a5f332" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/admin-ui/zipball/f239e20fbb783fbe6a3cdae49a63273e00a5f332", + "reference": "f239e20fbb783fbe6a3cdae49a63273e00a5f332", + "shasum": "" + }, + "require": { + "babdev/pagerfanta-bundle": "^2.1", + "ext-json": "*", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "jms/translation-bundle": "^1.5", + "knplabs/knp-menu-bundle": "^3.0", + "mck89/peast": "^1.9", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/deprecation-contracts": "^2.5", + "symfony/event-dispatcher": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.0", + "symfony/translation": "^5.0", + "symfony/validator": "^5.0", + "symfony/webpack-encore-bundle": "^v1.17", + "symfony/yaml": "^5.0", + "twig/intl-extra": "^3.0", + "twig/string-extra": "^3.0", + "twig/twig": "^3.0", + "willdurand/js-translation-bundle": "^4.0" + }, + "replace": { + "ezsystems/ezplatform-admin-ui": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/behat": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/test-core": "^0.1", + "ibexa/test-rest": "^0.1", + "matthiasnoback/symfony-dependency-injection-test": "^4.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.1" + }, + "type": "project", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\AdminUi\\": "src/lib/", + "Ibexa\\Bundle\\AdminUi\\": "src/bundle/", + "Ibexa\\Platform\\Assets\\": "src/lib/", + "Ibexa\\Contracts\\AdminUi\\": "src/contracts/", + "EzSystems\\EzPlatformAdminUi\\": "src/lib/", + "Ibexa\\Platform\\Bundle\\Assets\\": "src/bundle/", + "EzSystems\\EzPlatformEncoreBundle\\": "src/bundle/", + "EzSystems\\EzPlatformAdminUiBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa Admin Ui", + "support": { + "issues": "https://github.com/ibexa/admin-ui/issues", + "source": "https://github.com/ibexa/admin-ui/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:40+00:00" + }, + { + "name": "ibexa/admin-ui-assets", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/admin-ui-assets.git", + "reference": "f7a1c8b1046aa2897566e1913f9a8c4efeaaed02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/admin-ui-assets/zipball/f7a1c8b1046aa2897566e1913f9a8c4efeaaed02", + "reference": "f7a1c8b1046aa2897566e1913f9a8c4efeaaed02", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "symfony/http-kernel": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-admin-ui-assets": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\AdminUiAssets\\": "src/bundle/", + "EzSystems\\EzPlatformAdminUiAssetsBundle\\": "/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "eZ dev-team & eZ Community", + "homepage": "https://github.com/ezsystems/ezplatform/contributors" + } + ], + "description": "External assets dependencies for Ibexa AdminUI", + "support": { + "issues": "https://github.com/ibexa/admin-ui-assets/issues", + "source": "https://github.com/ibexa/admin-ui-assets/tree/v4.5.6" + }, + "time": "2024-03-04T10:23:51+00:00" + }, + { + "name": "ibexa/calendar", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/calendar.git", + "reference": "d7f65dcb9f62ddb3a59d2646e3ac2977b50386aa" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/calendar/ibexa-calendar-d7f65dcb9f62ddb3a59d2646e3ac2977b50386aa-zip-4cbbf1.zip", + "reference": "d7f65dcb9f62ddb3a59d2646e3ac2977b50386aa" + }, + "require": { + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/rest": "~4.5.0", + "jms/translation-bundle": "^1.5", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-calendar": "*" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.0", + "phpunit/phpunit": "^8.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "EzSystems\\EzPlatformCalendarBundle\\": "src/bundle/", + "EzSystems\\EzPlatformCalendar\\": "src/lib/", + "Ibexa\\Calendar\\": "src/lib/", + "Ibexa\\Bundle\\Calendar\\": "src/bundle/", + "Ibexa\\Contracts\\Calendar\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "EzSystems\\EzPlatformCalendarBundle\\Tests\\": "tests/bundle/", + "EzSystems\\EzPlatformCalendar\\Tests\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Calendar\\": "tests/bundle/", + "Ibexa\\Tests\\Calendar\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Calendar", + "support": { + "source": "https://github.com/ibexa/calendar/tree/v4.5.6", + "issues": "https://github.com/ibexa/calendar/issues" + }, + "time": "2024-03-20T14:43:42+00:00" + }, + { + "name": "ibexa/connect", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/connect.git", + "reference": "88adcd0f1b29f98e0769690fef9b54414e849c81" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/connect/ibexa-connect-88adcd0f1b29f98e0769690fef9b54414e849c81-zip-52ba85.zip", + "reference": "88adcd0f1b29f98e0769690fef9b54414e849c81" + }, + "require": { + "ibexa/core": "~4.5", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.4", + "symfony/config": "^5.4", + "symfony/dependency-injection": "^5.4", + "symfony/event-dispatcher": "^5.4", + "symfony/form": "^5.4", + "symfony/http-client": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/yaml": "^5.4" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6", + "ext-json": "*", + "ibexa/admin-ui": "~4.5", + "ibexa/calendar": "~4.5", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5", + "ibexa/design-engine": "~4.5", + "ibexa/doctrine-schema": "~4.5", + "ibexa/fieldtype-page": "~4.5", + "ibexa/fieldtype-richtext": "~4.5", + "ibexa/form-builder": "~4.5", + "ibexa/http-cache": "~4.5", + "ibexa/icons": "~4.5", + "ibexa/page-builder": "~4.5", + "ibexa/rest": "~4.5", + "ibexa/search": "~4.5", + "ibexa/user": "~4.5", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.2", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "symfony/proxy-manager-bridge": "^5.4" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\Connect\\": "src/bundle/", + "Ibexa\\Contracts\\Connect\\": "src/contracts/", + "Ibexa\\Connect\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\Connect\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\Connect\\": "tests/integration/", + "Ibexa\\Tests\\Connect\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "integration": [ + "phpunit -c phpunit-integration.xml" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/connect/tree/v4.5.6", + "issues": "https://github.com/ibexa/connect/issues" + }, + "time": "2024-03-20T14:45:23+00:00" + }, + { + "name": "ibexa/connector-dam", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/connector-dam.git", + "reference": "f66860b4da92a25edb0a2a1ad6ce95549e5aef7c" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/connector-dam/ibexa-connector-dam-f66860b4da92a25edb0a2a1ad6ce95549e5aef7c-zip-384cda.zip", + "reference": "f66860b4da92a25edb0a2a1ad6ce95549e5aef7c" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/translation": "^5.0", + "twig/twig": "^3.0" + }, + "replace": { + "ezsystems/ezplatform-connector-dam": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Platform\\Bundle\\Connector\\Dam\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\Connector\\Dam\\": "src/contracts/", + "Ibexa\\Platform\\Connector\\Dam\\": "src/lib/", + "Ibexa\\Connector\\Dam\\": "src/lib/", + "Ibexa\\Bundle\\Connector\\Dam\\": "src/bundle/", + "Ibexa\\Contracts\\Connector\\Dam\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Platform\\Tests\\Bundle\\Connector\\Dam\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\Connector\\Dam\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Connector\\Dam\\": "tests/bundle/", + "Ibexa\\Tests\\Connector\\Dam\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP DAM Connector bundle", + "support": { + "source": "https://github.com/ibexa/connector-dam/tree/v4.5.6", + "issues": "https://github.com/ibexa/connector-dam/issues" + }, + "time": "2024-03-20T14:43:43+00:00" + }, + { + "name": "ibexa/content", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/content.git", + "reference": "dae358a0276c026c5bee5af832214730df9b0187" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/content/zipball/dae358a0276c026c5bee5af832214730df9b0187", + "reference": "dae358a0276c026c5bee5af832214730df9b0187", + "shasum": "" + }, + "require": { + "gregwar/captcha-bundle": "^2.1", + "ibexa/calendar": "4.5.6", + "ibexa/connect": "4.5.6", + "ibexa/connector-dam": "4.5.6", + "ibexa/content-tree": "4.5.6", + "ibexa/elasticsearch": "4.5.6", + "ibexa/fastly": "4.5.6", + "ibexa/icons": "4.5.6", + "ibexa/image-editor": "4.5.6", + "ibexa/installer": "4.5.6", + "ibexa/measurement": "4.5.6", + "ibexa/migrations": "4.5.6", + "ibexa/oauth2-client": "4.5.6", + "ibexa/oss": "4.5.6", + "ibexa/personalization": "4.5.6", + "ibexa/product-catalog": "4.5.6", + "ibexa/scheduler": "4.5.6", + "ibexa/seo": "4.5.6", + "ibexa/taxonomy": "4.5.6", + "ibexa/tree-builder": "4.5.6", + "ibexa/version-comparison": "4.5.6", + "ibexa/workflow": "4.5.6", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ibexa/ci-scripts": "^0.2@dev" + }, + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-master": "4.5.x-dev" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "license": [ + "proprietary" + ], + "description": "A meta package for installing Ibexa DXP Content edition", + "support": { + "source": "https://github.com/ibexa/content/tree/v4.5.6", + "issues": "https://github.com/ibexa/content/issues" + }, + "time": "2024-03-20T14:53:00+00:00" + }, + { + "name": "ibexa/content-forms", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/content-forms.git", + "reference": "7b3fc0e257cf89b72b112357d1db2adb4b9c54a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/content-forms/zipball/7b3fc0e257cf89b72b112357d1db2adb4b9c54a3", + "reference": "7b3fc0e257cf89b72b112357d1db2adb4b9c54a3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ibexa/core": "~4.5.0", + "jms/translation-bundle": "^1.5", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/translation": " ^5.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-content-forms": "*" + }, + "require-dev": { + "behat/behat": "^3.5", + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/behat": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.0", + "phpunit/phpunit": "^8.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\ContentForms\\": "src/lib/", + "Ibexa\\Bundle\\ContentForms\\": "src/bundle/", + "Ibexa\\Contracts\\ContentForms\\": "src/contracts/", + "EzSystems\\EzPlatformContentForms\\": "src/lib/", + "EzSystems\\EzPlatformContentFormsBundle\\": "src/bundle/", + "EzSystems\\EzPlatformContentForms\\Features\\": "features/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Use Symfony Forms with Ibexa Content & User objects", + "support": { + "issues": "https://github.com/ibexa/content-forms/issues", + "source": "https://github.com/ibexa/content-forms/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:47+00:00" + }, + { + "name": "ibexa/content-tree", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/content-tree.git", + "reference": "8ddc1a19d9bd705335708b09b5ffe2ccd6f0e77e" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/content-tree/ibexa-content-tree-8ddc1a19d9bd705335708b09b5ffe2ccd6f0e77e-zip-600b34.zip", + "reference": "8ddc1a19d9bd705335708b09b5ffe2ccd6f0e77e" + }, + "require": { + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/tree-builder": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/event-dispatcher-contracts": "^2.3", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/yaml": "^5.3" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "phpstan/phpstan": "^0.12.75", + "phpstan/phpstan-phpunit": "^0.12.17", + "phpunit/phpunit": "^9" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\ContentTree\\": "src/bundle/", + "Ibexa\\Contracts\\ContentTree\\": "src/contracts/", + "Ibexa\\ContentTree\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Platform\\Tests\\Bundle\\ContentTree\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\Integration\\ContentTree\\": "tests/integration/", + "Ibexa\\Platform\\Tests\\ContentTree\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "description": "Content Tree bundle for Ibexa DXP", + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/content-tree/tree/v4.5.6", + "issues": "https://github.com/ibexa/content-tree/issues" + }, + "time": "2024-03-20T14:45:00+00:00" + }, + { + "name": "ibexa/core", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/core.git", + "reference": "f0e7e5386fe35216b66f3ebf753961a0a2a0d48f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/core/zipball/f0e7e5386fe35216b66f3ebf753961a0a2a0d48f", + "reference": "f0e7e5386fe35216b66f3ebf753961a0a2a0d48f", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/dbal": "^2.13.0", + "doctrine/doctrine-bundle": "^2.0", + "doctrine/orm": "^2.7", + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-pdo": "*", + "ext-spl": "*", + "ext-xsl": "*", + "friendsofphp/proxy-manager-lts": "^1.0", + "friendsofsymfony/http-cache-bundle": "^2.8", + "friendsofsymfony/jsrouting-bundle": "^2.5", + "guzzlehttp/guzzle": "^6.5", + "ibexa/doctrine-schema": "~4.5.0", + "jms/translation-bundle": "^1.5", + "league/flysystem-memory": "^2.0.6", + "liip/imagine-bundle": "^2.3", + "nelmio/cors-bundle": "^2.0", + "oneup/flysystem-bundle": "^4.4.2", + "pagerfanta/pagerfanta": "^2.1", + "php": "^7.4 || ^8.0", + "php-http/guzzle6-adapter": "^2.0", + "psr/event-dispatcher": "^1.0", + "sensio/framework-extra-bundle": "^6.1", + "symfony-cmf/routing": "^2.3", + "symfony/cache": "^5.3.0", + "symfony/console": "^5.3.0", + "symfony/dependency-injection": "^5.3.0", + "symfony/event-dispatcher": "^5.3.0", + "symfony/expression-language": "^5.3.0", + "symfony/framework-bundle": "^5.3.0", + "symfony/http-client": "^5.3.0", + "symfony/http-foundation": "^5.3.0", + "symfony/http-kernel": "^5.3.0", + "symfony/mime": "^5.3.0", + "symfony/polyfill-php80": "^1.27", + "symfony/process": "^5.3.0", + "symfony/security-bundle": "^5.3.0", + "symfony/security-core": "^5.3.0", + "symfony/security-http": "^5.3.0", + "symfony/serializer": "^5.3.0", + "symfony/templating": "^5.3.0", + "symfony/translation": "^5.3.0", + "symfony/validator": "^5.3.0", + "symfony/var-dumper": "^5.3.0", + "symfony/yaml": "^5.3.0", + "twig/extra-bundle": "^3.0", + "twig/twig": "^3.0" + }, + "conflict": { + "doctrine/dbal": "2.7.0", + "ezsystems/ezpublish-legacy": "*", + "friendsofphp/php-cs-fixer": "3.5.0", + "phpunit/phpunit": "8.4.0", + "symfony/dependency-injection": "5.3.7", + "symfony/security-core": "5.3.0" + }, + "replace": { + "ezsystems/ezplatform-kernel": "*" + }, + "require-dev": { + "behat/behat": "^3.6.1", + "friends-of-behat/mink-extension": "^2.4", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "jenner/simple_fork": "^1.2", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.2", + "symfony/phpunit-bridge": "^5.1", + "symfony/proxy-manager-bridge": "^5.3", + "symfony/runtime": "^5.3.0" + }, + "suggest": { + "php-64bit": "For support of more than 30 languages, a 64bit php installation on all involved prod/dev machines is required" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + }, + "thanks": { + "name": "ezsystems/ezplatform", + "url": "https://github.com/ezsystems/ezplatform" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Core\\": "src/lib", + "eZ\\Publish\\API\\": "src/contracts", + "eZ\\Publish\\SPI\\": "src/contracts", + "Ibexa\\Bundle\\IO\\": "src/bundle/IO", + "eZ\\Publish\\Core\\": "src/lib", + "Ibexa\\Tests\\Core\\": "tests/lib", + "Ibexa\\Bundle\\Core\\": "src/bundle/Core", + "Ibexa\\Bundle\\Debug\\": "src/bundle/Debug", + "Ibexa\\Contracts\\Core\\": "src/contracts", + "eZ\\Publish\\SPI\\Tests\\": "src/contracts/Test", + "Ibexa\\Tests\\Bundle\\Core\\": "tests/bundle/Core", + "eZ\\Bundle\\EzPublishIOBundle\\": "src/bundle/IO", + "Ibexa\\Tests\\Integration\\Core\\": "tests/integration/Core", + "eZ\\Bundle\\EzPublishCoreBundle\\": "src/bundle/Core", + "eZ\\Bundle\\EzPublishDebugBundle\\": "src/bundle/Debug", + "Ibexa\\Bundle\\LegacySearchEngine\\": "src/bundle/LegacySearchEngine", + "eZ\\Publish\\API\\Repository\\Tests\\": "src/contracts/Test/Repository", + "Ibexa\\Bundle\\RepositoryInstaller\\": "src/bundle/RepositoryInstaller", + "EzSystems\\PlatformInstallerBundle\\": "src/bundle/RepositoryInstaller", + "eZ\\Bundle\\EzPublishCoreBundle\\Tests\\": "tests/bundle/Core", + "eZ\\Publish\\Core\\Persistence\\Legacy\\Tests\\": "tests/lib/Persistence/Legacy", + "eZ\\Bundle\\EzPublishLegacySearchEngineBundle\\": "src/bundle/LegacySearchEngine", + "eZ\\Publish\\Core\\MVC\\Symfony\\Templating\\Tests\\": "tests/lib/MVC/Symfony/Templating" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(GPL-2.0-only or proprietary)" + ], + "description": "Ibexa DXP and Open Source core. Provides the Content Repository, its APIs, and the application's Symfony framework integration.", + "homepage": "https://ibexa.co", + "support": { + "source": "https://github.com/ibexa/core/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:11+00:00" + }, + { + "name": "ibexa/corporate-account", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/corporate-account.git", + "reference": "ce223ce466143283fd21ac5ea3e0f6c0ea1ec5c3" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/corporate-account/ibexa-corporate-account-ce223ce466143283fd21ac5ea3e0f6c0ea1ec5c3-zip-23c668.zip", + "reference": "ce223ce466143283fd21ac5ea3e0f6c0ea1ec5c3" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/calendar": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/fieldtype-address": "~4.5.0", + "ibexa/product-catalog": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/segmentation": "~4.5.0", + "ibexa/taxonomy": "~4.5.0", + "ibexa/user": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/rate-limiter": "^5.0", + "symfony/routing": "^5.0", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.0", + "symfony/translation": "^5.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6.7", + "ibexa/behat": "~4.5.0", + "ibexa/cdp": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/commerce-checkout": "~4.5.0", + "ibexa/commerce-shop": "~4.5.0", + "ibexa/commerce-transaction": "4.5", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/elasticsearch": "~4.5.0", + "ibexa/fieldtype-matrix": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/installer": "~4.5.0", + "ibexa/migrations": "~4.5.0", + "ibexa/page-builder": "~4.5.0", + "ibexa/personalization": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/solr": "~4.5.0", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/phpunit-bridge": "^5.3" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\CorporateAccount\\": "src/bundle/", + "Ibexa\\Contracts\\CorporateAccount\\": "src/contracts/", + "Ibexa\\CorporateAccount\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\CorporateAccount\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\CorporateAccount\\": "tests/integration/", + "Ibexa\\Tests\\CorporateAccount\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix -v --show-progress=dots" + ], + "check-cs": [ + "php-cs-fixer fix --dry-run -v --show-progress=dots" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "test-integration": [ + "phpunit -c phpunit.integration.xml.dist" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/corporate-account/tree/v4.5.6", + "issues": "https://github.com/ibexa/corporate-account/issues" + }, + "time": "2024-03-20T14:45:11+00:00" + }, + { + "name": "ibexa/cron", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/cron.git", + "reference": "5bb99eafa2569e3c656463cad4d6d4601d110399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/cron/zipball/5bb99eafa2569e3c656463cad4d6d4601d110399", + "reference": "5bb99eafa2569e3c656463cad4d6d4601d110399", + "shasum": "" + }, + "require": { + "cron/cron": "^1.4", + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/process": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-cron": "*", + "ezsystems/ezstudio-cron": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "phpunit/phpunit": "^6.4 || ^7.0" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Cron\\": "src/lib/", + "Ibexa\\Bundle\\Cron\\": "src/bundle/", + "Ibexa\\Contracts\\Cron\\": "src/contracts/", + "EzSystems\\EzPlatformCronBundle\\": "src/bundle" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Simple cron bundle for Ibexa", + "support": { + "issues": "https://github.com/ibexa/cron/issues", + "source": "https://github.com/ibexa/cron/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:49+00:00" + }, + { + "name": "ibexa/design-engine", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/design-engine.git", + "reference": "aa4de16d510b2431e078bc594c8a35ee625ff1e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/design-engine/zipball/aa4de16d510b2431e078bc594c8a35ee625ff1e3", + "reference": "aa4de16d510b2431e078bc594c8a35ee625ff1e3", + "shasum": "" + }, + "require": { + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/finder": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/templating": "^5.0", + "twig/twig": "^3.0" + }, + "conflict": { + "lolautruche/ez-core-extra-bundle": "<2.0" + }, + "replace": { + "ezsystems/ezplatform-design-engine": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "^8.1" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\DesignEngine\\": "src/lib/", + "Ibexa\\Bundle\\DesignEngine\\": "src/bundle/", + "Ibexa\\Contracts\\DesignEngine\\": "src/contracts/", + "EzSystems\\EzPlatformDesignEngine\\": "src/lib/", + "EzSystems\\EzPlatformDesignEngineBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Jerome Vieilledent", + "email": "jerome@vieilledent.fr" + }, + { + "name": "Ibexa Engineering & Community", + "homepage": "https://www.ibexa.co/products" + } + ], + "description": "Design fallback mechanism for Ibexa", + "support": { + "issues": "https://github.com/ibexa/design-engine/issues", + "source": "https://github.com/ibexa/design-engine/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:50+00:00" + }, + { + "name": "ibexa/doctrine-schema", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/doctrine-schema.git", + "reference": "3fd43cdf1c8dd91f77b3367d6f40817952a8b28b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/doctrine-schema/zipball/3fd43cdf1c8dd91f77b3367d6f40817952a8b28b", + "reference": "3fd43cdf1c8dd91f77b3367d6f40817952a8b28b", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.13", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/yaml": "^5.3" + }, + "replace": { + "ezsystems/doctrine-dbal-schema": "*" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.2", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\DoctrineSchema\\": "src/lib/", + "EzSystems\\DoctrineSchema\\": "src/lib", + "Ibexa\\Bundle\\DoctrineSchema\\": "src/bundle/", + "EzSystems\\DoctrineSchemaBundle\\": "src/bundle", + "Ibexa\\Contracts\\DoctrineSchema\\": "src/contracts/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Abstraction layer, on top of Doctrine, for cross-DBMS schema import", + "support": { + "issues": "https://github.com/ibexa/doctrine-schema/issues", + "source": "https://github.com/ibexa/doctrine-schema/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:03+00:00" + }, + { + "name": "ibexa/elasticsearch", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/elasticsearch.git", + "reference": "c98eed0fb941adfc7a479b7d1ff9d964dd1bde6e" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/elasticsearch/ibexa-elasticsearch-c98eed0fb941adfc7a479b7d1ff9d964dd1bde6e-zip-d486d7.zip", + "reference": "c98eed0fb941adfc7a479b7d1ff9d964dd1bde6e" + }, + "require": { + "elasticsearch/elasticsearch": "^7.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "psr/log": "^1.1", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/event-dispatcher-contracts": "^2.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-elastic-search-engine": "*" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.2", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Elasticsearch\\": "src/lib/", + "Ibexa\\Bundle\\Elasticsearch\\": "src/bundle/", + "Ibexa\\Contracts\\Elasticsearch\\": "src/contracts/", + "Ibexa\\Platform\\Bundle\\ElasticSearchEngine\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\ElasticSearchEngine\\": "src/contracts/", + "Ibexa\\Platform\\ElasticSearchEngine\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Elasticsearch\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Elasticsearch\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\Elasticsearch\\": "tests/integration", + "Ibexa\\Platform\\Bundle\\ElasticSearchEngine\\Tests\\": "tests/bundle/", + "Ibexa\\Platform\\ElasticSearchEngine\\Integration\\Tests\\": "tests/integration/", + "Ibexa\\Platform\\ElasticSearchEngine\\Tests\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "phpstan": [ + "phpstan analyse" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Elasticsearch search engine Bundle", + "support": { + "source": "https://github.com/ibexa/elasticsearch/tree/v4.5.6", + "issues": "https://github.com/ibexa/elasticsearch/issues" + }, + "time": "2024-03-20T14:43:52+00:00" + }, + { + "name": "ibexa/experience", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/experience.git", + "reference": "380865f359af0a30f277fe5059f51c541faaf7b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/experience/zipball/380865f359af0a30f277fe5059f51c541faaf7b7", + "reference": "380865f359af0a30f277fe5059f51c541faaf7b7", + "shasum": "" + }, + "require": { + "ibexa/content": "4.5.6", + "ibexa/corporate-account": "4.5.6", + "ibexa/fieldtype-address": "4.5.6", + "ibexa/fieldtype-page": "4.5.6", + "ibexa/form-builder": "4.5.6", + "ibexa/page-builder": "4.5.6", + "ibexa/permissions": "4.5.6", + "ibexa/segmentation": "4.5.6", + "ibexa/site-factory": "4.5.6", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ibexa/ci-scripts": "^0.2@dev" + }, + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-master": "4.5.x-dev" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "license": [ + "proprietary" + ], + "description": "A meta package for installing Ibexa DXP Experience edition", + "support": { + "source": "https://github.com/ibexa/experience/tree/v4.5.6", + "issues": "https://github.com/ibexa/experience/issues" + }, + "time": "2024-03-20T14:58:48+00:00" + }, + { + "name": "ibexa/fastly", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/fastly.git", + "reference": "e94c1230cf119e613f922d7deccc2eaa82f8bb14" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/fastly/ibexa-fastly-e94c1230cf119e613f922d7deccc2eaa82f8bb14-zip-125ee5.zip", + "reference": "e94c1230cf119e613f922d7deccc2eaa82f8bb14" + }, + "require": { + "ext-fileinfo": "*", + "friendsofsymfony/http-cache-bundle": "^2.8", + "ibexa/core": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-http-cache-fastly": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/rest": "~4.5.0", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Fastly\\": "src/lib/", + "Ibexa\\Bundle\\Fastly\\": "src/bundle/", + "Ibexa\\Contracts\\Fastly\\": "src/contracts/", + "EzSystems\\PlatformFastlyCacheBundle\\": "src/bundle/" + } + }, + "autoload-dev": { + "psr-4": { + "EzSystems\\PlatformFastlyCacheBundle\\Tests\\": "tests", + "Ibexa\\Tests\\Fastly\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Fastly\\": "tests/bundle/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "phpstan": [ + "phpstan analyse src/ tests/" + ] + }, + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Fastly HTTP cache handling for Ibexa DXP.", + "support": { + "source": "https://github.com/ibexa/fastly/tree/v4.5.6", + "issues": "https://github.com/ibexa/fastly/issues" + }, + "time": "2024-03-20T14:44:00+00:00" + }, + { + "name": "ibexa/fieldtype-address", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/fieldtype-address.git", + "reference": "55d9b31a085775060c1baaa89f8eee2d38bcdc19" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/fieldtype-address/ibexa-fieldtype-address-55d9b31a085775060c1baaa89f8eee2d38bcdc19-zip-1d34da.zip", + "reference": "55d9b31a085775060c1baaa89f8eee2d38bcdc19" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.0", + "symfony/translation": "^5.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0" + }, + "require-dev": { + "ibexa/behat": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-symfony": "^1.2", + "phpunit/phpunit": "^8.1" + }, + "type": "project", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\FieldTypeAddress\\": "src/lib/", + "Ibexa\\Bundle\\FieldTypeAddress\\": "src/bundle/", + "Ibexa\\Contracts\\FieldTypeAddress\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\FieldTypeAddress\\": "tests/bundle/", + "Ibexa\\Tests\\FieldTypeAddress\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "phpstan": [ + "phpstan analyse" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa Address Field Type", + "support": { + "source": "https://github.com/ibexa/fieldtype-address/tree/v4.5.6", + "issues": "https://github.com/ibexa/fieldtype-address/issues" + }, + "time": "2024-03-20T14:45:13+00:00" + }, + { + "name": "ibexa/fieldtype-matrix", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/fieldtype-matrix.git", + "reference": "b9cf6f2966fab637bd91c43e231199da6efe3449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/fieldtype-matrix/zipball/b9cf6f2966fab637bd91c43e231199da6efe3449", + "reference": "b9cf6f2966fab637bd91c43e231199da6efe3449", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "ext-simplexml": "*", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/form": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-matrix-fieldtype": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/admin-ui": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\FieldTypeMatrix\\": "src/lib/", + "Ibexa\\Bundle\\FieldTypeMatrix\\": "src/bundle/", + "EzSystems\\EzPlatformMatrixFieldtype\\": "src/lib/", + "EzSystems\\EzPlatformMatrixFieldtypeBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Repository dedicated to Matrix Field Type for eZ Platform", + "support": { + "issues": "https://github.com/ibexa/fieldtype-matrix/issues", + "source": "https://github.com/ibexa/fieldtype-matrix/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:13+00:00" + }, + { + "name": "ibexa/fieldtype-page", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/fieldtype-page.git", + "reference": "e8c6ee83d2f5b325b1dc9ffdb5f92a6a5d76519c" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/fieldtype-page/ibexa-fieldtype-page-e8c6ee83d2f5b325b1dc9ffdb5f92a6a5d76519c-zip-a3c781.zip", + "reference": "e8c6ee83d2f5b325b1dc9ffdb5f92a6a5d76519c" + }, + "require": { + "doctrine/dbal": "^2.10", + "ext-dom": "*", + "ext-json": "*", + "ibexa/calendar": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "jms/serializer": "^3.5", + "nicmart/tree": "^0.2", + "php": "^7.4 || ^8.0", + "ramsey/uuid": "^3.9", + "scssphp/scssphp": "^1.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/finder": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/serializer": "^5.0", + "symfony/templating": "^5.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0", + "zetacomponents/feed": "^1.4" + }, + "replace": { + "ezsystems/ezplatform-page-fieldtype": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/admin-ui": "~4.5.0", + "ibexa/behat": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.2", + "phpunit/phpunit": "^8.2" + }, + "suggest": { + "ezsystems/ezplatform-graphql": "GraphQL server for eZ Platform." + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\FieldTypePage\\": "src/lib/", + "Ibexa\\Bundle\\FieldTypePage\\": "src/bundle/", + "Ibexa\\Contracts\\FieldTypePage\\": "src/contracts/", + "EzSystems\\EzPlatformPageFieldType\\": "src/lib/", + "EzSystems\\EzPlatformPageFieldTypeBundle\\": "src/bundle/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\FieldTypePage\\": "tests/bundle/", + "Ibexa\\Tests\\FieldTypePage\\": "tests/lib/", + "EzSystems\\EzPlatformPageFieldType\\Tests\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "test": [ + "phpunit -c phpunit.xml" + ] + }, + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Ibexa DXP Page FieldType", + "support": { + "source": "https://github.com/ibexa/fieldtype-page/tree/v4.5.6", + "issues": "https://github.com/ibexa/fieldtype-page/issues" + }, + "time": "2024-03-20T14:44:18+00:00" + }, + { + "name": "ibexa/fieldtype-query", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/fieldtype-query.git", + "reference": "94296b71f47ab61363069697a66572fb44106870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/fieldtype-query/zipball/94296b71f47ab61363069697a66572fb44106870", + "reference": "94296b71f47ab61363069697a66572fb44106870", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "ibexa/rest": "~4.5.0", + "php": "^7.4 || ^8.0", + "psr/log": "^1.1", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/expression-language": "^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/translation": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-query-fieldtype": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpspec/phpspec": "^7.1" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\FieldTypeQuery\\": "src/lib/", + "Ibexa\\Bundle\\FieldTypeQuery\\": "src/bundle/", + "Ibexa\\Contracts\\FieldTypeQuery\\": "src/contracts/", + "EzSystems\\EzPlatformQueryFieldType\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa Field Type that defines a query.", + "support": { + "issues": "https://github.com/ibexa/fieldtype-query/issues", + "source": "https://github.com/ibexa/fieldtype-query/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:23+00:00" + }, + { + "name": "ibexa/fieldtype-richtext", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/fieldtype-richtext.git", + "reference": "c2fc7c5ba7008126505936b39d135b83363b3c6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/fieldtype-richtext/zipball/c2fc7c5ba7008126505936b39d135b83363b3c6d", + "reference": "c2fc7c5ba7008126505936b39d135b83363b3c6d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-pdo": "*", + "ext-xsl": "*", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.1", + "symfony/cache": "^5.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/form": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/security-core": "^5.0", + "symfony/templating": "^5.0", + "symfony/translation": "^5.0", + "symfony/translation-contracts": "^2.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0", + "twig/twig": "^3.0" + }, + "replace": { + "ezsystems/ezplatform-richtext": "*" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6.7.5", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/solr": "~4.5.0", + "matthiasnoback/symfony-config-test": "^4.1", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.2", + "phpunit/phpunit": "^9.5", + "symfony/finder": "^5.0", + "symfony/proxy-manager-bridge": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\FieldTypeRichText\\": "src/lib/", + "EzSystems\\EzPlatformRichText\\": "src/lib", + "Ibexa\\Tests\\FieldTypeRichText\\": "tests/lib/", + "Ibexa\\Bundle\\FieldTypeRichText\\": "src/bundle/", + "Ibexa\\Contracts\\FieldTypeRichText\\": "src/contracts/", + "EzSystems\\EzPlatformRichTextBundle\\": "src/bundle" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa RichText Extension, including the RichText FieldType.", + "support": { + "issues": "https://github.com/ibexa/fieldtype-richtext/issues", + "source": "https://github.com/ibexa/fieldtype-richtext/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:27+00:00" + }, + { + "name": "ibexa/form-builder", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/form-builder.git", + "reference": "d5becadd64f43327f7a83850cac7a16ba7dedcb6" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/form-builder/ibexa-form-builder-d5becadd64f43327f7a83850cac7a16ba7dedcb6-zip-1a2dbb.zip", + "reference": "d5becadd64f43327f7a83850cac7a16ba7dedcb6" + }, + "require": { + "ext-json": "*", + "gregwar/captcha-bundle": "^2.1", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/page-builder": "~4.5.0", + "ibexa/user": "~4.5.0", + "jms/serializer": "^3.5", + "php": "^7.4 || ^8.0", + "swiftmailer/swiftmailer": "^6.2", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/translation": "^5.0", + "symfony/translation-contracts": "^2.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0", + "twig/twig": "^3.0" + }, + "replace": { + "ezsystems/ezplatform-form-builder": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/behat": "~4.5.0", + "ibexa/calendar": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-phpunit": "^1.2", + "phpstan/phpstan-symfony": "^1.2", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "EzSystems\\EzPlatformFormBuilderBundle\\": "src/bundle/", + "EzSystems\\EzPlatformFormBuilder\\": "src/lib/", + "Ibexa\\FormBuilder\\": "src/lib/", + "Ibexa\\Bundle\\FormBuilder\\": "src/bundle/", + "Ibexa\\Contracts\\FormBuilder\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "EzSystems\\EzPlatformFormBuilder\\Tests\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\FormBuilder\\": "tests/bundle/", + "Ibexa\\Tests\\FormBuilder\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Form Builder", + "support": { + "source": "https://github.com/ibexa/form-builder/tree/v4.5.6", + "issues": "https://github.com/ibexa/form-builder/issues" + }, + "time": "2024-03-20T14:43:54+00:00" + }, + { + "name": "ibexa/graphql", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/graphql.git", + "reference": "5ab4b80a89f890854f5261cd97f6277a6bed6cfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/graphql/zipball/5ab4b80a89f890854f5261cd97f6277a6bed6cfb", + "reference": "5ab4b80a89f890854f5261cd97f6277a6bed6cfb", + "shasum": "" + }, + "require": { + "erusev/parsedown": "^1.7", + "ext-dom": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/rest": "~4.5.0", + "lexik/jwt-authentication-bundle": "^2.8", + "overblog/graphql-bundle": "^0.14.2", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/filesystem": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/serializer": "^5.0", + "symfony/yaml": "^5.0" + }, + "conflict": { + "webonyx/graphql-php": ">= 15.0.0" + }, + "replace": { + "bdunogier/ezplatform-graphql-bundle": "self.version", + "ezsystems/ezplatform-graphql": "*" + }, + "require-dev": { + "ibexa/code-style": "~1.2.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "mikey179/vfsstream": "^1.6", + "overblog/graphiql-bundle": "^0.2", + "phpspec/phpspec": "^7.1" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\GraphQL\\": "src/lib/", + "Ibexa\\Bundle\\GraphQL\\": "src/bundle/", + "Ibexa\\Contracts\\GraphQL\\": "src/contracts/", + "EzSystems\\EzPlatformGraphQL\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Bertrand Dunogier", + "email": "bertrand.dunogier@ibexa.co" + } + ], + "description": "GraphQL server for Ibexa", + "support": { + "issues": "https://github.com/ibexa/graphql/issues", + "source": "https://github.com/ibexa/graphql/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:56+00:00" + }, + { + "name": "ibexa/http-cache", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/http-cache.git", + "reference": "8920edbb009359c60b6c492d01831111da3b422e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/http-cache/zipball/8920edbb009359c60b6c492d01831111da3b422e", + "reference": "8920edbb009359c60b6c492d01831111da3b422e", + "shasum": "" + }, + "require": { + "friendsofsymfony/http-cache": "^2.9", + "friendsofsymfony/http-cache-bundle": "^2.8", + "ibexa/core": "~4.5", + "ibexa/rest": "~4.5.0", + "php": "^7.4 || ^8.0", + "php-http/curl-client": "^2.1", + "psr/http-client": "^1.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/routing": "^5.0", + "symfony/yaml": "^5.0", + "toflar/psr6-symfony-http-cache-store": "^2.2 || ^3.0" + }, + "replace": { + "ezsystems/ezplatform-http-cache": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.3", + "phpspec/phpspec": "^7.1", + "phpunit/phpunit": "^8.5", + "symfony/phpunit-bridge": "^5.1" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\HttpCache\\": "src/lib/", + "Ibexa\\Bundle\\HttpCache\\": "src/bundle/", + "Ibexa\\Contracts\\HttpCache\\": "src/contracts/", + "EzSystems\\PlatformHttpCacheBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "eZ Systems", + "email": "dev-team@ibexa.co" + } + ], + "description": "HTTP cache handling for Ibexa DXP.", + "support": { + "issues": "https://github.com/ibexa/http-cache/issues", + "source": "https://github.com/ibexa/http-cache/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:58+00:00" + }, + { + "name": "ibexa/i18n", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/i18n.git", + "reference": "80aeccbc78a7ddc325b2833264970b049ed5b938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/i18n/zipball/80aeccbc78a7ddc325b2833264970b049ed5b938", + "reference": "80aeccbc78a7ddc325b2833264970b049ed5b938", + "shasum": "" + }, + "require": { + "ibexa/core": "~4.5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(GPL-2.0-only or proprietary)" + ], + "description": "Ibexa translations", + "support": { + "issues": "https://github.com/ibexa/i18n/issues", + "source": "https://github.com/ibexa/i18n/tree/v4.5.6" + }, + "time": "2024-03-20T14:45:05+00:00" + }, + { + "name": "ibexa/icons", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/icons.git", + "reference": "36e956a1aa3dbd728bf9f2519e614f2694d5aa24" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/icons/ibexa-icons-36e956a1aa3dbd728bf9f2519e614f2694d5aa24-zip-051ce8.zip", + "reference": "36e956a1aa3dbd728bf9f2519e614f2694d5aa24" + }, + "require": { + "php": "^7.4 || ^8.0", + "symfony/config": "^5.1", + "symfony/dependency-injection": "^5.1", + "symfony/http-foundation": "^5.1", + "symfony/http-kernel": "^5.1" + }, + "replace": { + "ezsystems/ezplatform-icons": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "phpunit/phpunit": "^9.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Platform\\Bundle\\Icons\\": "src/bundle/", + "Ibexa\\Icons\\": "src/lib/", + "Ibexa\\Bundle\\Icons\\": "src/bundle/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP icons", + "support": { + "source": "https://github.com/ibexa/icons/tree/v4.5.6", + "issues": "https://github.com/ibexa/icons/issues" + }, + "time": "2024-03-20T14:44:02+00:00" + }, + { + "name": "ibexa/image-editor", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/image-editor.git", + "reference": "f8cefbb8817ff4c6bbe98d6c2af9f651595c2520" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/image-editor/ibexa-image-editor-f8cefbb8817ff4c6bbe98d6c2af9f651595c2520-zip-cafb25.zip", + "reference": "f8cefbb8817ff4c6bbe98d6c2af9f651595c2520" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "spatie/image-optimizer": "^1.6", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/form": "^5.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\ImageEditor\\": "src/lib/", + "Ibexa\\Bundle\\ImageEditor\\": "src/bundle/", + "Ibexa\\Contracts\\ImageEditor\\": "src/contracts/", + "Ibexa\\Platform\\Bundle\\ImageEditor\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\ImageEditor\\": "src/contracts/", + "Ibexa\\Platform\\ImageEditor\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Platform\\Tests\\Bundle\\ImageEditor\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\ImageEditor\\": "tests/lib/", + "Ibexa\\Tests\\ImageEditor\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\ImageEditor\\": "tests/bundle/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "php-cs-fixer fix --dry-run --diff -v --show-progress=dots" + ], + "test": [ + "phpunit -c phpunit.xml" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa image editor", + "support": { + "source": "https://github.com/ibexa/image-editor/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:44+00:00" + }, + { + "name": "ibexa/installer", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/installer.git", + "reference": "9863beeb662611925fe855503ae7514b4445c674" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/installer/ibexa-installer-9863beeb662611925fe855503ae7514b4445c674-zip-36498a.zip", + "reference": "9863beeb662611925fe855503ae7514b4445c674" + }, + "require": { + "ibexa/core": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/migrations": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/console": "^5.2", + "symfony/framework-bundle": "^5.0", + "symfony/proxy-manager-bridge": "^5.0", + "webmozart/assert": "^1.0" + }, + "conflict": { + "ezsystems/ezcommerce-shop": "<3.3.7" + }, + "require-dev": { + "behat/behat": "^3.7", + "doctrine/doctrine-bundle": "^2.1", + "friends-of-behat/mink-extension": "^2.4", + "friendsofsymfony/jsrouting-bundle": "^2.6", + "ibexa/admin-ui": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/commerce-shop": "~4.5.0", + "ibexa/compatibility-layer": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/elasticsearch": "~4.5.0", + "ibexa/fieldtype-matrix": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/solr": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.10.11", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-symfony": "^1.3.2", + "phpstan/phpstan-webmozart-assert": "^1.2.4", + "phpunit/phpunit": "^8.2", + "symfony/finder": "^5.1" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Platform\\Bundle\\Installer\\": "src/bundle/", + "Ibexa\\Platform\\Installer\\": "src/lib/", + "Ibexa\\Installer\\": "src/lib/", + "Ibexa\\Bundle\\Installer\\": "src/bundle/", + "Ibexa\\Contracts\\Installer\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Platform\\Tests\\Installer\\": "tests/lib/", + "Ibexa\\Platform\\Tests\\Bundle\\Installer\\": "tests/bundle/", + "Ibexa\\Tests\\Bundle\\Installer\\": "tests/bundle/", + "Ibexa\\Tests\\Installer\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "fix-cs-changed": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots $(git diff ${GIT_DIFF_BASE:-origin/main} --diff-filter=ACMR --name-only \"*.php\"|paste -sd ' ')" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "check-cs-changed": [ + "@fix-cs-changed --dry-run" + ], + "check-cs": [ + "@fix-cs --dry-run" + ] + }, + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Installer for Ibexa products", + "support": { + "source": "https://github.com/ibexa/installer/tree/v4.5.6", + "issues": "https://github.com/ibexa/installer/issues" + }, + "time": "2024-03-20T14:44:46+00:00" + }, + { + "name": "ibexa/measurement", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/measurement.git", + "reference": "2ccd6b4640d37e2a6c113a396135c75748a597f3" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/measurement/ibexa-measurement-2ccd6b4640d37e2a6c113a396135c75748a597f3-zip-182720.zip", + "reference": "2ccd6b4640d37e2a6c113a396135c75748a597f3" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/product-catalog": "~4.5", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/event-dispatcher-contracts": "^2.2", + "symfony/expression-language": "^5.4", + "symfony/form": "^5.4", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/yaml": "^5.3", + "webmozart/assert": "^1.11" + }, + "require-dev": { + "behat/behat": "^3.10", + "dama/doctrine-test-bundle": "^6.0", + "friends-of-behat/mink-extension": "^2.6", + "ibexa/code-style": "^1.0", + "ibexa/commerce-price-engine": "~4.5", + "ibexa/commerce-shop": "~4.5", + "ibexa/design-engine": "~4.5", + "ibexa/doctrine-schema": "~4.5", + "ibexa/elasticsearch": "~4.5", + "ibexa/fieldtype-matrix": "~4.5", + "ibexa/fieldtype-richtext": "~4.5", + "ibexa/graphql": "~4.5", + "ibexa/http-cache": "~4.5", + "ibexa/icons": "~4.5", + "ibexa/installer": "~4.5", + "ibexa/migrations": "~4.5", + "ibexa/personalization": "~4.5", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/solr": "~4.5", + "ibexa/taxonomy": "~4.5", + "ibexa/test-core": "~0.1", + "ibexa/test-rest": "~0.1", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9", + "symfony/browser-kit": "^5.4" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\Measurement\\": "src/bundle/", + "Ibexa\\Contracts\\Measurement\\": "src/contracts/", + "Ibexa\\Measurement\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\Measurement\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\Measurement\\": "tests/integration/", + "Ibexa\\Tests\\Measurement\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix -v --config=.php-cs-fixer.php --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "integration": [ + "phpunit -c phpunit.xml.dist --testsuite=integration" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/measurement/tree/v4.5.6", + "issues": "https://github.com/ibexa/measurement/issues" + }, + "time": "2024-03-20T14:45:08+00:00" + }, + { + "name": "ibexa/migrations", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/migrations.git", + "reference": "84e0dbc5bb0cf0223f52af801be46a8ef29cce2f" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/migrations/ibexa-migrations-84e0dbc5bb0cf0223f52af801be46a8ef29cce2f-zip-b5d836.zip", + "reference": "84e0dbc5bb0cf0223f52af801be46a8ef29cce2f" + }, + "require": { + "ibexa/core": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "league/flysystem": "^2.5.0", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.3", + "symfony/expression-language": "^5.3", + "symfony/framework-bundle": "^5.3", + "symfony/proxy-manager-bridge": "^5.3", + "symfony/yaml": "^5.3", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "behat/behat": "^3.7", + "doctrine/doctrine-bundle": "^2.1", + "fakerphp/faker": "^1.19", + "friends-of-behat/mink-extension": "^2.4", + "friendsofsymfony/jsrouting-bundle": "^2.6", + "ibexa/admin-ui": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "league/flysystem-memory": "^2.0.6", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.3", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^8.2", + "symfony/finder": "^5.3", + "symfony/phpunit-bridge": "^5.3" + }, + "suggest": { + "fakerphp/faker": "Enables usage of Faker in migration expressions" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Migration\\": "src/lib/", + "Ibexa\\Bundle\\Migration\\": "src/bundle/", + "Ibexa\\Contracts\\Migration\\": "src/contracts/", + "Ibexa\\Platform\\Bundle\\Migration\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\Migration\\": "src/contracts/", + "Ibexa\\Platform\\Migration\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Platform\\Tests\\Migration\\": "tests/lib/", + "Ibexa\\Platform\\Tests\\Bundle\\Migration\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\Integration\\Migration\\": "tests/integration/", + "Ibexa\\Tests\\Migration\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Migration\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\Migration\\": "tests/integration/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "fix-cs-changed": [ + "@fix-cs $(git diff ${GIT_DIFF_BASE:-origin/master} --diff-filter=ACMR --name-only \"*.php\"|paste -sd ' ')" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "check-cs-changed": [ + "@check-cs $(git diff ${GIT_DIFF_BASE:-origin/master} --diff-filter=ACMR --name-only \"*.php\"|paste -sd ' ')" + ], + "check-cs": [ + "@fix-cs --dry-run" + ] + }, + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Migrations for Ibexa DXP", + "support": { + "source": "https://github.com/ibexa/migrations/tree/v4.5.6", + "issues": "https://github.com/ibexa/migrations/issues" + }, + "time": "2024-03-20T14:44:48+00:00" + }, + { + "name": "ibexa/oauth2-client", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/oauth2-client.git", + "reference": "78be7bf14cae73c414ad7147c187de4fa39b0ff6" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/oauth2-client/ibexa-oauth2-client-78be7bf14cae73c414ad7147c187de4fa39b0ff6-zip-6dcf22.zip", + "reference": "78be7bf14cae73c414ad7147c187de4fa39b0ff6" + }, + "require": { + "ibexa/core": "~4.5.0", + "knpuniversity/oauth2-client-bundle": "^2.7", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/event-dispatcher-contracts": "^2.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/property-access": "^5.0", + "symfony/yaml": "^5.0" + }, + "require-dev": { + "ext-json": "*", + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/namespace-compatibility": "dev-main", + "matthiasnoback/symfony-config-test": "^4.1", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\OAuth2Client\\": "src/lib/", + "Ibexa\\Bundle\\OAuth2Client\\": "src/bundle/", + "Ibexa\\Contracts\\OAuth2Client\\": "src/contracts/", + "Ibexa\\Platform\\OAuth2Client\\": "src/lib/", + "Ibexa\\Platform\\Bundle\\OAuth2Client\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\OAuth2Client\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\OAuth2Client\\": "tests/bundle/", + "Ibexa\\Tests\\OAuth2Client\\": "tests/lib/", + "Ibexa\\Tests\\Integration\\OAuth2Client\\": "tests/integration/", + "Ibexa\\Platform\\Tests\\Bundle\\OAuth2Client\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\Integration\\OAuth2Client\\": "tests/integration/", + "Ibexa\\Platform\\Tests\\OAuth2Client\\": "tests/lib/", + "eZ\\Bundle\\EzPublishCoreBundle\\Tests\\": "vendor/ibexa/core/tests/bundle/Core/", + "Ibexa\\Tests\\Integration\\Core\\": "vendor/ibexa/core/tests/integration/Core/", + "Ibexa\\Tests\\Core\\": "vendor/ibexa/core/tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "php-cs-fixer fix --dry-run -v --show-progress=dots" + ], + "unit-tests": [ + "phpunit -c phpunit.xml.dist" + ] + }, + "license": [ + "proprietary" + ], + "description": "OAuth2 client for Ibexa DXP", + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/oauth2-client/tree/v4.5.6", + "issues": "https://github.com/ibexa/oauth2-client/issues" + }, + "time": "2024-03-20T14:44:49+00:00" + }, + { + "name": "ibexa/oss", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/oss.git", + "reference": "7dfc08cc1817fa79e45d0b0cffdf2f146ca8cb3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/oss/zipball/7dfc08cc1817fa79e45d0b0cffdf2f146ca8cb3b", + "reference": "7dfc08cc1817fa79e45d0b0cffdf2f146ca8cb3b", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^2.4.2", + "doctrine/doctrine-migrations-bundle": "^3.0", + "ext-ctype": "*", + "ext-iconv": "*", + "friendsofsymfony/jsrouting-bundle": "^2.7.0", + "ibexa/admin-ui": "4.5.6", + "ibexa/admin-ui-assets": "4.5.6", + "ibexa/content-forms": "4.5.6", + "ibexa/core": "4.5.6", + "ibexa/cron": "4.5.6", + "ibexa/design-engine": "4.5.6", + "ibexa/doctrine-schema": "4.5.6", + "ibexa/fieldtype-matrix": "4.5.6", + "ibexa/fieldtype-query": "4.5.6", + "ibexa/fieldtype-richtext": "4.5.6", + "ibexa/graphql": "4.5.6", + "ibexa/http-cache": "4.5.6", + "ibexa/i18n": "4.5.6", + "ibexa/post-install": "4.5.6", + "ibexa/rest": "4.5.6", + "ibexa/search": "4.5.6", + "ibexa/solr": "4.5.6", + "ibexa/standard-design": "4.5.6", + "ibexa/system-info": "4.5.6", + "ibexa/templated-uri-bundle": "^3.3.1", + "ibexa/user": "4.5.6", + "knplabs/knp-menu-bundle": "^3.1", + "lexik/jwt-authentication-bundle": "^2.10.5", + "monolog/monolog": "^2.2", + "overblog/graphiql-bundle": "^0.2.1", + "php": "^7.4 || ^8.0", + "php-http/guzzle6-adapter": "^2.0.1", + "platformsh/symfonyflex-bridge": "^2.4", + "sensio/framework-extra-bundle": "^6.1.0", + "symfony/asset": "^5.3.0", + "symfony/cache": "^5.3.0", + "symfony/console": "^5.3.0", + "symfony/dotenv": "^5.3.0", + "symfony/expression-language": "^5.3.0", + "symfony/flex": "^1.11 || ^2", + "symfony/form": "^5.3.0", + "symfony/framework-bundle": "^5.3.0", + "symfony/monolog-bundle": "^3.6.0", + "symfony/orm-pack": "^1.0", + "symfony/process": "^5.3.0", + "symfony/proxy-manager-bridge": "^5.3.0", + "symfony/security-bundle": "^5.3.0", + "symfony/serializer-pack": "^1.0", + "symfony/swiftmailer-bundle": "^3.5.1", + "symfony/translation": "^5.3.0", + "symfony/twig-bundle": "^5.3.0", + "symfony/validator": "^5.3.0", + "symfony/web-link": "^5.3.0", + "symfony/webpack-encore-bundle": "^1.8", + "symfony/yaml": "^5.3.0", + "twig/extra-bundle": "^3.1.1" + }, + "conflict": { + "behat/mink-selenium2-driver": "1.7.0", + "doctrine/doctrine-bundle": "2.6.3", + "doctrine/persistence": "3.0.0", + "friends-of-behat/mink-browserkit-driver": "1.6.2", + "gregwar/captcha-bundle": "2.2.0", + "imagine/imagine": "1.3.0 || 1.3.1", + "lexik/jwt-authentication-bundle": "2.12.0 || 2.18.0", + "symfony/dependency-injection": "5.3.7 || 5.4.17", + "symfony/expression-language": "5.4.7", + "symfony/framework-bundle": "5.3.14 || 5.4.3", + "symfony/webpack-encore-bundle": "1.14.0" + }, + "require-dev": { + "ibexa/ci-scripts": "^0.2@dev" + }, + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-master": "4.5.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(GPL-2.0-only or proprietary)" + ], + "description": "A meta package for installing Ibexa Open Source", + "support": { + "issues": "https://github.com/ibexa/oss/issues", + "source": "https://github.com/ibexa/oss/tree/v4.5.6" + }, + "time": "2024-03-20T14:46:37+00:00" + }, + { + "name": "ibexa/page-builder", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/page-builder.git", + "reference": "05f0dc1a54a93ccc986c2c89dcb4a4fe3b994fa2" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/page-builder/ibexa-page-builder-05f0dc1a54a93ccc986c2c89dcb4a4fe3b994fa2-zip-83795b.zip", + "reference": "05f0dc1a54a93ccc986c2c89dcb4a4fe3b994fa2" + }, + "require": { + "ext-intl": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/icons": "~4.5.0", + "jms/serializer": "^3.5", + "lexik/jwt-authentication-bundle": "^2.6", + "php": "^7.4 || ^8.0", + "scssphp/scssphp": "^1.0", + "symfony/asset": "^5.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.0", + "symfony/templating": "^5.0", + "symfony/translation": "^5.0", + "symfony/translation-contracts": "^2.0", + "symfony/validator": "^5.0", + "symfony/yaml": "^5.0", + "twig/twig": "^3.0" + }, + "replace": { + "ezsystems/ezplatform-page-builder": "*" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6.7.5", + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/behat": "~4.5.0", + "ibexa/calendar": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/migrations": "~4.5", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.2", + "symfony/phpunit-bridge": "^5.3", + "symfony/webpack-encore-bundle": "^1.8" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\PageBuilder\\": "src/lib/", + "Ibexa\\Bundle\\PageBuilder\\": "src/bundle/", + "Ibexa\\Contracts\\PageBuilder\\": "src/contracts/", + "EzSystems\\EzPlatformPageBuilderBundle\\": "src/bundle/", + "EzSystems\\EzPlatformPageBuilder\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\PageBuilder\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\PageBuilder\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\PageBuilder\\": "tests/integration/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "integration": [ + "phpunit -c phpunit-integration.xml" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Page Builder", + "support": { + "source": "https://github.com/ibexa/page-builder/tree/v4.5.6", + "issues": "https://github.com/ibexa/page-builder/issues" + }, + "time": "2024-03-20T14:44:16+00:00" + }, + { + "name": "ibexa/permissions", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/permissions.git", + "reference": "f7a5f6f9b3a7870851f81602d5cad85269e3a4b1" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/permissions/ibexa-permissions-f7a5f6f9b3a7870851f81602d5cad85269e3a4b1-zip-408d71.zip", + "reference": "f7a5f6f9b3a7870851f81602d5cad85269e3a4b1" + }, + "require": { + "ibexa/admin-ui": "~4.5.0", + "ibexa/calendar": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/page-builder": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-permissions": "*" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpunit/phpunit": "^8.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Platform\\Bundle\\Permissions\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\Permissions\\": "src/contracts/", + "Ibexa\\Platform\\Permissions\\": "src/lib/", + "Ibexa\\Permissions\\": "src/lib/", + "Ibexa\\Bundle\\Permissions\\": "src/bundle/", + "Ibexa\\Contracts\\Permissions\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Platform\\Bundle\\Permissions\\Tests\\": "tests/bundle/", + "Ibexa\\Platform\\Permissions\\Integration\\Tests\\": "tests/integration/", + "Ibexa\\Platform\\Permissions\\Tests\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Permissions\\": "tests/bundle/", + "Ibexa\\Tests\\Permissions\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Permissions", + "support": { + "source": "https://github.com/ibexa/permissions/tree/v4.5.6", + "issues": "https://github.com/ibexa/permissions/issues" + }, + "time": "2024-03-20T14:44:19+00:00" + }, + { + "name": "ibexa/personalization", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/personalization.git", + "reference": "598854febb510e337fd7be0a681603ae02e7ede1" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/personalization/ibexa-personalization-598854febb510e337fd7be0a681603ae02e7ede1-zip-c402d6.zip", + "reference": "598854febb510e337fd7be0a681603ae02e7ede1" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "~6.0", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "php": "^7.4 || ^8.0", + "ramsey/uuid": "^3.9", + "symfony/framework-bundle": "^5.0", + "symfony/proxy-manager-bridge": "^5.0", + "symfony/twig-bundle": "^5.0", + "symfony/webpack-encore-bundle": "^1.8", + "webmozart/assert": "^1.0" + }, + "replace": { + "ezsystems/ezplatform-personalization": "*" + }, + "require-dev": { + "behat/behat": "^3.7", + "dama/doctrine-test-bundle": "^6.7.5", + "dg/bypass-finals": "^1.1", + "friends-of-behat/mink-extension": "^2.4", + "friendsofsymfony/jsrouting-bundle": "^2.7", + "ibexa/calendar": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/migrations": "~4.5.0", + "ibexa/page-builder": "~4.5.0", + "ibexa/segmentation": "~4.5.0", + "ibexa/test-core": "~4.5", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^8.5", + "symfony/webpack-encore-bundle": "^1.8" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Personalization\\": "src/lib/", + "Ibexa\\Bundle\\Personalization\\": "src/bundle/", + "Ibexa\\Contracts\\Personalization\\": "src/contracts/", + "Ibexa\\Platform\\Bundle\\Personalization\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\Personalization\\": "src/contracts/", + "Ibexa\\Platform\\Personalization\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Integration\\Personalization\\": "tests/integration/", + "Ibexa\\Tests\\Personalization\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Personalization\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\Bundle\\Personalization\\": "tests/bundle/", + "Ibexa\\Platform\\Tests\\Personalization\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "check-cs": [ + "php-cs-fixer fix --diff --config=.php-cs-fixer.php --dry-run -v --show-progress=dots" + ], + "test": [ + "phpunit -vc phpunit.xml" + ], + "integration": [ + "phpunit -vc phpunit-integration.xml" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Personalization", + "keywords": [ + "ibexa" + ], + "support": { + "source": "https://github.com/ibexa/personalization/tree/v4.5.6", + "issues": "https://github.com/ibexa/personalization/issues" + }, + "time": "2024-03-20T14:44:21+00:00" + }, + { + "name": "ibexa/post-install", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/post-install.git", + "reference": "a8417d6837c85f9d83f05a2c936c9ba0d53eff49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/post-install/zipball/a8417d6837c85f9d83f05a2c936c9ba0d53eff49", + "reference": "a8417d6837c85f9d83f05a2c936c9ba0d53eff49", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "composer/semver": "^3.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2.0.8", + "ibexa/code-style": "^1.0", + "phpstan/phpstan": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-webmozart-assert": "^1", + "symfony/console": "^5.2", + "symfony/dotenv": "^5.2", + "symfony/filesystem": "^5.2", + "symfony/finder": "^5.2", + "symfony/phpunit-bridge": "^5.2", + "symfony/process": "^5.2" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + }, + "class": "Ibexa\\PostInstall\\PostInstall" + }, + "autoload": { + "psr-4": { + "Ibexa\\PostInstall\\": "src/lib/", + "Ibexa\\Platform\\PostInstall\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Post Installation Tool for Ibexa products", + "support": { + "issues": "https://github.com/ibexa/post-install/issues", + "source": "https://github.com/ibexa/post-install/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:51+00:00" + }, + { + "name": "ibexa/product-catalog", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/product-catalog.git", + "reference": "06ad7ebad5d98c078758fc47f4deca342922719d" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/product-catalog/ibexa-product-catalog-06ad7ebad5d98c078758fc47f4deca342922719d-zip-947f7b.zip", + "reference": "06ad7ebad5d98c078758fc47f4deca342922719d" + }, + "require": { + "doctrine/dbal": "^2.13", + "ext-intl": "*", + "ext-json": "*", + "friendsofsymfony/http-cache": "^2.9", + "ibexa/admin-ui": "~4.5", + "ibexa/content-forms": "~4.5", + "ibexa/core": "~4.5", + "ibexa/graphql": "~4.5", + "ibexa/installer": "~4.5", + "ibexa/migrations": "~4.5", + "ibexa/personalization": "~4.5", + "ibexa/rest": "~4.5", + "ibexa/taxonomy": "~4.5", + "jms/translation-bundle": "^1.6", + "moneyphp/money": "^3.0 || ^4.0", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.3", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/event-dispatcher-contracts": "^2.2", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/workflow": "^5.4", + "symfony/yaml": "^5.3" + }, + "conflict": { + "sebastian/type": "2.3.3" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6.7.5", + "friends-of-behat/mink-extension": "^2.5", + "ibexa/behat": "~4.5", + "ibexa/code-style": "~1.2", + "ibexa/commerce-checkout": "~4.5", + "ibexa/commerce-price-engine": "~4.5", + "ibexa/commerce-shop": "~4.5", + "ibexa/commerce-transaction": "~4.5", + "ibexa/elasticsearch": "~4.5", + "ibexa/fieldtype-matrix": "~4.5", + "ibexa/fieldtype-page": "~4.5", + "ibexa/fieldtype-richtext": "~4.5", + "ibexa/phpstan-money": "^1.0", + "ibexa/solr": "~4.5", + "ibexa/test-core": "~0.1", + "ibexa/test-rest": "~0.1", + "justinrainbow/json-schema": "^5.2", + "matthiasnoback/symfony-dependency-injection-test": "^4.2", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/browser-kit": "^5.4", + "symfony/phpunit-bridge": "^5.3", + "symfony/proxy-manager-bridge": "^5.3" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\ProductCatalog\\": "src/bundle/", + "Ibexa\\Contracts\\ProductCatalog\\": "src/contracts/", + "Ibexa\\ProductCatalog\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\ProductCatalog\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\ProductCatalog\\": "tests/integration/", + "Ibexa\\Tests\\ProductCatalog\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "phpstan": [ + "phpstan analyse" + ] + }, + "license": [ + "proprietary" + ], + "description": "Product Catalog for Ibexa DXP", + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/product-catalog/tree/v4.5.6", + "issues": "https://github.com/ibexa/product-catalog/issues" + }, + "time": "2024-03-20T14:44:54+00:00" + }, + { + "name": "ibexa/rest", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/rest.git", + "reference": "f73570867e5cf6220a4d50ff16636abca61744b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/rest/zipball/f73570867e5cf6220a4d50ff16636abca61744b3", + "reference": "f73570867e5cf6220a4d50ff16636abca61744b3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-simplexml": "*", + "ext-xmlwriter": "*", + "ibexa/core": "~4.5.0", + "ibexa/templated-uri-bundle": "^3.2", + "lexik/jwt-authentication-bundle": "^2.8", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/expression-language": "^5.3", + "symfony/form": "^5.3", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/routing": "^5.3", + "symfony/security-bundle": "^5.3", + "symfony/security-csrf": "^5.3", + "symfony/yaml": "^5.3" + }, + "replace": { + "ezsystems/ezplatform-rest": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/test-core": "^0.1", + "justinrainbow/json-schema": "^5.2", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "nyholm/psr7": "^1.1", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^8.5", + "symfony/browser-kit": "^5.3", + "symfony/http-client": "^5.3" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Rest\\": "src/lib/", + "Ibexa\\Bundle\\Rest\\": "src/bundle/", + "Ibexa\\Contracts\\Rest\\": "src/contracts/", + "EzSystems\\EzPlatformRest\\": "src/lib/", + "EzSystems\\EzPlatformRestBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa REST bundle", + "support": { + "issues": "https://github.com/ibexa/rest/issues", + "source": "https://github.com/ibexa/rest/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:25+00:00" + }, + { + "name": "ibexa/scheduler", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/scheduler.git", + "reference": "d31ded2afd4c0b4438cefb52b62c58edd49fb04a" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/scheduler/ibexa-scheduler-d31ded2afd4c0b4438cefb52b62c58edd49fb04a-zip-674d32.zip", + "reference": "d31ded2afd4c0b4438cefb52b62c58edd49fb04a" + }, + "require": { + "ext-pdo": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/calendar": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/cron": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/workflow": "~4.5.0", + "knplabs/knp-menu": "^3.1", + "php": "^7.4 || ^8.0", + "symfony/asset": "^5.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/routing": "^5.0", + "symfony/translation": "^5.0", + "symfony/translation-contracts": "^2.0", + "symfony/yaml": "^5.0" + }, + "replace": { + "ezsystems/date-based-publisher": "*" + }, + "require-dev": { + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "~1.2.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/page-builder": "~4.5", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-symfony": "^1.3" + }, + "suggest": { + "ezsystems/ezplatform-page-builder": "Page Builder and Timeline integration" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "EzSystems\\DateBasedPublisher\\": "src/lib", + "EzSystems\\DateBasedPublisherBundle\\": "src/bundle", + "Ibexa\\Scheduler\\": "src/lib", + "Ibexa\\Bundle\\Scheduler\\": "src/bundle/", + "Ibexa\\Contracts\\Scheduler\\": "src/contracts/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Ibexa Scheduler bundle", + "support": { + "source": "https://github.com/ibexa/scheduler/tree/v4.5.6", + "issues": "https://github.com/ibexa/scheduler/issues" + }, + "time": "2024-03-20T14:43:01+00:00" + }, + { + "name": "ibexa/search", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/search.git", + "reference": "55ff74bcb4db537107a7019b011866d520597b6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/search/zipball/55ff74bcb4db537107a7019b011866d520597b6f", + "reference": "55ff74bcb4db537107a7019b011866d520597b6f", + "shasum": "" + }, + "require": { + "ibexa/core": "~4.5.0", + "pagerfanta/pagerfanta": "^2.1", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-search": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Search\\": "src/lib/", + "Ibexa\\Bundle\\Search\\": "src/bundle/", + "Ibexa\\Platform\\Search\\": "src/lib/", + "Ibexa\\Contracts\\Search\\": "src/contracts/", + "Ibexa\\Platform\\Bundle\\Search\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa DXP Search bundle", + "support": { + "issues": "https://github.com/ibexa/search/issues", + "source": "https://github.com/ibexa/search/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:29+00:00" + }, + { + "name": "ibexa/segmentation", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/segmentation.git", + "reference": "c9299bd0fe817ca9bbc958e41604e60491620660" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/segmentation/ibexa-segmentation-c9299bd0fe817ca9bbc958e41604e60491620660-zip-ab7310.zip", + "reference": "c9299bd0fe817ca9bbc958e41604e60491620660" + }, + "require": { + "ext-json": "*", + "friendsofsymfony/http-cache": "^2.9", + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/migrations": "~4.5.0", + "ibexa/page-builder": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.1", + "symfony/dependency-injection": "^5.1", + "symfony/http-foundation": "^5.1", + "symfony/http-kernel": "^5.1" + }, + "replace": { + "ezsystems/ezplatform-segmentation": "*" + }, + "require-dev": { + "behat/behat": "^3.10", + "dama/doctrine-test-bundle": "^6.7", + "friends-of-behat/mink-extension": "^2.6", + "ibexa/behat": "~4.5", + "ibexa/calendar": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/personalization": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "justinrainbow/json-schema": "^5.2", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.1", + "phpunit/phpunit": "^9.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Segmentation\\": "src/lib/", + "Ibexa\\Bundle\\Segmentation\\": "src/bundle/", + "Ibexa\\Contracts\\Segmentation\\": "src/contracts/", + "Ibexa\\Platform\\Segmentation\\": "src/lib/", + "Ibexa\\Platform\\Bundle\\Segmentation\\": "src/bundle/", + "Ibexa\\Platform\\Contracts\\Segmentation\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\Segmentation\\": "tests/bundle/", + "Ibexa\\Tests\\Segmentation\\": "tests/lib/", + "Ibexa\\Tests\\Integration\\Segmentation\\": "tests/integration/", + "Ibexa\\Platform\\Segmentation\\Tests\\": "tests/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon.dist" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "test-integration": [ + "phpunit -c phpunit.integration.xml.dist" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Segmentation", + "support": { + "source": "https://github.com/ibexa/segmentation/tree/v4.5.6", + "issues": "https://github.com/ibexa/segmentation/issues" + }, + "time": "2024-03-20T14:44:31+00:00" + }, + { + "name": "ibexa/seo", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/seo.git", + "reference": "9e84b759018fed9ed13c0b8c9c1948dcac56a44c" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/seo/ibexa-seo-9e84b759018fed9ed13c0b8c9c1948dcac56a44c-zip-9d1ed5.zip", + "reference": "9e84b759018fed9ed13c0b8c9c1948dcac56a44c" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/event-dispatcher-contracts": "^2.2", + "symfony/form": "^5.3", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/yaml": "^5.3" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6.7", + "ibexa/code-style": "^1.0", + "ibexa/commerce-shop": "~4.5", + "ibexa/design-engine": "~4.5", + "ibexa/doctrine-schema": "~4.5", + "ibexa/elasticsearch": "~4.5", + "ibexa/fieldtype-matrix": "~4.5", + "ibexa/fieldtype-richtext": "~4.5", + "ibexa/graphql": "~4.5", + "ibexa/http-cache": "~4.5", + "ibexa/icons": "~4.5", + "ibexa/installer": "~4.5", + "ibexa/migrations": "~4.5", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/solr": "~4.5", + "ibexa/taxonomy": "~4.5", + "ibexa/test-core": "^0.1", + "ibexa/user": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.3", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-symfony": "^1.2", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\Seo\\": "src/bundle/", + "Ibexa\\Contracts\\Seo\\": "src/contracts/", + "Ibexa\\Seo\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\Seo\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\Seo\\": "tests/integration/", + "Ibexa\\Tests\\Seo\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix -v --config=.php-cs-fixer.php --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "@test-unit", + "@test-integration" + ], + "test-unit": [ + "phpunit -c phpunit.xml.dist" + ], + "test-integration": [ + "phpunit -c phpunit.integration.xml.dist" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/seo/tree/v4.5.6", + "issues": "https://github.com/ibexa/seo/issues" + }, + "time": "2024-03-20T14:45:14+00:00" + }, + { + "name": "ibexa/site-factory", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/site-factory.git", + "reference": "5acd065eaed6cb007d3f93e9d4d156ed78cae041" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/site-factory/ibexa-site-factory-5acd065eaed6cb007d3f93e9d4d156ed78cae041-zip-f05eab.zip", + "reference": "5acd065eaed6cb007d3f93e9d4d156ed78cae041" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/page-builder": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/form": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/translation-contracts": "^2.0" + }, + "replace": { + "ezsystems/ezplatform-site-factory": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/calendar": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-page": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/icons": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpunit/phpunit": "^8.2", + "symfony/phpunit-bridge": "^5.0" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "EzSystems\\EzPlatformSiteFactoryBundle\\": "src/bundle", + "EzSystems\\EzPlatformSiteFactory\\": "src/lib", + "Ibexa\\SiteFactory\\": "src/lib/", + "Ibexa\\Bundle\\SiteFactory\\": "src/bundle/", + "Ibexa\\Contracts\\SiteFactory\\": "src/contracts/" + } + }, + "autoload-dev": { + "psr-4": { + "EzSystems\\EzPlatformSiteFactory\\Integration\\Tests\\": "tests/integration/", + "EzSystems\\EzPlatformSiteFactoryBundle\\Tests\\": "tests/bundle/", + "EzSystems\\EzPlatformSiteFactory\\Tests\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\SiteFactory\\": "tests/bundle/", + "Ibexa\\Tests\\SiteFactory\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Site Factory bundle", + "support": { + "source": "https://github.com/ibexa/site-factory/tree/v4.5.6", + "issues": "https://github.com/ibexa/site-factory/issues" + }, + "time": "2024-03-20T14:44:33+00:00" + }, + { + "name": "ibexa/solr", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/solr.git", + "reference": "74ff8080eccd79d7a304076deae9f11e4f9e2463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/solr/zipball/74ff8080eccd79d7a304076deae9f11e4f9e2463", + "reference": "74ff8080eccd79d7a304076deae9f11e4f9e2463", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-xmlwriter": "*", + "ibexa/core": "~4.5.0", + "netgen/query-translator": "^1.0.2", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/console": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/http-client": "^5.4", + "symfony/http-kernel": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-solr-search-engine": "*" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-symfony": "^1.2", + "phpunit/phpunit": "^8.2", + "symfony/proxy-manager-bridge": "^5.4" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Solr\\": "src/lib/", + "Ibexa\\Bundle\\Solr\\": "src/bundle/", + "Ibexa\\Contracts\\Solr\\": "src/contracts/", + "Ibexa\\Tests\\Solr\\SetupFactory\\": "tests/lib/SetupFactory/", + "EzSystems\\EzPlatformSolrSearchEngine\\": "src/lib/", + "EzSystems\\EzPlatformSolrSearchEngineBundle\\": "src/bundle/", + "EzSystems\\EzPlatformSolrSearchEngine\\Tests\\SetupFactory\\": "tests/lib/SetupFactory/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "eZ Systems dev team", + "email": "dev-team@ibexa.co" + } + ], + "description": "Solr search engine implementation for Ibexa", + "support": { + "issues": "https://github.com/ibexa/solr/issues", + "source": "https://github.com/ibexa/solr/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:35+00:00" + }, + { + "name": "ibexa/standard-design", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/standard-design.git", + "reference": "1e0f8ae9f103f2238ec56901ae8a37372bda08c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/standard-design/zipball/1e0f8ae9f103f2238ec56901ae8a37372bda08c3", + "reference": "1e0f8ae9f103f2238ec56901ae8a37372bda08c3", + "shasum": "" + }, + "require": { + "ibexa/core": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/http-kernel": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-standard-design": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "phpunit/phpunit": "^8.1" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\StandardDesign\\": "src/lib/", + "Ibexa\\Bundle\\StandardDesign\\": "src/bundle/", + "Ibexa\\Contracts\\StandardDesign\\": "src/contracts/", + "EzSystems\\EzPlatformStandardDesignBundle\\": "src/bundle" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa Standard Design Bundle", + "support": { + "issues": "https://github.com/ibexa/standard-design/issues", + "source": "https://github.com/ibexa/standard-design/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:36+00:00" + }, + { + "name": "ibexa/system-info", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/system-info.git", + "reference": "ddeb4493d85aa16ea047b48bee5174ae39ce198e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/system-info/zipball/ddeb4493d85aa16ea047b48bee5174ae39ce198e", + "reference": "ddeb4493d85aa16ea047b48bee5174ae39ce198e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ocramius/proxy-manager": "^2.2", + "php": "^7.4 || ^8.0", + "symfony/proxy-manager-bridge": "^5.0", + "zetacomponents/system-information": "^1.1.1" + }, + "replace": { + "ezsystems/ez-support-tools": "*" + }, + "require-dev": { + "ezsystems/ezplatform-content-forms": "^1.3", + "ezsystems/ezplatform-http-cache": "^2.3", + "ezsystems/ezplatform-rest": "^1.3", + "ezsystems/ezplatform-richtext": "^2.3", + "ezsystems/ezplatform-search": "^1.2", + "ezsystems/ezplatform-user": "^2.3", + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "^4.0", + "phpunit/phpunit": "^8.2" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\SystemInfo\\": "src/lib/", + "Ibexa\\Bundle\\SystemInfo\\": "src/bundle/", + "EzSystems\\EzSupportTools\\": "src/lib/", + "Ibexa\\Contracts\\SystemInfo\\": "src/contracts/", + "EzSystems\\EzSupportToolsBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(GPL-2.0-only or proprietary)" + ], + "authors": [ + { + "name": "eZ Systems", + "email": "dev-team@ibexa.co" + } + ], + "description": "Providing information about the system Ibexa is running on, and Ibexa install itself", + "support": { + "issues": "https://github.com/ibexa/system-info/issues", + "source": "https://github.com/ibexa/system-info/tree/v4.5.6" + }, + "time": "2024-03-20T14:43:05+00:00" + }, + { + "name": "ibexa/taxonomy", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/taxonomy.git", + "reference": "85eebbefb0f06b0d1a069c0b1ac2af046f4a9fb3" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/taxonomy/ibexa-taxonomy-85eebbefb0f06b0d1a069c0b1ac2af046f4a9fb3-zip-966da8.zip", + "reference": "85eebbefb0f06b0d1a069c0b1ac2af046f4a9fb3" + }, + "require": { + "doctrine/cache": "^2.0", + "doctrine/orm": "^2.6", + "gedmo/doctrine-extensions": "^3.1", + "ibexa/admin-ui": "~4.5", + "ibexa/content-forms": "~4.5", + "ibexa/core": "~4.5", + "ibexa/graphql": "~4.5", + "ibexa/installer": "~4.5", + "ibexa/migrations": "~4.5", + "ibexa/rest": "~4.5", + "jms/translation-bundle": "^1.6", + "php": "^7.4 || ^8.0", + "stof/doctrine-extensions-bundle": "^1.6", + "symfony/config": "^5.3", + "symfony/console": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/event-dispatcher-contracts": "^2.2", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/yaml": "^5.3" + }, + "require-dev": { + "dama/doctrine-test-bundle": "^6.7.5", + "doctrine/persistence": "^2.2", + "ibexa/behat": "~4.5.0", + "ibexa/code-style": "~1.2", + "ibexa/elasticsearch": "~4.5", + "ibexa/solr": "~4.5", + "matthiasnoback/symfony-dependency-injection-test": "^4.2", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-doctrine": "^1.3", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "ibexa/elasticsearch": "Integrated Elasticsearch support for Taxonomy related criterions", + "ibexa/solr": "Integrated Solr support for Taxonomy related criterions" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\Taxonomy\\": "src/bundle/", + "Ibexa\\Contracts\\Taxonomy\\": "src/contracts/", + "Ibexa\\Taxonomy\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\Taxonomy\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\Taxonomy\\": "tests/integration/", + "Ibexa\\Tests\\Taxonomy\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix -v --config=.php-cs-fixer.php --show-progress=dots" + ], + "fix-cs-changed": [ + "@fix-cs $(git diff ${GIT_DIFF_BASE:-origin/main} --diff-filter=ACMR --name-only \"*.php\"|paste -sd ' ')" + ], + "test": [ + "phpunit -c phpunit.xml.dist" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "check-cs-changed": [ + "@fix-cs-changed --dry-run" + ], + "check-cs": [ + "@fix-cs --dry-run" + ] + }, + "license": [ + "proprietary" + ], + "description": "Taxonomy bundle for Ibexa DXP", + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/taxonomy/tree/v4.5.6", + "issues": "https://github.com/ibexa/taxonomy/issues" + }, + "time": "2024-03-20T14:44:58+00:00" + }, + { + "name": "ibexa/templated-uri-bundle", + "version": "v3.3.2.2", + "target-dir": "Hautelook/TemplatedUriBundle", + "source": { + "type": "git", + "url": "https://github.com/ibexa/templated-uri-bundle.git", + "reference": "53dadbc0bfcaa32b526bb0528e6f44d652994cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/templated-uri-bundle/zipball/53dadbc0bfcaa32b526bb0528e6f44d652994cb5", + "reference": "53dadbc0bfcaa32b526bb0528e6f44d652994cb5", + "shasum": "" + }, + "require": { + "ibexa/templated-uri-router": "^2.0|^3.0", + "php": "^5.4|^7.0|^8.0", + "symfony/framework-bundle": "^2.8.50 || ^3.4.26 || ^4.1.12 || ^4.2.7 || ^5.0" + }, + "replace": { + "hautelook/templated-uri-bundle": "self.version" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^5.6.3 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-0": { + "Hautelook\\TemplatedUriBundle": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Baldur Rensch", + "email": "brensch@gmail.com" + } + ], + "description": "Fork of hautelook/templated-uri-bundle. Symfony2 Bundle that provides a RFC-6570 compatible router and URL Generator.", + "homepage": "http://www.hautelooktech.com/", + "keywords": [ + "HATEOAS", + "RFC 6570", + "Symfony2", + "json", + "uri", + "url", + "xml" + ], + "support": { + "issues": "https://github.com/ibexa/templated-uri-bundle/issues", + "source": "https://github.com/ibexa/templated-uri-bundle/tree/v3.3.2.2" + }, + "time": "2022-07-29T14:34:17+00:00" + }, + { + "name": "ibexa/templated-uri-router", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/ibexa/templated-uri-router.git", + "reference": "fe8248db2b98ddb83eaaca821e995113ccd15a2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/templated-uri-router/zipball/fe8248db2b98ddb83eaaca821e995113ccd15a2c", + "reference": "fe8248db2b98ddb83eaaca821e995113ccd15a2c", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "symfony/routing": "~2.5|~3.0|^4.0|^5.0" + }, + "replace": { + "hautelook/templated-uri-router": "self.version" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.7|^6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hautelook\\TemplatedUriRouter\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Baldur Rensch", + "email": "brensch@gmail.com" + } + ], + "description": "Fork of hautelook/templated-uri-router. Symfony2 RFC-6570 compatible router and URL Generator", + "homepage": "http://www.hautelooktech.com/", + "keywords": [ + "HATEOAS", + "RFC 6570", + "Symfony2", + "json", + "router", + "uri", + "url", + "xml" + ], + "support": { + "issues": "https://github.com/ibexa/templated-uri-router/issues", + "source": "https://github.com/ibexa/templated-uri-router/tree/v3.3.0" + }, + "time": "2021-09-10T08:34:30+00:00" + }, + { + "name": "ibexa/tree-builder", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/tree-builder.git", + "reference": "3621b4e38edc369431db6ba8e60b2e4436e999cd" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/tree-builder/ibexa-tree-builder-3621b4e38edc369431db6ba8e60b2e4436e999cd-zip-f5fc4c.zip", + "reference": "3621b4e38edc369431db6ba8e60b2e4436e999cd" + }, + "require": { + "ibexa/core": "~4.5.0", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", + "symfony/event-dispatcher": "^5.3", + "symfony/event-dispatcher-contracts": "^2.0", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", + "symfony/yaml": "^5.3" + }, + "require-dev": { + "ibexa/code-style": "^1.0", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Bundle\\TreeBuilder\\": "src/bundle/", + "Ibexa\\Contracts\\TreeBuilder\\": "src/contracts/", + "Ibexa\\TreeBuilder\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\TreeBuilder\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\TreeBuilder\\": "tests/integration/", + "Ibexa\\Tests\\TreeBuilder\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "unit-tests": [ + "phpunit -c phpunit.xml.dist" + ] + }, + "license": [ + "proprietary" + ], + "description": "Tree Builder component for Ibexa DXP", + "keywords": [ + "ibexa-dxp" + ], + "support": { + "source": "https://github.com/ibexa/tree-builder/tree/v4.5.6", + "issues": "https://github.com/ibexa/tree-builder/issues" + }, + "time": "2024-03-20T14:45:02+00:00" + }, + { + "name": "ibexa/user", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "https://github.com/ibexa/user.git", + "reference": "5c07863c81326d5ba102427223710c1db54f4ba1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ibexa/user/zipball/5c07863c81326d5ba102427223710c1db54f4ba1", + "reference": "5c07863c81326d5ba102427223710c1db54f4ba1", + "shasum": "" + }, + "require": { + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "jms/translation-bundle": "^1.5", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.0", + "symfony/swiftmailer-bundle": "^3.4", + "symfony/translation": "^5.0", + "symfony/validator": "^5.0", + "twig/twig": "^3.0" + }, + "replace": { + "ezsystems/ezplatform-user": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "matthiasnoback/symfony-dependency-injection-test": "4.3", + "phpunit/phpunit": "^8.2", + "symfony/phpunit-bridge": "^5.3", + "symfony/proxy-manager-bridge": "^5.0" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\User\\": "src/lib/", + "Ibexa\\Bundle\\User\\": "src/bundle/", + "Ibexa\\Contracts\\User\\": "src/contracts/", + "EzSystems\\EzPlatformUser\\": "src/lib/", + "EzSystems\\EzPlatformUserBundle\\": "src/bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "description": "Ibexa User bundle", + "support": { + "issues": "https://github.com/ibexa/user/issues", + "source": "https://github.com/ibexa/user/tree/v4.5.6" + }, + "time": "2024-03-20T14:44:38+00:00" + }, + { + "name": "ibexa/version-comparison", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/version-comparison.git", + "reference": "c4edee05c1e23b9306787e7a135f88bcb9988f9d" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/version-comparison/ibexa-version-comparison-c4edee05c1e23b9306787e7a135f88bcb9988f9d-zip-84d1e4.zip", + "reference": "c4edee05c1e23b9306787e7a135f88bcb9988f9d" + }, + "require": { + "ezsystems/diff": "^3.1", + "ibexa/admin-ui": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/fieldtype-matrix": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "php": "^7.4 || ^8.0", + "soundasleep/html2text": "^1.1", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/http-kernel": "^5.0" + }, + "replace": { + "ezsystems/ezplatform-version-comparison": "*" + }, + "require-dev": { + "ibexa/behat": "~4.5.0", + "ibexa/code-style": "^1.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/graphql": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpunit/phpunit": "^8.5" + }, + "type": "ibexa-bundle", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\VersionComparison\\": "src/lib/", + "Ibexa\\Bundle\\VersionComparison\\": "src/bundle/", + "Ibexa\\Contracts\\VersionComparison\\": "src/contracts/", + "EzSystems\\EzPlatformVersionComparisonBundle\\": "src/bundle/", + "EzSystems\\EzPlatformVersionComparison\\": "src/lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Bundle\\VersionComparison\\": "tests/bundle/", + "Ibexa\\Tests\\Integration\\VersionComparison\\": "tests/integration/", + "Ibexa\\Tests\\VersionComparison\\": "tests/lib/", + "EzSystems\\EzPlatformVersionComparison\\Integration\\Tests\\": "tests/integration/", + "EzSystems\\EzPlatformVersionComparisonBundle\\Tests\\": "tests/bundle/", + "EzSystems\\EzPlatformVersionComparison\\Tests\\": "tests/lib/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "test-integration": [ + "phpunit -c phpunit-integration-legacy.xml" + ] + }, + "license": [ + "proprietary" + ], + "description": "Ibexa DXP Version Comparison bundle", + "support": { + "source": "https://github.com/ibexa/version-comparison/tree/v4.5.6", + "issues": "https://github.com/ibexa/version-comparison/issues" + }, + "time": "2024-03-20T14:44:40+00:00" + }, + { + "name": "ibexa/workflow", + "version": "v4.5.6", + "source": { + "type": "git", + "url": "git@github.com:ibexa/workflow.git", + "reference": "ecd4980a54d150d9fc31cc09bd7ceba0a7afe390" + }, + "dist": { + "type": "zip", + "url": "https://updates.ibexa.co/dist/ibexa/workflow/ibexa-workflow-ecd4980a54d150d9fc31cc09bd7ceba0a7afe390-zip-1b81dc.zip", + "reference": "ecd4980a54d150d9fc31cc09bd7ceba0a7afe390" + }, + "require": { + "ibexa/admin-ui": "~4.5.0", + "ibexa/content-forms": "~4.5.0", + "ibexa/core": "~4.5.0", + "ibexa/design-engine": "~4.5.0", + "ibexa/icons": "~4.5.0", + "knplabs/knp-menu": "^3.1", + "ocramius/proxy-manager": "^2.1", + "pagerfanta/pagerfanta": "^2.1", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/options-resolver": "^5.0", + "symfony/routing": "^5.0", + "symfony/translation": "^5.0", + "symfony/translation-contracts": "^2.0", + "symfony/workflow": "^5.4", + "symfony/yaml": "^5.0", + "twig/intl-extra": "^3.0" + }, + "conflict": { + "symfony/symfony": "*" + }, + "replace": { + "ezsystems/ezplatform-workflow": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "ibexa/behat": "~4.5.0", + "ibexa/ci-scripts": "^0.2", + "ibexa/code-style": "^1.0", + "ibexa/doctrine-schema": "~4.5.0", + "ibexa/fieldtype-richtext": "~4.5.0", + "ibexa/http-cache": "~4.5.0", + "ibexa/rest": "~4.5.0", + "ibexa/search": "~4.5.0", + "ibexa/user": "~4.5.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.1" + }, + "suggest": { + "ezsystems/ezplatform-page-builder": "Page Builder integration" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ibexa\\Workflow\\": "src/lib", + "Ibexa\\Bundle\\Workflow\\": "src/bundle/", + "Ibexa\\Contracts\\Workflow\\": "src/contracts/", + "EzSystems\\EzPlatformWorkflow\\": "src/lib", + "EzSystems\\EzPlatformWorkflowBundle\\": "src/bundle" + } + }, + "autoload-dev": { + "psr-4": { + "Ibexa\\Tests\\Workflow\\": "tests/lib/", + "Ibexa\\Tests\\Bundle\\Workflow\\": "tests/bundle/" + } + }, + "notification-url": "https://updates.ibexa.co/notifystats", + "scripts": { + "fix-cs": [ + "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots" + ], + "check-cs": [ + "@fix-cs --dry-run" + ], + "test": [ + "phpunit -c phpunit.xml" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ] + }, + "license": [ + "proprietary" + ], + "authors": [ + { + "name": "Ibexa AS", + "email": "dev-team@ibexa.co" + } + ], + "description": "Workflow bundle for Ibexa DXP", + "support": { + "source": "https://github.com/ibexa/workflow/tree/v4.5.6", + "issues": "https://github.com/ibexa/workflow/issues" + }, + "time": "2024-03-20T14:44:42+00:00" + }, + { + "name": "imagine/imagine", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/php-imagine/Imagine.git", + "reference": "7151d553edec4dc2bbac60419f7a74ff34700e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-imagine/Imagine/zipball/7151d553edec4dc2bbac60419f7a74ff34700e7f", + "reference": "7151d553edec4dc2bbac60419f7a74ff34700e7f", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4 || ^9.3" + }, + "suggest": { + "ext-exif": "to read EXIF metadata", + "ext-gd": "to use the GD implementation", + "ext-gmagick": "to use the Gmagick implementation", + "ext-imagick": "to use the Imagick implementation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Imagine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bulat Shakirzyanov", + "email": "mallluhuct@gmail.com", + "homepage": "http://avalanche123.com" + } + ], + "description": "Image processing for PHP 5.3", + "homepage": "http://imagine.readthedocs.org/", + "keywords": [ + "drawing", + "graphics", + "image manipulation", + "image processing" + ], + "support": { + "issues": "https://github.com/php-imagine/Imagine/issues", + "source": "https://github.com/php-imagine/Imagine/tree/1.3.5" + }, + "time": "2023-06-07T14:49:52+00:00" + }, + { + "name": "jms/metadata", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "7ca240dcac0c655eb15933ee55736ccd2ea0d7a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/7ca240dcac0c655eb15933ee55736ccd2ea0d7a6", + "reference": "7ca240dcac0c655eb15933ee55736ccd2ea0d7a6", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "doctrine/cache": "^1.0", + "doctrine/coding-standard": "^8.0", + "mikey179/vfsstream": "^1.6.7", + "phpunit/phpunit": "^8.5|^9.0", + "psr/container": "^1.0|^2.0", + "symfony/cache": "^3.1|^4.0|^5.0", + "symfony/dependency-injection": "^3.1|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "support": { + "issues": "https://github.com/schmittjoh/metadata/issues", + "source": "https://github.com/schmittjoh/metadata/tree/2.8.0" + }, + "time": "2023-02-15T13:44:18+00:00" + }, + { + "name": "jms/serializer", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "bf1105358123d7c02ee6cad08ea33ab535a09d5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/bf1105358123d7c02ee6cad08ea33ab535a09d5e", + "reference": "bf1105358123d7c02ee6cad08ea33ab535a09d5e", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^2.0", + "doctrine/lexer": "^2.0 || ^3.0", + "jms/metadata": "^2.6", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^1.20" + }, + "require-dev": { + "doctrine/annotations": "^1.14 || ^2.0", + "doctrine/coding-standard": "^12.0", + "doctrine/orm": "^2.14 || ^3.0", + "doctrine/persistence": "^2.5.2 || ^3.0", + "doctrine/phpcr-odm": "^1.5.2 || ^2.0", + "ext-pdo_sqlite": "*", + "jackalope/jackalope-doctrine-dbal": "^1.3", + "ocramius/proxy-manager": "^1.0 || ^2.0", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "^1.0.2", + "phpunit/phpunit": "^9.0 || ^10.0", + "psr/container": "^1.0 || ^2.0", + "rector/rector": "^0.19.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/expression-language": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/form": "^5.4 || ^6.0 || ^7.0", + "symfony/translation": "^5.4 || ^6.0 || ^7.0", + "symfony/uid": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.4 || ^3.0" + }, + "suggest": { + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/cache": "Required if you like to use cache functionality.", + "symfony/uid": "Required if you'd like to serialize UID objects.", + "symfony/yaml": "Required if you'd like to use the YAML metadata format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "JMS\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, and JSON.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "support": { + "issues": "https://github.com/schmittjoh/serializer/issues", + "source": "https://github.com/schmittjoh/serializer/tree/3.30.0" + }, + "funding": [ + { + "url": "https://github.com/goetas", + "type": "github" + } + ], + "time": "2024-02-24T14:12:14+00:00" + }, + { + "name": "jms/translation-bundle", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSTranslationBundle.git", + "reference": "42655d84eb2029f4c7a8b5cd5a4b5122974ef980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/JMSTranslationBundle/zipball/42655d84eb2029f4c7a8b5cd5a4b5122974ef980", + "reference": "42655d84eb2029f4c7a8b5cd5a4b5122974ef980", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.9", + "php": "^7.4 || ^8.0", + "symfony/console": "^4.3 || ^5.4", + "symfony/expression-language": "^4.3 || ^5.4", + "symfony/framework-bundle": "^4.3 || ^5.4", + "symfony/translation": "^4.3 || ^5.4", + "symfony/translation-contracts": "^1.1 || ^2.0", + "symfony/validator": "^4.3 || ^5.4", + "twig/twig": "^1.42.4 || ^2.12.5 || ^3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.11", + "doctrine/coding-standard": "^8.2.1", + "matthiasnoback/symfony-dependency-injection-test": "^4.1", + "nyholm/nsa": "^1.0.1", + "psr/log": "^1.0", + "sensio/framework-extra-bundle": "^5.5.4", + "symfony/asset": "^4.3 || ^5.4", + "symfony/browser-kit": "^4.3 || ^5.4", + "symfony/css-selector": "^4.3 || ^5.4", + "symfony/filesystem": "^4.3 || ^5.4", + "symfony/flex": "^1.19 || ^2.0", + "symfony/form": "^4.3 || ^5.4", + "symfony/phpunit-bridge": ">=5.4", + "symfony/property-access": "^4.3 || ^5.4", + "symfony/routing": "^4.4.15 || ^5.4", + "symfony/security-csrf": "^4.3 || ^5.4", + "symfony/templating": "^4.3 || ^5.4", + "symfony/twig-bundle": "^4.3.11 || ^5.4" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + }, + "symfony": { + "allow-contrib": true, + "require": "^5.4" + } + }, + "autoload": { + "psr-4": { + "JMS\\TranslationBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Puts the Symfony Translation Component on steroids", + "homepage": "http://jmsyst.com/bundles/JMSTranslationBundle", + "keywords": [ + "extract", + "extraction", + "i18n", + "interface", + "multilanguage", + "translation", + "ui", + "webinterface" + ], + "support": { + "issues": "https://github.com/schmittjoh/JMSTranslationBundle/issues", + "source": "https://github.com/schmittjoh/JMSTranslationBundle/tree/1.9.1" + }, + "time": "2023-03-27T17:06:32+00:00" + }, + { + "name": "knplabs/knp-menu", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpMenu.git", + "reference": "bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31", + "reference": "bf7d89a7ef406fd2ec1aae6f30f722e844bf6d31", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "conflict": { + "twig/twig": "<1.42.3 || >=2,<2.9" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "psr/container": "^1.0", + "symfony/http-foundation": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2", + "symfony/routing": "^5.4 || ^6.0", + "twig/twig": "^2.9 || ^3.0" + }, + "suggest": { + "twig/twig": "for the TwigRenderer and the integration with your templates" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Menu\\": "src/Knp/Menu" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KnpLabs", + "homepage": "https://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "The Community", + "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" + } + ], + "description": "An object oriented menu library", + "homepage": "https://knplabs.com", + "keywords": [ + "menu", + "tree" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpMenu/issues", + "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.4.0" + }, + "time": "2023-05-17T18:48:46+00:00" + }, + { + "name": "knplabs/knp-menu-bundle", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpMenuBundle.git", + "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpMenuBundle/zipball/02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", + "reference": "02a2c68a2d6247a21c1d5ed185e2e3e3d9e7dfb5", + "shasum": "" + }, + "require": { + "knplabs/knp-menu": "^3.3", + "php": "^8.0", + "symfony/deprecation-contracts": "^2.5 | ^3.3", + "symfony/framework-bundle": "^5.4 | ^6.0 | ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 | ^10.1", + "symfony/expression-language": "^5.4 | ^6.0 | ^7.0", + "symfony/phpunit-bridge": "^6.0 | ^7.0", + "symfony/templating": "^5.4 | ^6.0 | ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Bundle\\MenuBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Knplabs", + "homepage": "http://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/KnpLabs/KnpMenuBundle/contributors" + } + ], + "description": "This bundle provides an integration of the KnpMenu library", + "keywords": [ + "menu" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpMenuBundle/issues", + "source": "https://github.com/KnpLabs/KnpMenuBundle/tree/v3.3.0" + }, + "time": "2023-11-01T09:25:40+00:00" + }, + { + "name": "knpuniversity/oauth2-client-bundle", + "version": "v2.18.1", + "source": { + "type": "git", + "url": "https://github.com/knpuniversity/oauth2-client-bundle.git", + "reference": "1d59f49f164805b45f95f92cf743781bc2ba7d2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/1d59f49f164805b45f95f92cf743781bc2ba7d2b", + "reference": "1d59f49f164805b45f95f92cf743781bc2ba7d2b", + "shasum": "" + }, + "require": { + "league/oauth2-client": "^2.0", + "php": ">=8.1", + "symfony/dependency-injection": "^4.4|^5.0|^6.0|^7.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0|^7.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0|^7.0", + "symfony/routing": "^4.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "league/oauth2-facebook": "^1.1|^2.0", + "phpstan/phpstan": "^1.0", + "symfony/phpunit-bridge": "^5.3.1|^6.0|^7.0", + "symfony/security-guard": "^4.4|^5.0|^6.0|^7.0", + "symfony/yaml": "^4.4|^5.0|^6.0|^7.0" + }, + "suggest": { + "symfony/security-guard": "For integration with Symfony's Guard Security layer" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "KnpU\\OAuth2ClientBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ryan Weaver", + "email": "ryan@symfonycasts.com" + } + ], + "description": "Integration with league/oauth2-client to provide services", + "homepage": "https://symfonycasts.com", + "keywords": [ + "oauth", + "oauth2" + ], + "support": { + "issues": "https://github.com/knpuniversity/oauth2-client-bundle/issues", + "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.18.1" + }, + "time": "2024-02-14T17:41:28+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "7353d4099ad5388e84737dd16994316a04f48dbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf", + "reference": "7353d4099ad5388e84737dd16994316a04f48dbf", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0.1", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.5.0", + "laminas/laminas-stdlib": "^3.17.0", + "phpunit/phpunit": "^10.3.3", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.15.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-10-18T10:00:55+00:00" + }, + { + "name": "lcobucci/clock", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/039ef98c6b57b101d10bd11d8fdfda12cbd996dc", + "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.26", + "lcobucci/coding-standard": "^9.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.27" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2022-12-19T15:00:24+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.2.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/0ba88aed12c04bd2ed9924f500673f32b67a6211", + "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.27.0", + "lcobucci/clock": "^3.0", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2.9", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.2.6" + }, + "suggest": { + "lcobucci/clock": ">= 3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.2.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2023-11-20T21:17:42+00:00" + }, + { + "name": "league/flysystem", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", + "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", + "shasum": "" + }, + "require": { + "ext-json": "*", + "league/mime-type-detection": "^1.0.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "guzzlehttp/ringphp": "<1.1.1" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.0", + "aws/aws-sdk-php": "^3.132.4", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "friendsofphp/php-cs-fixer": "^3.2", + "google/cloud-storage": "^1.23", + "phpseclib/phpseclib": "^2.0", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^8.5 || ^9.4", + "sabre/dav": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/2.5.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-09-17T21:02:32+00:00" + }, + { + "name": "league/flysystem-memory", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-memory.git", + "reference": "f644026c705b8a501543f38cb8b745a603aa4952" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/f644026c705b8a501543f38cb8b745a603aa4952", + "reference": "f644026c705b8a501543f38cb8b745a603aa4952", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^2.0.0", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\InMemory\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "In-memory filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "memory" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-memory/issues", + "source": "https://github.com/thephpleague/flysystem-memory/tree/2.0.6" + }, + "time": "2021-02-12T19:24:17+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0" + }, + "time": "2023-04-16T18:19:15+00:00" + }, + { + "name": "lexik/jwt-authentication-bundle", + "version": "v2.20.3", + "source": { + "type": "git", + "url": "https://github.com/lexik/LexikJWTAuthenticationBundle.git", + "reference": "a196d68d07dd5486a523cc3415620badbb5d25c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/a196d68d07dd5486a523cc3415620badbb5d25c2", + "reference": "a196d68d07dd5486a523cc3415620badbb5d25c2", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "lcobucci/clock": "^1.2|^2.0|^3.0", + "lcobucci/jwt": "^3.4|^4.1|^5.0", + "namshi/jose": "^7.2", + "php": ">=7.1", + "symfony/config": "^4.4|^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^4.4|^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.4|^3.0", + "symfony/event-dispatcher": "^4.4|^5.4|^6.0|^7.0", + "symfony/http-foundation": "^4.4|^5.4|^6.0|^7.0", + "symfony/http-kernel": "^4.4|^5.4|^6.0|^7.0", + "symfony/property-access": "^4.4|^5.4|^6.0|^7.0", + "symfony/security-bundle": "^4.4|^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^1.0|^2.0|^3.0" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^4.4|^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^4.4|^5.4|^6.0|^7.0", + "symfony/phpunit-bridge": "^4.4|^5.4|^6.0|^7.0", + "symfony/security-guard": "^4.4|^5.4|^6.0|^7.0", + "symfony/var-dumper": "^4.4|^5.4|^6.0|^7.0", + "symfony/yaml": "^4.4|^5.4|^6.0|^7.0" + }, + "suggest": { + "gesdinet/jwt-refresh-token-bundle": "Implements a refresh token system over Json Web Tokens in Symfony", + "spomky-labs/lexik-jose-bridge": "Provides a JWT Token encoder with encryption support" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Lexik\\Bundle\\JWTAuthenticationBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Barthe", + "email": "j.barthe@lexik.fr", + "homepage": "https://github.com/jeremyb" + }, + { + "name": "Nicolas Cabot", + "email": "n.cabot@lexik.fr", + "homepage": "https://github.com/slashfan" + }, + { + "name": "Cedric Girard", + "email": "c.girard@lexik.fr", + "homepage": "https://github.com/cedric-g" + }, + { + "name": "Dev Lexik", + "email": "dev@lexik.fr", + "homepage": "https://github.com/lexik" + }, + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com", + "homepage": "https://github.com/chalasr" + }, + { + "name": "Lexik Community", + "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle/graphs/contributors" + } + ], + "description": "This bundle provides JWT authentication for your Symfony REST API", + "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle", + "keywords": [ + "Authentication", + "JWS", + "api", + "bundle", + "jwt", + "rest", + "symfony" + ], + "support": { + "issues": "https://github.com/lexik/LexikJWTAuthenticationBundle/issues", + "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v2.20.3" + }, + "funding": [ + { + "url": "https://github.com/chalasr", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/lexik/jwt-authentication-bundle", + "type": "tidelift" + } + ], + "time": "2023-12-14T15:58:11+00:00" + }, + { + "name": "liip/imagine-bundle", + "version": "2.12.2", + "source": { + "type": "git", + "url": "https://github.com/liip/LiipImagineBundle.git", + "reference": "2ad259dd46ce55f93c6e8d87908d2572bd94796e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/2ad259dd46ce55f93c6e8d87908d2572bd94796e", + "reference": "2ad259dd46ce55f93c6e8d87908d2572bd94796e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "imagine/imagine": "^1.3.2", + "php": "^7.2|^8.0", + "symfony/filesystem": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/finder": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/framework-bundle": "^3.4.23|^4.4|^5.3|^6.0|^7.0", + "symfony/mime": "^4.4|^5.3|^6.0|^7.0", + "symfony/options-resolver": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/process": "^3.4|^4.4|^5.3|^6.0|^7.0", + "twig/twig": "^1.44|^2.9|^3.0" + }, + "require-dev": { + "amazonwebservices/aws-sdk-for-php": "^1.0", + "aws/aws-sdk-php": "^2.4|^3.0", + "doctrine/cache": "^1.11|^2.0", + "doctrine/persistence": "^1.3|^2.0", + "enqueue/enqueue-bundle": "^0.9|^0.10", + "ext-gd": "*", + "league/flysystem": "^1.0|^2.0|^3.0", + "phpstan/phpstan": "^1.10.0", + "psr/cache": "^1.0|^2.0|^3.0", + "psr/log": "^1.0", + "symfony/browser-kit": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/cache": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/console": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/dependency-injection": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/form": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/messenger": "^4.4|^5.3|^6.0|^7.0", + "symfony/phpunit-bridge": "^7.0.2", + "symfony/templating": "^3.4|^4.4|^5.3|^6.0", + "symfony/validator": "^3.4|^4.4|^5.3|^6.0|^7.0", + "symfony/yaml": "^3.4|^4.4|^5.3|^6.0|^7.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "required for mongodb components", + "amazonwebservices/aws-sdk-for-php": "required to use AWS version 1 cache resolver", + "aws/aws-sdk-php": "required to use AWS version 2/3 cache resolver", + "doctrine/mongodb-odm": "required to use mongodb-backed doctrine components", + "enqueue/enqueue-bundle": "^0.9 add if you like to process images in background", + "ext-exif": "required to read EXIF metadata from images", + "ext-gd": "required to use gd driver", + "ext-gmagick": "required to use gmagick driver", + "ext-imagick": "required to use imagick driver", + "ext-mongodb": "required for mongodb components", + "league/flysystem": "required to use FlySystem data loader or cache resolver", + "monolog/monolog": "A psr/log compatible logger is required to enable logging", + "rokka/imagine-vips": "required to use 'vips' driver", + "symfony/messenger": "If you like to process images in background", + "symfony/templating": "required to use deprecated Templating component instead of Twig" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Liip\\ImagineBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Liip and other contributors", + "homepage": "https://github.com/liip/LiipImagineBundle/contributors" + } + ], + "description": "This bundle provides an image manipulation abstraction toolkit for Symfony-based projects.", + "homepage": "https://www.liip.ch", + "keywords": [ + "bundle", + "image", + "imagine", + "liip", + "manipulation", + "photos", + "pictures", + "symfony", + "transformation" + ], + "support": { + "issues": "https://github.com/liip/LiipImagineBundle/issues", + "source": "https://github.com/liip/LiipImagineBundle/tree/2.12.2" + }, + "time": "2024-02-23T21:12:25+00:00" + }, + { + "name": "mck89/peast", + "version": "v1.16.2", + "source": { + "type": "git", + "url": "https://github.com/mck89/peast.git", + "reference": "2791b08ffcc1862fe18eef85675da3aa58c406fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mck89/peast/zipball/2791b08ffcc1862fe18eef85675da3aa58c406fe", + "reference": "2791b08ffcc1862fe18eef85675da3aa58c406fe", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.16.2-dev" + } + }, + "autoload": { + "psr-4": { + "Peast\\": "lib/Peast/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marco Marchiò", + "email": "marco.mm89@gmail.com" + } + ], + "description": "Peast is PHP library that generates AST for JavaScript code", + "support": { + "issues": "https://github.com/mck89/peast/issues", + "source": "https://github.com/mck89/peast/tree/v1.16.2" + }, + "time": "2024-03-05T09:16:03+00:00" + }, + { + "name": "moneyphp/money", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/moneyphp/money.git", + "reference": "0dc40e3791c67e8793e3aa13fead8cf4661ec9cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/moneyphp/money/zipball/0dc40e3791c67e8793e3aa13fead8cf4661ec9cd", + "reference": "0dc40e3791c67e8793e3aa13fead8cf4661ec9cd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "cache/taggable-cache": "^0.4.0", + "doctrine/instantiator": "^1.0.5", + "ext-bcmath": "*", + "ext-gmp": "*", + "ext-intl": "*", + "florianv/exchanger": "^1.0", + "florianv/swap": "^3.0", + "friends-of-phpspec/phpspec-code-coverage": "^3.1.1 || ^4.3", + "moneyphp/iso-currencies": "^3.2.1", + "php-http/message": "^1.4", + "php-http/mock-client": "^1.0.0", + "phpspec/phpspec": "^3.4.3", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.18 || ^8.5", + "psr/cache": "^1.0", + "symfony/phpunit-bridge": "^4" + }, + "suggest": { + "ext-bcmath": "Calculate without integer limits", + "ext-gmp": "Calculate without integer limits", + "ext-intl": "Format Money objects with intl", + "florianv/exchanger": "Exchange rates library for PHP", + "florianv/swap": "Exchange rates library for PHP", + "psr/cache-implementation": "Used for Currency caching" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Money\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Verraes", + "email": "mathias@verraes.net", + "homepage": "http://verraes.net" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Frederik Bosch", + "email": "f.bosch@genkgo.nl" + } + ], + "description": "PHP implementation of Fowler's Money pattern", + "homepage": "http://moneyphp.org", + "keywords": [ + "Value Object", + "money", + "vo" + ], + "support": { + "issues": "https://github.com/moneyphp/money/issues", + "source": "https://github.com/moneyphp/money/tree/v3.3.3" + }, + "time": "2022-09-21T07:43:36+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-10-27T15:25:26+00:00" + }, + { + "name": "murtukov/php-code-generator", + "version": "v0.1.6", + "source": { + "type": "git", + "url": "https://github.com/murtukov/php-code-generator.git", + "reference": "89b6063daa42870bc08e4ce6e670f2ae62634bba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/murtukov/php-code-generator/zipball/89b6063daa42870bc08e4ce6e670f2ae62634bba", + "reference": "89b6063daa42870bc08e4ce6e670f2ae62634bba", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.4" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.58", + "phpunit/phpunit": "^9.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Murtukov\\PHPCodeGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Timur Murtukov", + "email": "murtukov@gmail.com" + } + ], + "description": "A library to generate php code", + "support": { + "issues": "https://github.com/murtukov/php-code-generator/issues", + "source": "https://github.com/murtukov/php-code-generator/tree/v0.1.6" + }, + "time": "2021-05-04T16:39:00+00:00" + }, + { + "name": "namshi/jose", + "version": "7.2.3", + "source": { + "type": "git", + "url": "https://github.com/namshi/jose.git", + "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/namshi/jose/zipball/89a24d7eb3040e285dd5925fcad992378b82bcff", + "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff", + "shasum": "" + }, + "require": { + "ext-date": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-spl": "*", + "php": ">=5.5", + "symfony/polyfill-php56": "^1.0" + }, + "require-dev": { + "phpseclib/phpseclib": "^2.0", + "phpunit/phpunit": "^4.5|^5.0", + "satooshi/php-coveralls": "^1.0" + }, + "suggest": { + "ext-openssl": "Allows to use OpenSSL as crypto engine.", + "phpseclib/phpseclib": "Allows to use Phpseclib as crypto engine, use version ^2.0." + }, + "type": "library", + "autoload": { + "psr-4": { + "Namshi\\JOSE\\": "src/Namshi/JOSE/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Nadalin", + "email": "alessandro.nadalin@gmail.com" + }, + { + "name": "Alessandro Cinelli (cirpo)", + "email": "alessandro.cinelli@gmail.com" + } + ], + "description": "JSON Object Signing and Encryption library for PHP.", + "keywords": [ + "JSON Web Signature", + "JSON Web Token", + "JWS", + "json", + "jwt", + "token" + ], + "support": { + "issues": "https://github.com/namshi/jose/issues", + "source": "https://github.com/namshi/jose/tree/master" + }, + "time": "2016-12-05T07:27:31+00:00" + }, + { + "name": "nelmio/cors-bundle", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nelmio/NelmioCorsBundle.git", + "reference": "78fcdb91f76b080a1008133def9c7f613833933d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/78fcdb91f76b080a1008133def9c7f613833933d", + "reference": "78fcdb91f76b080a1008133def9c7f613833933d", + "shasum": "" + }, + "require": { + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.6", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Nelmio\\CorsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nelmio", + "homepage": "http://nelm.io" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", + "keywords": [ + "api", + "cors", + "crossdomain" + ], + "support": { + "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" + }, + "time": "2023-11-30T16:41:19+00:00" + }, + { + "name": "netgen/query-translator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/netgen/query-translator.git", + "reference": "d38e4e4d947aa205ff81594d302b1080e96b79f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/netgen/query-translator/zipball/d38e4e4d947aa205ff81594d302b1080e96b79f6", + "reference": "d38e4e4d947aa205ff81594d302b1080e96b79f6", + "shasum": "" + }, + "require": { + "php": "^7.0||^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.11", + "phpunit/phpunit": "*", + "symfony/phpunit-bridge": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "QueryTranslator\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Petar Španja", + "email": "petar@spanja.info" + } + ], + "description": "Query Translator is a search query translator with AST representation", + "homepage": "https://github.com/netgen/query-translator", + "keywords": [ + "ast", + "edismax", + "elasticsearch", + "generator", + "parser", + "query", + "search", + "solr", + "tokenizer", + "translator" + ], + "support": { + "issues": "https://github.com/netgen/query-translator/issues", + "source": "https://github.com/netgen/query-translator/tree/1.1.0" + }, + "time": "2022-01-13T09:24:37+00:00" + }, + { + "name": "nicmart/tree", + "version": "v0.2.7", + "source": { + "type": "git", + "url": "https://github.com/nicmart/Tree.git", + "reference": "0616b54bb49938e1a816141d7943db48ebf76938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nicmart/Tree/zipball/0616b54bb49938e1a816141d7943db48ebf76938", + "reference": "0616b54bb49938e1a816141d7943db48ebf76938", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tree\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolò Martini", + "email": "nicmartnic@gmail.com" + } + ], + "description": "A basic but flexible php tree data structure and a fluent tree builder implementation.", + "support": { + "issues": "https://github.com/nicmart/Tree/issues", + "source": "https://github.com/nicmart/Tree/tree/master" + }, + "time": "2015-08-20T20:50:35+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + }, + "time": "2024-03-17T08:10:35+00:00" + }, + { + "name": "oneup/flysystem-bundle", + "version": "4.12.0", + "source": { + "type": "git", + "url": "https://github.com/1up-lab/OneupFlysystemBundle.git", + "reference": "76949b068d1b3756ffac8abb1ba758fcb979a6a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/1up-lab/OneupFlysystemBundle/zipball/76949b068d1b3756ffac8abb1ba758fcb979a6a3", + "reference": "76949b068d1b3756ffac8abb1ba758fcb979a6a3", + "shasum": "" + }, + "require": { + "league/flysystem": "^2.0 || ^3.0", + "php": "^8.1", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^3.51", + "league/flysystem-async-aws-s3": "^2.0 || ^3.0", + "league/flysystem-aws-s3-v3": "^2.0 || ^3.0", + "league/flysystem-azure-blob-storage": "^3.0", + "league/flysystem-ftp": "^2.0 || ^3.0", + "league/flysystem-google-cloud-storage": "^2.0 || ^3.0", + "league/flysystem-memory": "^2.0 || ^3.0", + "league/flysystem-sftp-v3": "^2.0 || ^3.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6.17", + "royvoetman/flysystem-gitlab-storage": "^2.0 || ^3.0", + "symfony/asset": "^5.4 || ^6.0 || ^7.0", + "symfony/browser-kit": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^7.0", + "symfony/templating": "^5.4 || ^6.0 || ^7.0", + "symfony/translation": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Required for FTP and SFTP", + "league/flysystem-async-aws-s3": "Use flysystem S3 adapter from AsyncAws", + "league/flysystem-aws-s3-v3": "Use S3 storage with AWS SDK v3", + "league/flysystem-google-cloud-storage": "Use Google Cloud Storage Adapter for Flysystem", + "league/flysystem-sftp-v3": "Allows SFTP server storage via phpseclib", + "royvoetman/flysystem-gitlab-storage": "Use Gitlab Storage filesystem for Flysystem" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Oneup\\FlysystemBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Schmid", + "email": "js@1up.io", + "homepage": "https://1up.io", + "role": "Developer" + }, + { + "name": "David Greminger", + "email": "dg@1up.io", + "homepage": "https://1up.io", + "role": "Developer" + } + ], + "description": "Integrates Flysystem filesystem abstraction library to your Symfony project.", + "homepage": "https://1up.io", + "keywords": [ + "Flysystem", + "abstraction", + "filesystem", + "symfony" + ], + "support": { + "issues": "https://github.com/1up-lab/OneupFlysystemBundle/issues", + "source": "https://github.com/1up-lab/OneupFlysystemBundle/tree/4.12.0" + }, + "time": "2024-03-14T09:30:06+00:00" + }, + { + "name": "overblog/graphiql-bundle", + "version": "v0.2.1", + "source": { + "type": "git", + "url": "https://github.com/overblog/GraphiQLBundle.git", + "reference": "3161762574dcc6b264e1b6046e5fd2769e4e87c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overblog/GraphiQLBundle/zipball/3161762574dcc6b264e1b6046e5fd2769e4e87c4", + "reference": "3161762574dcc6b264e1b6046e5fd2769e4e87c4", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/framework-bundle": "^3.4 || ^4.0 || ^5.0", + "symfony/twig-bundle": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "overblog/graphql-bundle": ">=0.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "sensio/framework-extra-bundle": "^3.0 || ^4.0 || ^5.0", + "symfony/browser-kit": "^3.4 || ^4.0 || ^5.0", + "symfony/templating": "^3.4 || ^4.0 || ^5.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "0.1-dev" + } + }, + "autoload": { + "psr-4": { + "Overblog\\GraphiQLBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Renato Mefi", + "email": "renato@mefi.in" + }, + { + "name": "Overblog", + "homepage": "http://www.over-blog.com" + } + ], + "description": "Symfony GraphiQLBundle makes possible to render the UI into your symfony project", + "keywords": [ + "graphiql", + "graphql" + ], + "support": { + "issues": "https://github.com/overblog/GraphiQLBundle/issues", + "source": "https://github.com/overblog/GraphiQLBundle/tree/master" + }, + "time": "2020-02-03T16:17:50+00:00" + }, + { + "name": "overblog/graphql-bundle", + "version": "v0.14.4", + "source": { + "type": "git", + "url": "https://github.com/overblog/GraphQLBundle.git", + "reference": "ef52da46a2f60437c3c268318e8404bc2e831262" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overblog/GraphQLBundle/zipball/ef52da46a2f60437c3c268318e8404bc2e831262", + "reference": "ef52da46a2f60437c3c268318e8404bc2e831262", + "shasum": "" + }, + "require": { + "ext-json": "*", + "murtukov/php-code-generator": "^0.1.5", + "php": ">=7.4", + "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/type-resolver": ">1.4.0,<1.6.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/config": "^4.4.30 || ^5.3.7", + "symfony/dependency-injection": "^4.4.30 || ^5.3.7", + "symfony/event-dispatcher": "^4.4 || ^5.3", + "symfony/expression-language": "^4.4 || ^5.3", + "symfony/framework-bundle": "^4.4.30 || ^5.3.7", + "symfony/http-foundation": "^4.4.30 || ^5.3.7", + "symfony/http-kernel": "^4.4 || ^5.3", + "symfony/options-resolver": "^4.4 || ^5.3", + "symfony/property-access": "^4.4 || ^5.3", + "webonyx/graphql-php": "^14.5" + }, + "conflict": { + "react/promise": "<2.8" + }, + "require-dev": { + "doctrine/annotations": "^1.13", + "doctrine/orm": "^2.5", + "monolog/monolog": "^1.26.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.58", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpstan/phpstan-symfony": "^0.12.6", + "phpunit/phpunit": "^9.5.10", + "react/promise": "^2.5", + "symfony/asset": "^4.4 || ^5.3", + "symfony/browser-kit": "^4.4 || ^5.3", + "symfony/console": "^4.4.30 || ^5.3", + "symfony/css-selector": "^4.4 || ^5.3", + "symfony/dom-crawler": "^4.4.30 || ^5.3.7", + "symfony/finder": "^4.4.30 || ^5.3.7", + "symfony/monolog-bundle": "^3.7", + "symfony/phpunit-bridge": "^6.0", + "symfony/process": "^4.4.30 || ^5.3.7", + "symfony/routing": "^4.4 || ^5.3.7", + "symfony/security-bundle": "^4.4 || ^5.3", + "symfony/validator": "^4.4.30 || ^5.3.7", + "symfony/var-dumper": "^4.4.30 || ^5.3.7", + "symfony/yaml": "^4.4 || ^5.3", + "twig/twig": "^2.10|^3.0" + }, + "suggest": { + "nelmio/cors-bundle": "For more flexibility when using CORS prefight", + "overblog/graphiql-bundle": "If you want to use graphiQL.", + "react/promise": "To use ReactPHP promise adapter", + "symfony/translation": "If you want validation error messages to be translated." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "0.14-dev" + } + }, + "autoload": { + "psr-4": { + "Overblog\\GraphQLBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Overblog", + "homepage": "http://www.over-blog.com" + } + ], + "description": "This bundle provides tools to build a GraphQL server in your Symfony App.", + "keywords": [ + "Relay", + "graphql" + ], + "support": { + "issues": "https://github.com/overblog/GraphQLBundle/issues", + "source": "https://github.com/overblog/GraphQLBundle/tree/v0.14.4" + }, + "time": "2023-01-18T17:11:19+00:00" + }, + { + "name": "pagerfanta/pagerfanta", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/BabDev/Pagerfanta.git", + "reference": "5f2aa1f1c9d1a6520f459e84b63e2bc25e9eea5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/BabDev/Pagerfanta/zipball/5f2aa1f1c9d1a6520f459e84b63e2bc25e9eea5b", + "reference": "5f2aa1f1c9d1a6520f459e84b63e2bc25e9eea5b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.2 || ^8.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "twig/twig": "<1.35 || >=2.0,<2.5" + }, + "replace": { + "pagerfanta/core": "self.version", + "pagerfanta/doctrine-collections-adapter": "self.version", + "pagerfanta/doctrine-dbal-adapter": "self.version", + "pagerfanta/doctrine-mongodb-odm-adapter": "self.version", + "pagerfanta/doctrine-orm-adapter": "self.version", + "pagerfanta/doctrine-phpcr-odm-adapter": "self.version", + "pagerfanta/elastica-adapter": "self.version", + "pagerfanta/solarium-adapter": "self.version", + "pagerfanta/twig": "self.version" + }, + "require-dev": { + "dg/bypass-finals": "^1.3.1", + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/collections": "^1.4", + "doctrine/dbal": "^2.5 || ^3.0", + "doctrine/orm": "^2.5", + "doctrine/phpcr-odm": "^1.3", + "friendsofphp/php-cs-fixer": "^3.0", + "jackalope/jackalope-doctrine-dbal": "^1.3", + "mandango/mandango": "^1.0@dev", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^0.12.93", + "phpstan/phpstan-phpunit": "^0.12.21", + "phpunit/phpunit": "^8.5 || ^9.5", + "propel/propel": "^2.0@dev", + "propel/propel1": "^1.7", + "ruflin/elastica": "^1.3 || ^2.0 || ^3.0 || ^5.0 || ^6.0 || ^7.0", + "solarium/solarium": "^2.3 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0", + "twig/twig": "^1.35 || ^2.5 || ^3.0" + }, + "suggest": { + "twig/twig": "To integrate Pagerfanta with Twig" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pagerfanta\\": "lib/Core/", + "Pagerfanta\\Twig\\": "lib/Twig/", + "Pagerfanta\\Adapter\\": "src/Adapter/", + "Pagerfanta\\Elastica\\": "lib/Adapter/Elastica/", + "Pagerfanta\\Solarium\\": "lib/Adapter/Solarium/", + "Pagerfanta\\Doctrine\\ORM\\": "lib/Adapter/Doctrine/ORM/", + "Pagerfanta\\Doctrine\\DBAL\\": "lib/Adapter/Doctrine/DBAL/", + "Pagerfanta\\Doctrine\\PHPCRODM\\": "lib/Adapter/Doctrine/PHPCRODM/", + "Pagerfanta\\Doctrine\\MongoDBODM\\": "lib/Adapter/Doctrine/MongoDBODM/", + "Pagerfanta\\Doctrine\\Collections\\": "lib/Adapter/Doctrine/Collections/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Pagination for PHP", + "keywords": [ + "page", + "pagination", + "paginator", + "paging" + ], + "support": { + "issues": "https://github.com/BabDev/Pagerfanta/issues", + "source": "https://github.com/BabDev/Pagerfanta/tree/v2.7.3" + }, + "funding": [ + { + "url": "https://github.com/mbabker", + "type": "github" + } + ], + "time": "2022-03-03T00:01:24+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", + "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.1" + }, + "time": "2023-11-30T10:31:25+00:00" + }, + { + "name": "php-http/curl-client", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/curl-client.git", + "reference": "0b869922458b1cde9137374545ed4fff7ac83623" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/curl-client/zipball/0b869922458b1cde9137374545ed4fff7ac83623", + "reference": "0b869922458b1cde9137374545ed4fff7ac83623", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": "^7.4 || ^8.0", + "php-http/discovery": "^1.6", + "php-http/httplug": "^2.0", + "php-http/message": "^1.2", + "psr/http-client": "^1.0", + "psr/http-factory-implementation": "^1.0", + "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "guzzlehttp/psr7": "^2.0", + "laminas/laminas-diactoros": "^2.0", + "php-http/client-integration-tests": "^3.0", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^7.5 || ^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Curl\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Михаил Красильников", + "email": "m.krasilnikov@yandex.ru" + } + ], + "description": "PSR-18 and HTTPlug Async client with cURL", + "homepage": "http://php-http.org", + "keywords": [ + "curl", + "http", + "psr-18" + ], + "support": { + "issues": "https://github.com/php-http/curl-client/issues", + "source": "https://github.com/php-http/curl-client/tree/2.3.2" + }, + "time": "2024-03-03T08:21:07+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.19.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.2" + }, + "time": "2023-11-30T16:49:05+00:00" + }, + { + "name": "php-http/guzzle6-adapter", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "9d1a45eb1c59f12574552e81fb295e9e53430a56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/9d1a45eb1c59f12574552e81fb295e9e53430a56", + "reference": "9d1a45eb1c59f12574552e81fb295e9e53430a56", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/client-integration-tests": "^2.0 || ^3.0", + "phpunit/phpunit": "^7.4 || ^8.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "support": { + "issues": "https://github.com/php-http/guzzle6-adapter/issues", + "source": "https://github.com/php-http/guzzle6-adapter/tree/v2.0.2" + }, + "abandoned": "guzzlehttp/guzzle or php-http/guzzle7-adapter", + "time": "2021-03-02T10:52:33+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" + }, + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "5997f3289332c699fa2545c427826272498a2088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", + "reference": "5997f3289332c699fa2545c427826272498a2088", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.1" + }, + "time": "2024-03-07T13:22:09+00:00" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "time": "2024-03-15T13:55:21+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + }, + "time": "2021-10-02T14:08:47+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.26.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" + }, + "time": "2024-02-23T16:05:55+00:00" + }, + { + "name": "platformsh/config-reader", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/platformsh/config-reader-php.git", + "reference": "dc08f50f5a40a767457668ad154116c8ea89cfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/platformsh/config-reader-php/zipball/dc08f50f5a40a767457668ad154116c8ea89cfc6", + "reference": "dc08f50f5a40a767457668ad154116c8ea89cfc6", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Platformsh\\ConfigReader\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Larry Garfield", + "email": "larry@platform.sh" + } + ], + "description": "Small helper to access Platform.sh environment variables", + "support": { + "issues": "https://github.com/platformsh/config-reader-php/issues", + "source": "https://github.com/platformsh/config-reader-php/tree/2.4.1" + }, + "time": "2023-09-14T17:07:00+00:00" + }, + { + "name": "platformsh/symfonyflex-bridge", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/platformsh/symfonyflex-bridge.git", + "reference": "47812e13f25a9bb88e530c5d5f37b4a4f1cc2cf5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/platformsh/symfonyflex-bridge/zipball/47812e13f25a9bb88e530c5d5f37b4a4f1cc2cf5", + "reference": "47812e13f25a9bb88e530c5d5f37b4a4f1cc2cf5", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "platformsh/config-reader": "^2.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "files": [ + "platformsh-flex-env.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Larry Garfield", + "email": "larry@platform.sh" + } + ], + "description": "Bridge library for running Symfony Flex on Platform.sh", + "support": { + "issues": "https://github.com/platformsh/symfonyflex-bridge/issues", + "source": "https://github.com/platformsh/symfonyflex-bridge/tree/2.7.2" + }, + "abandoned": true, + "time": "2022-10-14T12:34:58+00:00" + }, + { + "name": "psr/cache", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/2.0.0" + }, + "time": "2021-02-03T23:23:37+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/link", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/link.git", + "reference": "846c25f58a1f02b93a00f2404e3626b6bf9b7807" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/link/zipball/846c25f58a1f02b93a00f2404e3626b6bf9b7807", + "reference": "846c25f58a1f02b93a00f2404e3626b6bf9b7807", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Link\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for HTTP links", + "homepage": "https://github.com/php-fig/link", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "support": { + "source": "https://github.com/php-fig/link/tree/1.1.1" + }, + "time": "2021-03-11T22:59:13+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.9.7", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "dc75aa439eb4c1b77f5379fd958b3dc0e6014178" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/dc75aa439eb4c1b77f5379fd958b3dc0e6014178", + "reference": "dc75aa439eb4c1b77f5379fd958b3dc0e6014178", + "shasum": "" + }, + "require": { + "ext-json": "*", + "paragonie/random_compat": "^1 | ^2 | ^9.99.99", + "php": "^5.4 | ^7.0 | ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^1 | ^2", + "doctrine/annotations": "^1.2", + "goaop/framework": "1.0.0-alpha.2 | ^1 | >=2.1.0 <=2.3.2", + "mockery/mockery": "^0.9.11 | ^1", + "moontoast/math": "^1.1", + "nikic/php-parser": "<=4.5.0", + "paragonie/random-lib": "^2", + "php-mock/php-mock-phpunit": "^0.3 | ^1.1 | ^2.6", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpunit/phpunit": ">=4.8.36 <9.0.0 | >=9.3.0", + "squizlabs/php_codesniffer": "^3.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-ctype": "Provides support for PHP Ctype functions", + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + }, + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "rss": "https://github.com/ramsey/uuid/releases.atom", + "source": "https://github.com/ramsey/uuid", + "wiki": "https://github.com/ramsey/uuid/wiki" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2022-12-19T21:55:10+00:00" + }, + { + "name": "react/promise", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/1a8460931ea36dc5c76838fec5734d55c88c6831", + "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v2.11.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-16T16:16:50+00:00" + }, + { + "name": "scssphp/scssphp", + "version": "v1.12.1", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/394ed1e960138710a60d035c1a85d43d0bf0faeb", + "reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^5.1", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "~5.0", + "twbs/bootstrap4": "4.6.1", + "zurb/foundation": "~6.7.0" + }, + "suggest": { + "ext-iconv": "Can be used as fallback when ext-mbstring is not available", + "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" + }, + "bin": [ + "bin/pscss" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "forward-command": false, + "bin-links": false + } + }, + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "http://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "support": { + "issues": "https://github.com/scssphp/scssphp/issues", + "source": "https://github.com/scssphp/scssphp/tree/v1.12.1" + }, + "time": "2024-01-13T12:36:40+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/monolog-bridge": "^4.0|^5.0|^6.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "6.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "support": { + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.10" + }, + "abandoned": "Symfony", + "time": "2023-02-24T14:57:12+00:00" + }, + { + "name": "soundasleep/html2text", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/soundasleep/html2text.git", + "reference": "3243a7107878a61685d2eccf99918d6479e039fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/soundasleep/html2text/zipball/3243a7107878a61685d2eccf99918d6479e039fc", + "reference": "3243a7107878a61685d2eccf99918d6479e039fc", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "~7.0", + "soundasleep/component-tests": "~0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Soundasleep\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jevon Wright", + "homepage": "https://jevon.org", + "role": "Developer" + } + ], + "description": "A PHP script to convert HTML into a plain text format", + "homepage": "https://github.com/soundasleep/html2text", + "keywords": [ + "email", + "html", + "php", + "text" + ], + "support": { + "email": "support@jevon.org", + "issues": "https://github.com/soundasleep/html2text/issues", + "source": "https://github.com/soundasleep/html2text/tree/master" + }, + "time": "2019-02-15T01:44:54+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "62f7463483d1bd975f6f06025d89d42a29608fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/62f7463483d1bd975f6f06025d89d42a29608fe1", + "reference": "62f7463483d1bd975f6f06025d89d42a29608fe1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.3|^8.0", + "psr/log": "^1.0 | ^2.0 | ^3.0", + "symfony/process": "^4.2|^5.0|^6.0|^7.0" + }, + "require-dev": { + "pestphp/pest": "^1.21", + "phpunit/phpunit": "^8.5.21|^9.4.4", + "symfony/var-dumper": "^4.2|^5.0|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image-optimizer/issues", + "source": "https://github.com/spatie/image-optimizer/tree/1.7.2" + }, + "time": "2023-11-03T10:08:02+00:00" + }, + { + "name": "stof/doctrine-extensions-bundle", + "version": "v1.10.1", + "source": { + "type": "git", + "url": "https://github.com/stof/StofDoctrineExtensionsBundle.git", + "reference": "299d5333ce83941069852be36b949abbc776bf1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/299d5333ce83941069852be36b949abbc776bf1d", + "reference": "299d5333ce83941069852be36b949abbc776bf1d", + "shasum": "" + }, + "require": { + "gedmo/doctrine-extensions": "^3.5.0", + "php": "^7.2.5 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "symfony/mime": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^v6.4.1 || ^7.0.1", + "symfony/security-core": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "doctrine/doctrine-bundle": "to use the ORM extensions", + "doctrine/mongodb-odm-bundle": "to use the MongoDB ODM extensions", + "symfony/mime": "To use the Mime component integration for Uploadable" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Stof\\DoctrineExtensionsBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + } + ], + "description": "Integration of the gedmo/doctrine-extensions with Symfony", + "homepage": "https://github.com/stof/StofDoctrineExtensionsBundle", + "keywords": [ + "behaviors", + "doctrine2", + "extensions", + "gedmo", + "loggable", + "nestedset", + "sluggable", + "sortable", + "timestampable", + "translatable", + "tree" + ], + "support": { + "issues": "https://github.com/stof/StofDoctrineExtensionsBundle/issues", + "source": "https://github.com/stof/StofDoctrineExtensionsBundle/tree/v1.10.1" + }, + "time": "2023-12-09T09:33:39+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony-cmf/routing", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony-cmf/Routing.git", + "reference": "bbcdf2f6301d740454ba9ebb8adaefd436c36a6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/bbcdf2f6301d740454ba9ebb8adaefd436c36a6b", + "reference": "bbcdf2f6301d740454ba9ebb8adaefd436c36a6b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/http-kernel": "^4.4 || ^5.0", + "symfony/routing": "^4.4 || ^5.0" + }, + "require-dev": { + "symfony-cmf/testing": "^3@dev", + "symfony/config": "^4.4 || ^5.0", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/event-dispatcher": "^4.4 || ^5.0", + "symfony/phpunit-bridge": "^5.0" + }, + "suggest": { + "symfony/event-dispatcher": "DynamicRouter can optionally trigger an event at the start of matching. Minimal version (^4.4 || ^5.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Cmf\\Component\\Routing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony CMF Community", + "homepage": "https://github.com/symfony-cmf/Routing/contributors" + } + ], + "description": "Extends the Symfony routing component for dynamic routes and chaining several routers", + "homepage": "http://cmf.symfony.com", + "keywords": [ + "database", + "routing" + ], + "support": { + "issues": "https://github.com/symfony-cmf/Routing/issues", + "source": "https://github.com/symfony-cmf/Routing/tree/2.3.4" + }, + "time": "2021-11-08T16:33:10+00:00" + }, + { + "name": "symfony/asset", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "0e98032106d18e57f57176d616e3fae80db7a845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/0e98032106d18e57f57176d616e3fae80db7a845", + "reference": "0e98032106d18e57f57176d616e3fae80db7a845", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/http-foundation": "<5.3" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/http-foundation": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "a30f316214d908cf5874f700f3f3fb29ceee91ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/a30f316214d908cf5874f700f3f3fb29ceee91ba", + "reference": "a30f316214d908cf5874f700f3f3fb29ceee91ba", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-19T13:08:14+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/config", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "0a4f363dc2f13d2f871f917cc563796d9ddc78d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/0a4f363dc2f13d2f871f917cc563796d9ddc78d1", + "reference": "0a4f363dc2f13d2f871f917cc563796d9ddc78d1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" + }, + "conflict": { + "symfony/finder": "<4.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-23T16:13:23+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", + "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-20T16:33:57+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "cc1fb237cd0e6da33005062b13b8485deb6e4440" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cc1fb237cd0e6da33005062b13b8485deb6e4440", + "reference": "cc1fb237cd0e6da33005062b13b8485deb6e4440", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" + }, + "require-dev": { + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-22T18:43:31+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v5.4.37", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "07ce0b69c4eed50aae2138916149da3f7d93dce7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/07ce0b69c4eed50aae2138916149da3f7d93dce7", + "reference": "07ce0b69c4eed50aae2138916149da3f7d93dce7", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "^2|^3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.7.4", + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<4.4", + "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/http-kernel": "<5", + "symfony/messenger": "<4.4", + "symfony/property-info": "<5", + "symfony/proxy-manager-bridge": "<4.4.19", + "symfony/security-bundle": "<5", + "symfony/security-core": "<5.3", + "symfony/validator": "<5.4.25|>=6,<6.2.12|>=6.3,<6.3.1" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/orm": "^2.7.4|^3", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/doctrine-messenger": "^5.1|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^5.4.21|^6.2.7", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/property-info": "^5.0|^6.0", + "symfony/proxy-manager-bridge": "^4.4|^5.0|^6.0", + "symfony/security-core": "^5.3|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "symfony/validator": "^5.4.25|~6.2.12|^6.3.1", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.4.37" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-27T10:07:57+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "4de488440104b99d2e7c0717ee432e760b061e32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/4de488440104b99d2e7c0717ee432e760b061e32", + "reference": "4de488440104b99d2e7c0717ee432e760b061e32", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "90b1d7799bfc1b3ed5f902e8b334eeb7dba537a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/90b1d7799bfc1b3ed5f902e8b334eeb7dba537a1", + "reference": "90b1d7799bfc1b3ed5f902e8b334eeb7dba537a1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-22T11:40:53+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/d59441c10a5a73cd9d4d778b8253595a16f6716d", + "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/flex", + "version": "v2.4.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "b0a405f40614c9f584b489d54f91091817b0e26e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/b0a405f40614c9f584b489d54f91091817b0e26e", + "reference": "b0a405f40614c9f584b489d54f91091817b0e26e", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.1", + "php": ">=8.0" + }, + "require-dev": { + "composer/composer": "^2.1", + "symfony/dotenv": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v2.4.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-02T08:16:47+00:00" + }, + { + "name": "symfony/form", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "3bbf663b8021a5a7b8f4bf9b868354db6611a514" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/3bbf663b8021a5a7b8f4bf9b868354db6611a514", + "reference": "3bbf663b8021a5a7b8f4bf9b868354db6611a514", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/options-resolver": "^5.1|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.23", + "symfony/property-access": "^5.0.8|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", + "symfony/error-handler": "<4.4.5", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", + "symfony/translation-contracts": "<1.1.7", + "symfony/twig-bridge": "<5.4.21|>=6,<6.2.7" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", + "symfony/uid": "^5.1|^6.0", + "symfony/validator": "^4.4.17|^5.1.9|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/form/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-08T18:38:25+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "224f69093099a507cf84d8c48ceb29e8653a5896" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/224f69093099a507cf84d8c48ceb29e8653a5896", + "reference": "224f69093099a507cf84d8c48ceb29e8653a5896", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/cache": "^5.2|^6.0", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^5.4.5|^6.0.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4.1|^5.0.1|^6.0", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.4.24|^6.2.11", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/routing": "^5.3|^6.0" + }, + "conflict": { + "doctrine/annotations": "<1.13.1", + "doctrine/cache": "<1.11", + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<5.3", + "symfony/console": "<5.2.5|>=7.0", + "symfony/dom-crawler": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<5.2", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<5.2", + "symfony/messenger": "<5.4", + "symfony/mime": "<4.4", + "symfony/property-access": "<5.3", + "symfony/property-info": "<4.4", + "symfony/security-csrf": "<5.3", + "symfony/serializer": "<5.2", + "symfony/service-contracts": ">=3.0", + "symfony/stopwatch": "<4.4", + "symfony/translation": "<5.3", + "symfony/twig-bridge": "<4.4", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<5.3.11", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "doctrine/annotations": "^1.13.1|^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/persistence": "^1.3|^2|^3", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.3|^6.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/console": "^5.4.9|^6.0.9", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", + "symfony/dotenv": "^5.1|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^5.2|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/mailer": "^5.2|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/notifier": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/property-info": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/security-bundle": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/string": "^5.0|^6.0", + "symfony/translation": "^5.3|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/validator": "^5.3.11|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/workflow": "^5.2|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^2.10|^3.0.4" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-20T14:48:43+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.4.37", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "63d93fd99523b9608929a38172da3365a6c0821c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/63d93fd99523b9608929a38172da3365a6c0821c", + "reference": "63d93fd99523b9608929a38172da3365a6c0821c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-client-contracts": "^2.4", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.0|^2|^3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.4" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.4.37" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-28T15:18:15+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", + "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-04-12T15:48:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.4.37", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "4ef7ed872564852b3c6c15fecf492975a52cbff3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4ef7ed872564852b3c6c15fecf492975a52cbff3", + "reference": "4ef7ed872564852b3c6c15fecf492975a52cbff3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.4.37" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-04T20:55:44+00:00" + }, + { + "name": "symfony/intl", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "2fb503f81cd8032a624c55764d1fbaf893aa3cf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/2fb503f81cd8032a624c55764d1fbaf893aa3cf4", + "reference": "2fb503f81cd8032a624c55764d1fbaf893aa3cf4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/lock", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", + "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/dbal": "<2.13" + }, + "require-dev": { + "doctrine/dbal": "^2.13|^3|^4", + "predis/predis": "~1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Derussé", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T08:00:51+00:00" + }, + { + "name": "symfony/monolog-bridge", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "83e7438fd2ead9af4fd2fac7bb9b6fc0e8823387" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/83e7438fd2ead9af4fd2fac7bb9b6fc0e8823387", + "reference": "83e7438fd2ead9af4fd2fac7bb9b6fc0e8823387", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/http-foundation": "<5.3" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mailer": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", + "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", + "php": ">=7.2.5", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-06T17:08:13+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:03:56+00:00" + }, + { + "name": "symfony/orm-pack", + "version": "v1.0.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/orm-pack.git", + "reference": "c9bcc08102061f406dc908192c0f33524a675666" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c9bcc08102061f406dc908192c0f33524a675666", + "reference": "c9bcc08102061f406dc908192c0f33524a675666", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "*", + "doctrine/doctrine-migrations-bundle": "*", + "doctrine/orm": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Doctrine ORM", + "support": { + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/master" + }, + "time": "2020-02-10T18:03:48+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "a0c08f9045230ef73d25617b2c0e0b56d8feb0a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/a0c08f9045230ef73d25617b2c0e0b56d8feb0a2", + "reference": "a0c08f9045230ef73d25617b2c0e0b56d8feb0a2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/security-core": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0", + "symfony/security-core": "^5.3|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-10T16:59:05+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:12:16+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675", + "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "4fdf34004f149cc20b2f51d7d119aa500caad975" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/4fdf34004f149cc20b2f51d7d119aa500caad975", + "reference": "4fdf34004f149cc20b2f51d7d119aa500caad975", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-12T15:49:53+00:00" + }, + { + "name": "symfony/property-access", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/property-info": "^5.2|^6.0" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T15:43:50+00:00" + }, + { + "name": "symfony/proxy-manager-bridge", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/proxy-manager-bridge.git", + "reference": "a4cf96f3acfa252503a216bea877478f9621c7c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/a4cf96f3acfa252503a216bea877478f9621c7c0", + "reference": "a4cf96f3acfa252503a216bea877478f9621c7c0", + "shasum": "" + }, + "require": { + "friendsofphp/proxy-manager-lts": "^1.0.2", + "php": ">=7.2.5", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0|^6.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\ProxyManager\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for ProxyManager with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-16T09:33:00+00:00" + }, + { + "name": "symfony/rate-limiter", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/9bd24ef2e0948fff4d6741798ba4c7468b75bc8d", + "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/lock": "^5.2|^6.0", + "symfony/options-resolver": "^5.1|^6.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.37", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "48ae43e443693ddb4e574f7c12f0d17ce287694e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/48ae43e443693ddb4e574f7c12f0d17ce287694e", + "reference": "48ae43e443693ddb4e574f7c12f0d17ce287694e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.37" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-27T09:52:32+00:00" + }, + { + "name": "symfony/runtime", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/runtime.git", + "reference": "a32a623d71fc0f699a2a196377b3b85c840bd39a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/runtime/zipball/a32a623d71fc0f699a2a196377b3b85c840bd39a", + "reference": "a32a623d71fc0f699a2a196377b3b85c840bd39a", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dotenv": "<5.1" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/console": "^4.4.30|^5.4.9|^6.0.9", + "symfony/dotenv": "^5.1|^6.0", + "symfony/http-foundation": "^4.4.30|^5.3.7|^6.0", + "symfony/http-kernel": "^4.4.30|^5.3.7|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Enables decoupling PHP applications from global state", + "homepage": "https://symfony.com", + "keywords": [ + "runtime" + ], + "support": { + "source": "https://github.com/symfony/runtime/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v5.4.37", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "6773ef12fe2671a42f111e31f2c18af18e79c55c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/6773ef12fe2671a42f111e31f2c18af18e79c55c", + "reference": "6773ef12fe2671a42f111e31f2c18af18e79c55c", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/password-hasher": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/security-core": "^5.4|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/security-guard": "^5.3", + "symfony/security-http": "^5.4.30|^6.3.6", + "symfony/service-contracts": "^1.10|^2|^3" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/console": "<4.4", + "symfony/framework-bundle": "<4.4", + "symfony/ldap": "<5.1", + "symfony/twig-bundle": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.3|^6.0", + "symfony/ldap": "^5.3|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/twig-bridge": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v5.4.37" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-01T19:35:15+00:00" + }, + { + "name": "symfony/security-core", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "3cbacefb2a350ed39950f93c8a054c2eb625fb69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/3cbacefb2a350ed39950f93c8a054c2eb625fb69", + "reference": "3cbacefb2a350ed39950f93c8a054c2eb625fb69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^1.1|^2|^3", + "symfony/password-hasher": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1.6|^2|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/http-foundation": "<5.3", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.0|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/ldap": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", + "symfony/validator": "^5.2|^6.0" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b", + "reference": "6728ed79d7f9aae3b86fca7ea554f1c46bae1e0b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/security-core": "^4.4|^5.0|^6.0" + }, + "conflict": { + "symfony/http-foundation": "<5.3" + }, + "require-dev": { + "symfony/http-foundation": "^5.3|^6.0" + }, + "suggest": { + "symfony/http-foundation": "For using the class SessionTokenStorage." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/security-guard", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-guard.git", + "reference": "b6fb8c88f7cd544db761de2d1c3618cbc5c1b9e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/b6fb8c88f7cd544db761de2d1c3618cbc5c1b9e7", + "reference": "b6fb8c88f7cd544db761de2d1c3618cbc5c1b9e7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.15", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Guard\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Guard", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-guard/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/security-http", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "87ee1ea2b86740fc6a0104f165bebbe0b08b66ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/87ee1ea2b86740fc6a0104f165bebbe0b08b66ba", + "reference": "87ee1ea2b86740fc6a0104f165bebbe0b08b66ba", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/security-core": "^5.4.19|~6.0.19|~6.1.11|^6.2.5", + "symfony/service-contracts": "^1.10|^2|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<4.3", + "symfony/security-bundle": "<5.3", + "symfony/security-csrf": "<4.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-23T16:13:23+00:00" + }, + { + "name": "symfony/serializer", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "05137a513f4c5a5e56ffbcf53847a93284b49f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/05137a513f4c5a5e56ffbcf53847a93284b49f67", + "reference": "05137a513f4c5a5e56ffbcf53847a93284b49f67", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", + "symfony/uid": "<5.3", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/property-access": "^5.4.26|^6.3", + "symfony/property-info": "^5.4.24|^6.2.11", + "symfony/uid": "^5.3|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-22T18:40:43+00:00" + }, + { + "name": "symfony/serializer-pack", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer-pack.git", + "reference": "2844d81a5fc86b617b82f44a8bfcaaba1d583eee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer-pack/zipball/2844d81a5fc86b617b82f44a8bfcaaba1d583eee", + "reference": "2844d81a5fc86b617b82f44a8bfcaaba1d583eee", + "shasum": "" + }, + "require": { + "phpdocumentor/reflection-docblock": "*", + "phpstan/phpdoc-parser": "*", + "symfony/property-access": "*", + "symfony/property-info": "*", + "symfony/serializer": "*" + }, + "conflict": { + "symfony/property-info": "<5.4", + "symfony/serializer": "<5.4" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Symfony serializer", + "support": { + "issues": "https://github.com/symfony/serializer-pack/issues", + "source": "https://github.com/symfony/serializer-pack/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-03T13:55:25+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "887762aa99ff16f65dc8b48aafead415f942d407" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/887762aa99ff16f65dc8b48aafead415f942d407", + "reference": "887762aa99ff16f65dc8b48aafead415f942d407", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "4e232c83622bd8cd32b794216aa29d0d266d353b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/4e232c83622bd8cd32b794216aa29d0d266d353b", + "reference": "4e232c83622bd8cd32b794216aa29d0d266d353b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-01T08:49:30+00:00" + }, + { + "name": "symfony/swiftmailer-bundle", + "version": "v3.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/swiftmailer-bundle.git", + "reference": "9daab339f226ac958192bf89836cb3378cc0e652" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/9daab339f226ac958192bf89836cb3378cc0e652", + "reference": "9daab339f226ac958192bf89836cb3378cc0e652", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "swiftmailer/swiftmailer": "^6.1.3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "conflict": { + "twig/twig": "<1.41|>=2.0,<2.10" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SwiftmailerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony SwiftmailerBundle", + "homepage": "http://symfony.com", + "support": { + "issues": "https://github.com/symfony/swiftmailer-bundle/issues", + "source": "https://github.com/symfony/swiftmailer-bundle/tree/v3.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2022-02-06T08:03:40+00:00" + }, + { + "name": "symfony/templating", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/templating.git", + "reference": "3af084088a5dffacaa979a634a8aa4553b2013fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/templating/zipball/3af084088a5dffacaa979a634a8aa4553b2013fe", + "reference": "3af084088a5dffacaa979a634a8aa4553b2013fe", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8" + }, + "require-dev": { + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log-implementation": "For using debug logging in loaders" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Templating\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides all the tools needed to build any kind of template system", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/templating/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "77d7d1e46f52827585e65e6cd6f52a2542e59c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/77d7d1e46f52827585e65e6cd6f52a2542e59c72", + "reference": "77d7d1e46f52827585e65e6cd6f52a2542e59c72", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/console": "<5.3", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T16:58:25+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "14a73aa32c9769b823f7a6f6c018d7c576e49fe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/14a73aa32c9769b823f7a6f6c018d7c576e49fe7", + "reference": "14a73aa32c9769b823f7a6f6c018d7c576e49fe7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<5.3", + "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/http-foundation": "<5.3", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "egulias/email-validator": "^2.1.10|^3|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/console": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/form": "^5.4.21|^6.2.7", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/security-http": "^4.4|^5.0|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.2|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/workflow": "^5.2|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" + }, + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-15T11:19:14+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "37a338733c456fc8cd056c2e0f20bae020cbec70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/37a338733c456fc8cd056c2e0f20bae020cbec70", + "reference": "37a338733c456fc8cd056c2e0f20bae020cbec70", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/twig-bridge": "^5.3|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/dependency-injection": "<5.3", + "symfony/framework-bundle": "<5.0", + "symfony/service-contracts": ">=3.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "doctrine/cache": "^1.0|^2.0", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.0|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-15T11:19:14+00:00" + }, + { + "name": "symfony/validator", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "e80028e0f7814a8824fc1f474f1566a7bddceec5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/e80028e0f7814a8824fc1f474f1566a7bddceec5", + "reference": "e80028e0f7814a8824fc1f474f1566a7bddceec5", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/translation-contracts": "^1.1|^2|^3" + }, + "conflict": { + "doctrine/annotations": "<1.13", + "doctrine/cache": "<1.11", + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<4.4", + "symfony/expression-language": "<5.1", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/property-info": "<5.3", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.13|^2", + "doctrine/cache": "^1.11|^2.0", + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^5.1|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/property-info": "^5.3|^6.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the mapping cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-21T11:39:05+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "2e9c2b11267119d9c90d6b3fdce5e4e9f15e2e90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2e9c2b11267119d9c90d6b3fdce5e4e9f15e2e90", + "reference": "2e9c2b11267119d9c90d6b3fdce5e4e9f15e2e90", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.36" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-15T11:19:14+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-26T08:37:45+00:00" + }, + { + "name": "symfony/web-link", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-link.git", + "reference": "5eb4930dd8bdf233d32e4e3c2dfa8241051b6320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-link/zipball/5eb4930dd8bdf233d32e4e3c2dfa8241051b6320", + "reference": "5eb4930dd8bdf233d32e4e3c2dfa8241051b6320", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/link": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/http-kernel": "<5.3" + }, + "provide": { + "psr/link-implementation": "1.0" + }, + "require-dev": { + "symfony/http-kernel": "^5.3|^6.0" + }, + "suggest": { + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\WebLink\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages links between resources", + "homepage": "https://symfony.com", + "keywords": [ + "dns-prefetch", + "http", + "http2", + "link", + "performance", + "prefetch", + "preload", + "prerender", + "psr13", + "push" + ], + "support": { + "source": "https://github.com/symfony/web-link/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/webpack-encore-bundle", + "version": "v1.17.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/webpack-encore-bundle.git", + "reference": "471ebbc03072dad6e31840dc317bc634a32785f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/471ebbc03072dad6e31840dc317bc634a32785f5", + "reference": "471ebbc03072dad6e31840dc317bc634a32785f5", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/asset": "^4.4 || ^5.0 || ^6.0", + "symfony/config": "^4.4 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.25.0", + "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.3 || ^6.0", + "symfony/twig-bundle": "^4.4 || ^5.0 || ^6.0", + "symfony/web-link": "^4.4 || ^5.0 || ^6.0" + }, + "type": "symfony-bundle", + "extra": { + "thanks": { + "name": "symfony/webpack-encore", + "url": "https://github.com/symfony/webpack-encore" + } + }, + "autoload": { + "psr-4": { + "Symfony\\WebpackEncoreBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Integration with your Symfony app & Webpack Encore!", + "support": { + "issues": "https://github.com/symfony/webpack-encore-bundle/issues", + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.17.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-26T14:36:28+00:00" + }, + { + "name": "symfony/workflow", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/workflow.git", + "reference": "ff424ed4736ebc305784386208b5e91085b4500e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/workflow/zipball/ff424ed4736ebc305784386208b5e91085b4500e", + "reference": "ff424ed4736ebc305784386208b5e91085b4500e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Workflow\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools for managing a workflow or finite state machine", + "homepage": "https://symfony.com", + "keywords": [ + "petrinet", + "place", + "state", + "statemachine", + "transition", + "workflow" + ], + "support": { + "source": "https://github.com/symfony/workflow/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "toflar/psr6-symfony-http-cache-store", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Toflar/psr6-symfony-http-cache-store.git", + "reference": "0a6dd0da8dcce37efd3f3ac12e6f435dcd8fe244" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Toflar/psr6-symfony-http-cache-store/zipball/0a6dd0da8dcce37efd3f3ac12e6f435dcd8fe244", + "reference": "0a6dd0da8dcce37efd3f3ac12e6f435dcd8fe244", + "shasum": "" + }, + "require": { + "php": "^7.2 | ^8.0", + "symfony/cache": "^4.4 | ^5.0", + "symfony/http-foundation": "^4.4 | ^5.0", + "symfony/http-kernel": "^4.4 | ^5.0", + "symfony/lock": "^4.4 | ^5.0", + "symfony/options-resolver": "^4.4 | ^5.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Toflar\\Psr6HttpCacheStore\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yanick Witschi", + "email": "yanick.witschi@terminal42.ch" + } + ], + "description": "An alternative store implementation for Symfony's HttpCache reverse proxy that supports auto-pruning of expired entries and cache invalidation by tags.", + "support": { + "issues": "https://github.com/Toflar/psr6-symfony-http-cache-store/issues", + "source": "https://github.com/Toflar/psr6-symfony-http-cache-store/tree/3.0.1" + }, + "time": "2020-11-23T21:38:47+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "32807183753de0388c8e59f7ac2d13bb47311140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/32807183753de0388c8e59f7ac2d13bb47311140", + "reference": "32807183753de0388c8e59f7ac2d13bb47311140", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "twig/twig": "^3.0" + }, + "require-dev": { + "league/commonmark": "^1.0|^2.0", + "symfony/phpunit-bridge": "^6.4|^7.0", + "twig/cache-extra": "^3.0", + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0", + "twig/string-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T14:02:01+00:00" + }, + { + "name": "twig/intl-extra", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/intl-extra.git", + "reference": "7b3db67c700735f473a265a97e1adaeba3e6ca0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/7b3db67c700735f473a265a97e1adaeba3e6ca0c", + "reference": "7b3db67c700735f473a265a97e1adaeba3e6ca0c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/intl": "^5.4|^6.0|^7.0", + "twig/twig": "^3.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\Extra\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Intl", + "homepage": "https://twig.symfony.com", + "keywords": [ + "intl", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/intl-extra/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T17:27:48+00:00" + }, + { + "name": "twig/string-extra", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/string-extra.git", + "reference": "b0c9037d96baff79abe368dc092a59b726517548" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/b0c9037d96baff79abe368dc092a59b726517548", + "reference": "b0c9037d96baff79abe368dc092a59b726517548", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^3.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\Extra\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Symfony String", + "homepage": "https://twig.symfony.com", + "keywords": [ + "html", + "string", + "twig", + "unicode" + ], + "support": { + "source": "https://github.com/twigphp/string-extra/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T14:02:01+00:00" + }, + { + "name": "twig/twig", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.22" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-11-21T18:54:41+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webonyx/graphql-php", + "version": "v14.11.10", + "source": { + "type": "git", + "url": "https://github.com/webonyx/graphql-php.git", + "reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/d9c2fdebc6aa01d831bc2969da00e8588cffef19", + "reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "amphp/amp": "^2.3", + "doctrine/coding-standard": "^6.0", + "nyholm/psr7": "^1.2", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "0.12.82", + "phpstan/phpstan-phpunit": "0.12.18", + "phpstan/phpstan-strict-rules": "0.12.9", + "phpunit/phpunit": "^7.2 || ^8.5", + "psr/http-message": "^1.0", + "react/promise": "2.*", + "simpod/php-coveralls-mirror": "^3.0" + }, + "suggest": { + "psr/http-message": "To use standard GraphQL server", + "react/promise": "To leverage async resolving on React PHP platform" + }, + "type": "library", + "autoload": { + "psr-4": { + "GraphQL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP port of GraphQL reference implementation", + "homepage": "https://github.com/webonyx/graphql-php", + "keywords": [ + "api", + "graphql" + ], + "support": { + "issues": "https://github.com/webonyx/graphql-php/issues", + "source": "https://github.com/webonyx/graphql-php/tree/v14.11.10" + }, + "funding": [ + { + "url": "https://opencollective.com/webonyx-graphql-php", + "type": "open_collective" + } + ], + "time": "2023-07-05T14:23:37+00:00" + }, + { + "name": "willdurand/js-translation-bundle", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/willdurand/BazingaJsTranslationBundle.git", + "reference": "6cbaa477f5b76c9208b3c28145777481b734ccf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/willdurand/BazingaJsTranslationBundle/zipball/6cbaa477f5b76c9208b3c28145777481b734ccf6", + "reference": "6cbaa477f5b76c9208b3c28145777481b734ccf6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/console": "~4.4|~5.0", + "symfony/finder": "~4.4|~5.0", + "symfony/framework-bundle": "~4.4|~5.0", + "symfony/intl": "~4.4|~5.0", + "symfony/translation": "~4.4|~5.0", + "symfony/twig-bundle": "~4.4|~5.0" + }, + "replace": { + "willdurand/expose-translation-bundle": "2.5.*" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|~5.7|~6.5|~8", + "symfony/asset": "~4.4|~5.0", + "symfony/browser-kit": "~4.4|~5.0", + "symfony/filesystem": "~4.4|~5.0", + "symfony/phpunit-bridge": "^5.0", + "symfony/twig-bundle": "~4.4|~5.0", + "symfony/yaml": "~4.4|~5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Bazinga\\Bundle\\JsTranslationBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "will+git@drnd.me" + } + ], + "description": "A pretty nice way to expose your translation messages to your JavaScript.", + "keywords": [ + "javascript", + "symfony", + "translation" + ], + "support": { + "issues": "https://github.com/willdurand/BazingaJsTranslationBundle/issues", + "source": "https://github.com/willdurand/BazingaJsTranslationBundle/tree/4.0.2" + }, + "time": "2021-08-04T14:51:10+00:00" + }, + { + "name": "willdurand/jsonp-callback-validator", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/willdurand/JsonpCallbackValidator.git", + "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909", + "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonpCallbackValidator": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "william.durand1@gmail.com", + "homepage": "http://www.willdurand.fr" + } + ], + "description": "JSONP callback validator.", + "support": { + "issues": "https://github.com/willdurand/JsonpCallbackValidator/issues", + "source": "https://github.com/willdurand/JsonpCallbackValidator/tree/master" + }, + "time": "2014-01-20T22:35:06+00:00" + }, + { + "name": "zetacomponents/base", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Base.git", + "reference": "b6ae5f6177f6e51c5fc3514800e1c3fb076ec4be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Base/zipball/b6ae5f6177f6e51c5fc3514800e1c3fb076ec4be", + "reference": "b6ae5f6177f6e51c5fc3514800e1c3fb076ec4be", + "shasum": "" + }, + "require-dev": { + "phpunit/php-invoker": "^2.0|^3.1", + "phpunit/phpunit": "~9.0", + "zetacomponents/coding-standard": "dev-main", + "zetacomponents/unit-test": "~1.2.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.", + "homepage": "https://github.com/zetacomponents", + "support": { + "issues": "https://github.com/zetacomponents/Base/issues", + "source": "https://github.com/zetacomponents/Base/tree/1.9.4" + }, + "time": "2022-11-30T16:16:25+00:00" + }, + { + "name": "zetacomponents/feed", + "version": "1.4.4", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Feed.git", + "reference": "cc489ab7b3226f6d979983b6bffd963cf86ee9d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Feed/zipball/cc489ab7b3226f6d979983b6bffd963cf86ee9d2", + "reference": "cc489ab7b3226f6d979983b6bffd963cf86ee9d2", + "shasum": "" + }, + "require": { + "zetacomponents/base": "~1.8" + }, + "require-dev": { + "phpunit/phpunit": "~9.0", + "zetacomponents/unit-test": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "This component handles parsing and creating RSS1, RSS2 and ATOM feeds, with support for different feed modules (dc, content, creativeCommons, geo, iTunes).", + "homepage": "https://github.com/zetacomponents", + "support": { + "issues": "https://github.com/zetacomponents/Feed/issues", + "source": "https://github.com/zetacomponents/Feed/tree/1.4.4" + }, + "time": "2024-01-04T09:47:12+00:00" + }, + { + "name": "zetacomponents/system-information", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/SystemInformation.git", + "reference": "ede40804f9ab549465e2e429836614bd79a313fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/SystemInformation/zipball/ede40804f9ab549465e2e429836614bd79a313fd", + "reference": "ede40804f9ab549465e2e429836614bd79a313fd", + "shasum": "" + }, + "require": { + "zetacomponents/base": "~1.8" + }, + "require-dev": { + "phpunit/phpunit": "~9.0", + "zetacomponents/unit-test": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "Provides access to common system variables, such as CPU type and speed, and the available amount of memory.", + "homepage": "https://github.com/zetacomponents", + "support": { + "issues": "https://github.com/zetacomponents/SystemInformation/issues", + "source": "https://github.com/zetacomponents/SystemInformation/tree/1.1.2" + }, + "time": "2023-08-18T12:36:18+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.4", + "ext-ctype": "*", + "ext-iconv": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 000000000..6c469b3e0 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,80 @@ + ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Bazinga\Bundle\JsTranslationBundle\BazingaJsTranslationBundle::class => ['all' => true], + FOS\JsRoutingBundle\FOSJsRoutingBundle::class => ['all' => true], + FOS\HttpCacheBundle\FOSHttpCacheBundle::class => ['all' => true], + JMS\TranslationBundle\JMSTranslationBundle::class => ['all' => true], + Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true], + Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], + Oneup\FlysystemBundle\OneupFlysystemBundle::class => ['all' => true], + Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], + Ibexa\Bundle\Core\IbexaCoreBundle::class => ['all' => true], + Ibexa\Bundle\LegacySearchEngine\IbexaLegacySearchEngineBundle::class => ['all' => true], + Ibexa\Bundle\IO\IbexaIOBundle::class => ['all' => true], + Ibexa\Bundle\Debug\IbexaDebugBundle::class => ['dev' => true, 'test' => true, 'behat' => true], + Ibexa\Bundle\HttpCache\IbexaHttpCacheBundle::class => ['all' => true], + Ibexa\Bundle\Rest\IbexaRestBundle::class => ['all' => true], + Ibexa\Bundle\Solr\IbexaSolrBundle::class => ['all' => true], + Ibexa\Bundle\SystemInfo\IbexaSystemInfoBundle::class => ['all' => true], + Ibexa\Bundle\Cron\IbexaCronBundle::class => ['all' => true], + Ibexa\Bundle\RepositoryInstaller\IbexaRepositoryInstallerBundle::class => ['all' => true], + Ibexa\Bundle\DoctrineSchema\DoctrineSchemaBundle::class => ['all' => true], + Ibexa\Bundle\ContentForms\IbexaContentFormsBundle::class => ['all' => true], + Ibexa\Bundle\DesignEngine\IbexaDesignEngineBundle::class => ['all' => true], + Ibexa\Bundle\StandardDesign\IbexaStandardDesignBundle::class => ['all' => true], + Ibexa\Bundle\FieldTypeRichText\IbexaFieldTypeRichTextBundle::class => ['all' => true], + Ibexa\Bundle\AdminUi\IbexaAdminUiBundle::class => ['all' => true], + Ibexa\Bundle\User\IbexaUserBundle::class => ['all' => true], + Ibexa\Bundle\AdminUiAssets\IbexaAdminUiAssetsBundle::class => ['all' => true], + Ibexa\Bundle\FieldTypeMatrix\IbexaFieldTypeMatrixBundle::class => ['all' => true], + Ibexa\Bundle\GraphQL\IbexaGraphQLBundle::class => ['all' => true], + Ibexa\Bundle\FieldTypeQuery\IbexaFieldTypeQueryBundle::class => ['all' => true], + Ibexa\Bundle\Search\IbexaSearchBundle::class => ['all' => true], + Overblog\GraphQLBundle\OverblogGraphQLBundle::class => ['all' => true], + Overblog\GraphiQLBundle\OverblogGraphiQLBundle::class => ['dev' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], + BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true], + Hautelook\TemplatedUriBundle\HautelookTemplatedUriBundle::class => ['all' => true], + Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], + Ibexa\Bundle\Fastly\IbexaFastlyBundle::class => ['all' => true], + Ibexa\Bundle\Scheduler\IbexaSchedulerBundle::class => ['all' => true], + Ibexa\Bundle\Workflow\IbexaWorkflowBundle::class => ['all' => true], + Ibexa\Bundle\Calendar\IbexaCalendarBundle::class => ['all' => true], + Ibexa\Bundle\VersionComparison\IbexaVersionComparisonBundle::class => ['all' => true], + Ibexa\Bundle\Installer\IbexaInstallerBundle::class => ['all' => true], + Ibexa\Bundle\Icons\IbexaIconsBundle::class => ['all' => true], + Ibexa\Bundle\Elasticsearch\IbexaElasticsearchBundle::class => ['all' => true], + Ibexa\Bundle\Connector\Dam\IbexaConnectorDamBundle::class => ['all' => true], + Ibexa\Bundle\Personalization\IbexaPersonalizationBundle::class => ['all' => true], + Ibexa\Bundle\Seo\IbexaSeoBundle::class => ['all' => true], + Ibexa\Bundle\Measurement\IbexaMeasurementBundle::class => ['all' => true], + Ibexa\Bundle\Migration\IbexaMigrationBundle::class => ['all' => true], + Ibexa\Bundle\ImageEditor\IbexaImageEditorBundle::class => ['all' => true], + Ibexa\Bundle\OAuth2Client\IbexaOAuth2ClientBundle::class => ['all' => true], + Ibexa\Bundle\ProductCatalog\IbexaProductCatalogBundle::class => ['all' => true], + Ibexa\Bundle\Taxonomy\IbexaTaxonomyBundle::class => ['all' => true], + Ibexa\Bundle\TreeBuilder\IbexaTreeBuilderBundle::class => ['all' => true], + Ibexa\Bundle\ContentTree\IbexaContentTreeBundle::class => ['all' => true], + Ibexa\Bundle\PageBuilder\IbexaPageBuilderBundle::class => ['all' => true], + Ibexa\Bundle\FieldTypePage\IbexaFieldTypePageBundle::class => ['all' => true], + Ibexa\Bundle\FormBuilder\IbexaFormBuilderBundle::class => ['all' => true], + Ibexa\Bundle\SiteFactory\IbexaSiteFactoryBundle::class => ['all' => true], + Ibexa\Bundle\Permissions\IbexaPermissionsBundle::class => ['all' => true], + Ibexa\Bundle\Segmentation\IbexaSegmentationBundle::class => ['all' => true], + Ibexa\Bundle\FieldTypeAddress\IbexaFieldTypeAddressBundle::class => ['all' => true], + Ibexa\Bundle\CorporateAccount\IbexaCorporateAccountBundle::class => ['all' => true], + Ibexa\Bundle\Connect\IbexaConnectBundle::class => ['all' => true], + Gregwar\CaptchaBundle\GregwarCaptchaBundle::class => ['all' => true], + Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true], + KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true], +]; diff --git a/config/graphql/types/.gitignore b/config/graphql/types/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml new file mode 100644 index 000000000..6899b7200 --- /dev/null +++ b/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Unique name of your app: used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The "app" cache stores to the filesystem by default. + # The data in this cache should persist between deploys. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: null diff --git a/config/packages/cache_pool/cache.memcached.yaml b/config/packages/cache_pool/cache.memcached.yaml new file mode 100644 index 000000000..9817dfae1 --- /dev/null +++ b/config/packages/cache_pool/cache.memcached.yaml @@ -0,0 +1,25 @@ +# Reusable service for memcache cache for use in generic.php and plaformsh.php on demand +# +# For further reading on setup with Ibexa and Memcached: +# https://doc.ibexa.co/en/latest/guide/persistence_cache/#memcached +parameters: + cache_namespace: '%env(CACHE_NAMESPACE)%' + cache_dsn: '%env(CACHE_DSN)%' + +services: + cache.memcached: + public: true + parent: cache.adapter.memcached + tags: + - name: cache.pool + clearer: cache.app_clearer + # Example from vendor/symfony/symfony/src/Symfony/Component/Cache/Traits/MemcachedTrait.php: + # memcached://user:pass@localhost?weight=33' + provider: 'memcached://%cache_dsn%' + # Cache namespace prefix overriding the one used by Symfony globally + # This makes sure cache is reliably shared across whole cluster and all Symfony env's + # Can be used for blue/green deployment strategies when changes affect content cache. + # For multi db setup adapt this to be unique per pool (one pool per database) + # If you prefer default behaviour set this to null or comment out, and consider for instance: + # https://symfony.com/doc/current/reference/configuration/framework.html#prefix-seed + namespace: '%cache_namespace%' diff --git a/config/packages/cache_pool/cache.redis.yaml b/config/packages/cache_pool/cache.redis.yaml new file mode 100644 index 000000000..458a7b965 --- /dev/null +++ b/config/packages/cache_pool/cache.redis.yaml @@ -0,0 +1,32 @@ +# Optimized Redis cache adapter (from: https://github.com/ezsystems/symfony-tools) +# +# On platform.sh this is setup automatically in env/plaformsh.php. +# For any other kind of use it can be enabled with CACHE_POOL, detected by env/generic.php. +# +# For further reading on setup with Ibexa and Redis: +# https://doc.ibexa.co/en/latest/guide/persistence_cache/#redis +parameters: + cache_namespace: '%env(CACHE_NAMESPACE)%' + cache_dsn: '%env(CACHE_DSN)%' + +services: + cache.redis: + public: true + class: Symfony\Component\Cache\Adapter\RedisTagAwareAdapter + parent: cache.adapter.redis + tags: + - name: cache.pool + clearer: cache.app_clearer + # Examples from vendor/symfony/symfony/src/Symfony/Component/Cache/Traits/RedisTrait.php: + # redis://localhost:6379 + # redis://secret@example.com:1234/13 + # redis://secret@/var/run/redis.sock/13?persistent_id=4&class=Redis&timeout=3&retry_interval=3 + # Example using Predis: redis://%cache_dsn%?class=\Predis\Client + provider: 'redis://%cache_dsn%' + # Cache namespace prefix overriding the one used by Symfony by default + # This makes sure cache is reliably shared across whole cluster and all Symfony env's + # Can be used for blue/green deployment strategies when changes affect content cache. + # For multi db setup adapt this to be unique per pool (one pool per database) + # If you prefer default behaviour set this to null or comment out, and consider for instance: + # https://symfony.com/doc/current/reference/configuration/framework.html#prefix-seed + namespace: '%cache_namespace%' diff --git a/config/packages/cache_pool/cache.tagaware.filesystem.yaml b/config/packages/cache_pool/cache.tagaware.filesystem.yaml new file mode 100644 index 000000000..e4258d61a --- /dev/null +++ b/config/packages/cache_pool/cache.tagaware.filesystem.yaml @@ -0,0 +1,21 @@ +# Optimized File cache adapter (from: https://github.com/ezsystems/symfony-tools) +# +# Loaded by default, for use on single server setups. +parameters: + cache_namespace: '%env(CACHE_NAMESPACE)%' + +services: + cache.tagaware.filesystem: + public: true + class: Symfony\Component\Cache\Adapter\FilesystemTagAwareAdapter + parent: cache.adapter.filesystem + tags: + - name: cache.pool + clearer: cache.app_clearer + # Cache namespace prefix overriding the one used by Symfony by default + # This makes sure cache is reliably shared across whole cluster and all Symfony env's + # Can be used for blue/green deployment strategies when changes affect content cache. + # For multi db setup adapt this to be unique per pool (one pool per database) + # If you prefer default behaviour set this to null or comment out, and consider for instance: + # https://symfony.com/doc/current/reference/configuration/framework.html#prefix-seed + namespace: '%cache_namespace%' diff --git a/config/packages/dev/swiftmailer.yaml b/config/packages/dev/swiftmailer.yaml new file mode 100644 index 000000000..9bf58d62a --- /dev/null +++ b/config/packages/dev/swiftmailer.yaml @@ -0,0 +1,4 @@ +# See https://symfony.com/doc/current/email/dev_environment.html +#swiftmailer: +# send all emails to a specific address +# delivery_addresses: ['me@example.com'] diff --git a/config/packages/dfs/dfs.yaml b/config/packages/dfs/dfs.yaml new file mode 100644 index 000000000..6a5fe8673 --- /dev/null +++ b/config/packages/dfs/dfs.yaml @@ -0,0 +1,48 @@ +parameters: + env(DFS_DATABASE_URL): '%env(resolve:DATABASE_URL)%' + dfs_database_url: '%env(resolve:DFS_DATABASE_URL)%' + ibexa.io.nfs.adapter.config: + root: '%dfs_nfs_path%' + path: '$var_dir$/$storage_dir$/' + writeFlags: ~ + linkHandling: ~ + permissions: [ ] + +# new doctrine connection for the dfs legacy_dfs_cluster metadata handler. +doctrine: + dbal: + connections: + dfs: + # configure these for your database server + driver: '%dfs_database_driver%' + charset: '%dfs_database_charset%' + default_table_options: + charset: '%dfs_database_charset%' + collate: '%dfs_database_collation%' + url: '%dfs_database_url%' + +# define the flysystem handler +oneup_flysystem: + adapters: + nfs_adapter: + custom: + service: ibexa.io.nfs.adapter.site_access_aware + +# define ibexa handlers +ibexa_io: + binarydata_handlers: + nfs: + flysystem: + adapter: nfs_adapter + metadata_handlers: + dfs: + legacy_dfs_cluster: + connection: doctrine.dbal.dfs_connection + +# set the application handlers +ibexa: + system: + default: + io: + metadata_handler: dfs + binarydata_handler: nfs diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 index 000000000..e517e07f8 --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,44 @@ +doctrine: + dbal: + url: '%env(resolve:DATABASE_URL)%' + + # IMPORTANT: You MUST configure your server version, + # either here or in the DATABASE_URL env var (see .env file) + #server_version: '16' + use_savepoints: true + orm: + auto_generate_proxy_classes: true + naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + auto_mapping: true + mappings: + App: + is_bundle: false + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App + +when@test: + doctrine: + dbal: + # "TEST_TOKEN" is typically set by ParaTest + dbname_suffix: '_test%env(default::TEST_TOKEN)%' + +when@prod: + doctrine: + orm: + auto_generate_proxy_classes: false + proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies' + query_cache_driver: + type: pool + pool: doctrine.system_cache_pool + result_cache_driver: + type: pool + pool: doctrine.result_cache_pool + + framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml new file mode 100644 index 000000000..29231d94b --- /dev/null +++ b/config/packages/doctrine_migrations.yaml @@ -0,0 +1,6 @@ +doctrine_migrations: + migrations_paths: + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + 'DoctrineMigrations': '%kernel.project_dir%/migrations' + enable_profiler: false diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 index 000000000..7853e9ed5 --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,24 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html +framework: + secret: '%env(APP_SECRET)%' + #csrf_protection: true + http_method_override: false + + # Enables session support. Note that the session will ONLY be started if you read or write from it. + # Remove or comment this section to explicitly disable session support. + session: + handler_id: null + cookie_secure: auto + cookie_samesite: lax + storage_factory_id: session.storage.factory.native + + #esi: true + #fragments: true + php_errors: + log: true + +when@test: + framework: + test: true + session: + storage_factory_id: session.storage.factory.mock_file diff --git a/config/packages/graphql.yaml b/config/packages/graphql.yaml new file mode 100644 index 000000000..5dd260b68 --- /dev/null +++ b/config/packages/graphql.yaml @@ -0,0 +1,8 @@ +overblog_graphql: + definitions: + mappings: + auto_discover: false + types: + - type: yaml + dir: "%kernel.project_dir%/config/graphql/types" + suffix: ~ diff --git a/config/packages/http.yaml b/config/packages/http.yaml new file mode 100644 index 000000000..91ca01ec2 --- /dev/null +++ b/config/packages/http.yaml @@ -0,0 +1,2 @@ +framework: + trusted_proxies: '%env(TRUSTED_PROXIES)%' diff --git a/config/packages/http_discovery.yaml b/config/packages/http_discovery.yaml new file mode 100644 index 000000000..2a789e73c --- /dev/null +++ b/config/packages/http_discovery.yaml @@ -0,0 +1,10 @@ +services: + Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory' + + http_discovery.psr17_factory: + class: Http\Discovery\Psr17Factory diff --git a/config/packages/ibexa.yaml b/config/packages/ibexa.yaml new file mode 100644 index 000000000..1b2fe984c --- /dev/null +++ b/config/packages/ibexa.yaml @@ -0,0 +1,145 @@ +parameters: + locale_fallback: en + + # Identifier used to generate the CSRF token. Commenting this line will result in authentication + # issues both in AdminUI and REST calls + ibexa.rest.csrf_token_intention: authenticate + + # You can uncomment following parameters to override the setting. + # Their values correspond to the defaults being used. + + # One of `legacy` (default) or `solr` + #search_engine: '%env(SEARCH_ENGINE)%' + + # Session save path as used by symfony session handlers (eg. used for dsn with redis) + #ibexa.session.save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%' + + # Trusted custom header name to be mapped to X_FORWARDED_FOR + #ibexa.trusted_header_client_ip_name: 'X-Custom-Client-Ip-Header' + # + ## Keep in mind you need will to configure the kernel.trusted_proxies option with + ## an IP address of your reverse proxy server to allow use of trusted headers + ## + ## framework: + ## trusted_proxies: ['127.0.0.1'] + ## + ## More information: https://symfony.com/doc/current/deployment/proxies.html + + # Predefined pools are located in config/packages/cache_pool/ + # You can add your own cache pool to the folder mentioned above. + # In order to change the default cache_pool use environmental variable export. + # The line below must not be altered as required cache service files are resolved based on environmental config. + #cache_pool: '%env(CACHE_POOL)%' + + # By default cache ttl is set to 24h, when using Varnish you can set a much higher value. High values depends on + # using IbexaHttpCacheBundle (default as of v1.12) which by design expires affected cache on changes + #httpcache_default_ttl: '%env(HTTPCACHE_DEFAULT_TTL)%' + + # Settings for HttpCache + #purge_server: '%env(HTTPCACHE_PURGE_SERVER)%' + + # Varnish invalidation/purge token (for use on platform.sh, eZ Platform Cloud and other places you can't use IP for ACL) + #varnish_invalidate_token: '%env(resolve:default::HTTPCACHE_VARNISH_INVALIDATE_TOKEN)%' + + # Compile time handlers + ## These are defined at compile time, and hence can't be set at runtime using env() + ## config/env/generic.php takes care about letting you set them by env variables + + ## Session handler, by default set to file based (instead of ~) in order to be able to use %ezplatform.session.save_path% + # env: SESSION_HANDLER_ID + #ibexa.session.handler_id: session.handler.native_file + + ## Purge type used by HttpCache system ("local", "varnish"/"http", and on ee also "fastly") + #purge_type: '%env(HTTPCACHE_PURGE_TYPE)%' + + env(HTTPCACHE_PURGE_TYPE): local # default value to maintain BC + +ibexa: + # HttpCache settings, By default 'local' (Symfony HttpCache Proxy), by setting it to 'varnish' you can point it to Varnish + http_cache: + purge_type: '%purge_type%' + + # Repositories configuration, setup default repository to support solr if enabled + repositories: + default: + storage: ~ + search: + engine: '%search_engine%' + connection: default + product_catalog: + engine: default + + # Siteaccess configuration, with one siteaccess per default + siteaccess: + list: + - site + - corporate + groups: + site_group: [site] + corporate_group: [corporate] + default_siteaccess: site + match: + URIElement: 1 + # Uncomment if you've enabled SiteFactory + # '@Ibexa\SiteFactory\SiteAccessMatcher': ~ + + # System settings, read in following order: `default`, , , and `global` + # TIP: For multisite installations organize shared config into SiteAccess groups, + # on single-site you can place shared config under "default" for simplicity as shown below. + system: + default: + # Cache pool service, needs to be different per repository (database) on multi repository install. + cache_service_name: '%cache_pool%' + # These reflect the current installers, complete installation before you change them. For changing var_dir + # it is recommended to install clean, then change setting before you start adding binary content, otherwise you'll + # need to manually modify your database data to reflect this to avoid exceptions. + var_dir: var/site + content: + # As we by default enable IbexaHttpCacheBundle which is designed to expire all affected cache + # on changes, and as error / redirects now have separate ttl, we easier allow ttl to be greatly increased + default_ttl: '%httpcache_default_ttl%' + # HttpCache purge server(s) setting, eg Varnish, for when ezpublish.http_cache.purge_type is set to 'varnish'. + http_cache: + purge_servers: ['%purge_server%'] + varnish_invalidate_token: '%varnish_invalidate_token%' + + # Indicates which handler is used to generate image variations, like `alias` for built-in + # or `fastly` for Fastly Image Optimizer or else if you use custom one. + variation_handler_identifier: '%env(string:IBEXA_VARIATION_HANDLER_IDENTIFIER)%' + + assets: + icon_sets: + public_icons: /bundles/ibexaadminui/img/ibexa-icons.svg + streamlineicons: /bundles/ibexaicons/img/all-icons.svg + default_icon_set: streamlineicons + + page_layout: "@ibexadesign/pagelayout.html.twig" + user_content_type_identifier: ['user'] + site: + languages: [eng-GB] + + corporate_group: + languages: [eng-GB] + + url_alias: + slug_converter: + transformation: 'urlalias_lowercase' + +framework: + translator: { fallback: '%locale_fallback%' } + validation: { enable_annotations: true } + default_locale: '%locale_fallback%' + esi: true + fragments: true + http_method_override: true + + rate_limiter: + corporate_account_application: + policy: 'fixed_window' + limit: 1 + interval: '5 minutes' + lock_factory: 'lock.corporate_account_application.factory' + + lock: + default: '%env(LOCK_DSN)%' + corporate_account_application: '%env(IBEXA_LOCK_DSN)%' diff --git a/config/packages/ibexa_admin_ui.yaml b/config/packages/ibexa_admin_ui.yaml new file mode 100644 index 000000000..70bf1cef3 --- /dev/null +++ b/config/packages/ibexa_admin_ui.yaml @@ -0,0 +1,75 @@ +parameters: + # Admin siteaccess group name + admin_group_name: admin_group + +ibexa: + siteaccess: + list: [admin] + groups: + # WARNING: Do not remove or rename this group. + # It's used to distinguish common siteaccesses from admin ones. + # In case of multisite with multiple admin panels, remember to add any additional admin siteaccess to this group. + admin_group: [admin] + + system: + admin_group: + # System languages. Note that by default, content, content types, and other data are in eng-GB locale, + # so removing eng-GB from this list may lead to errors or content not being shown, unless you change + # all eng-GB data to other locales first. + # For admin this needs to contain all languages you want to translate content to on the given repository. + languages: [eng-GB] + content_tree_module: + contextual_tree_root_location_ids: + - 2 # Home (Content structure) + - 5 # Users + - 43 # Media + - 48 # Setup + - 55 # Forms + - 56 # Site skeletons + - 60 # Components + subtree_paths: + content: /1/2/ + media: /1/43/ + page_builder: + siteaccess_list: [site] + assets: + icon_sets: + streamlineicons: /bundles/ibexaicons/img/all-icons.svg + default_icon_set: streamlineicons + content_type: + about: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#about' + article: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#article' + blog: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#blog' + blog_post: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#blog_post' + folder: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#folder' + form: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#form' + place: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#place' + product: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#product' + field: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#field' + user: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#user' + user_group: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#user_group' + file: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#file' + gallery: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#gallery' + image: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#image' + video: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#video' + landing_page: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#landing_page' + default-config: + thumbnail: '/bundles/ibexaicons/img/all-icons.svg#file' + user_content_type_identifier: ['user'] + default_page: 'dashboard' diff --git a/config/packages/ibexa_assets.yaml b/config/packages/ibexa_assets.yaml new file mode 100644 index 000000000..2f2aa4688 --- /dev/null +++ b/config/packages/ibexa_assets.yaml @@ -0,0 +1,10 @@ +webpack_encore: + builds: + ibexa: "%kernel.project_dir%/public/assets/ibexa/build" + richtext: "%kernel.project_dir%/public/assets/richtext/build" + +framework: + assets: + packages: + ibexa: + json_manifest_path: '%kernel.project_dir%/public/assets/ibexa/build/manifest.json' diff --git a/config/packages/ibexa_doctrine_schema.yaml b/config/packages/ibexa_doctrine_schema.yaml new file mode 100644 index 000000000..a6c729dfc --- /dev/null +++ b/config/packages/ibexa_doctrine_schema.yaml @@ -0,0 +1,11 @@ +parameters: + database_charset: '%env(DATABASE_CHARSET)%' + # collation currently has effect on MySQL only + database_collation: '%env(DATABASE_COLLATION)%' + +# If you are not using MySQL, you can comment-out this section +ibexa_doctrine_schema: + tables: + options: + charset: '%database_charset%' + collate: '%database_collation%' diff --git a/config/packages/ibexa_elasticsearch.yaml b/config/packages/ibexa_elasticsearch.yaml new file mode 100644 index 000000000..6bce8c190 --- /dev/null +++ b/config/packages/ibexa_elasticsearch.yaml @@ -0,0 +1,9 @@ +# Base configuration for Elasticsearch +parameters: + elasticsearch_dsn: "%env(ELASTICSEARCH_DSN)%" + +ibexa_elasticsearch: + connections: + default: + hosts: + - "%elasticsearch_dsn%" diff --git a/config/packages/ibexa_fastly.yaml b/config/packages/ibexa_fastly.yaml new file mode 100644 index 000000000..f6126d017 --- /dev/null +++ b/config/packages/ibexa_fastly.yaml @@ -0,0 +1,14 @@ +parameters: + env(FASTLY_SERVICE_ID): ~ + env(FASTLY_KEY): ~ + fastly_service_id: '%env(FASTLY_SERVICE_ID)%' + fastly_key: '%env(FASTLY_KEY)%' + +ibexa: + system: + default: + http_cache: + # If using fastly, 'purge_server' must be set to 'https://api.fastly.com' + fastly: + service_id: '%fastly_service_id%' + key: '%fastly_key%' diff --git a/config/packages/ibexa_form_builder.yaml b/config/packages/ibexa_form_builder.yaml new file mode 100644 index 000000000..3db0c5897 --- /dev/null +++ b/config/packages/ibexa_form_builder.yaml @@ -0,0 +1,8 @@ +jms_translation: + configs: + form_builder: + dirs: + - '%kernel.project_dir%/vendor/ibexa/form-builder/src' + output_dir: '%kernel.project_dir%/vendor/ibexa/form-builder/src/bundle/Resources/translations/' + excluded_dirs: [Behat, Tests] + output_format: "xliff" diff --git a/config/packages/ibexa_http_cache.yaml b/config/packages/ibexa_http_cache.yaml new file mode 100644 index 000000000..9346097f7 --- /dev/null +++ b/config/packages/ibexa_http_cache.yaml @@ -0,0 +1,22 @@ +## FOSHttpCache Configuration +fos_http_cache: + cache_control: + rules: + # Make sure already cacheable (fresh) responses from Ibexa which are errors/redirect gets lower ttl (then default_ttl) + - match: + match_response: "response.isFresh() && ( response.isServerError() || response.isClientError() || response.isRedirect() )" + headers: + overwrite: true + cache_control: + max_age: 5 + s_maxage: 20 + # Example of performance tuning, force TTL on 404 pages to avoid crawlers / ... taking to much load + # Should not be set to high, as cached 404's can cause issues for future routes, url aliases, wildcards, .. + - match: + match_response: "!response.isFresh() && response.isNotFound()" + headers: + overwrite: true + cache_control: + public: true + max_age: 0 + s_maxage: 20 diff --git a/config/packages/ibexa_jms_translation.yaml b/config/packages/ibexa_jms_translation.yaml new file mode 100644 index 000000000..0b6cee505 --- /dev/null +++ b/config/packages/ibexa_jms_translation.yaml @@ -0,0 +1,6 @@ +jms_translation: + source_language: en + locales: [en] + dumper: + add_references: false + add_date: false diff --git a/config/packages/ibexa_page_builder.yaml b/config/packages/ibexa_page_builder.yaml new file mode 100644 index 000000000..fdcd18a11 --- /dev/null +++ b/config/packages/ibexa_page_builder.yaml @@ -0,0 +1,11 @@ +parameters: + ibexa.page_builder.token_authenticator.enabled: true + +jms_translation: + configs: + page_builder: + dirs: + - '%kernel.project_dir%/vendor/ibexa/page-builder/src' + output_dir: '%kernel.project_dir%/vendor/ibexa/page-builder/src/bundle/Resources/translations/' + excluded_dirs: [Behat, Tests] + output_format: "xlf" diff --git a/config/packages/ibexa_product_catalog.yaml b/config/packages/ibexa_product_catalog.yaml new file mode 100644 index 000000000..4576b20d6 --- /dev/null +++ b/config/packages/ibexa_product_catalog.yaml @@ -0,0 +1,7 @@ +ibexa_product_catalog: + engines: + default: + type: local + options: + root_location_remote_id: ibexa_product_catalog_root + product_type_group_identifier: 'product' diff --git a/config/packages/ibexa_site_factory.yaml b/config/packages/ibexa_site_factory.yaml new file mode 100644 index 000000000..6881c7647 --- /dev/null +++ b/config/packages/ibexa_site_factory.yaml @@ -0,0 +1,38 @@ +parameters: + # Adds a fallback DATABASE_URL if the env var is not set. + # This allows you to run cache:warmup even if your + # environment variables are not available yet. + # You should not need to change this value. + env(DATABASE_URL): '' + env(DATABASE_DRIVER): '' + database_driver: '%env(DATABASE_DRIVER)%' + +ibexa_site_factory: + enabled: false +# templates: +# site_template: +# siteaccess_group: site_factory_group +# name: Example Site +# thumbnail: /bundles/ibexasitefactory/img/template-placeholder.png + +doctrine: + dbal: + connections: + # This connection is dedicated for SiteFactory to avoid known issues, should be the same as default + site_factory: + # configure these for your database server + driver: '%database_driver%' + charset: '%database_charset%' + default_table_options: + charset: '%database_charset%' + collate: '%database_collation%' + url: '%env(resolve:DATABASE_URL)%' + +framework: + cache: + pools: + # This pool should be used only by SiteFactory bundle + site_factory_pool: + # You can configure it according to your needs + adapter: cache.app + tags: true diff --git a/config/packages/ibexa_solr.yaml b/config/packages/ibexa_solr.yaml new file mode 100644 index 000000000..69bc286c5 --- /dev/null +++ b/config/packages/ibexa_solr.yaml @@ -0,0 +1,18 @@ +# Base configuration for Solr, for more options see: https://doc.ezplatform.com/en/latest/guide/search/#solr-bundle +# Can have several connections used by each Ibexa Repositories in ibexa.yaml +parameters: + # Solr root endpoint, relevant if `solr` is set as search_engine + solr_dsn: '%env(SOLR_DSN)%' + solr_core: '%env(SOLR_CORE)%' + +ibexa_solr: + endpoints: + endpoint0: + dsn: '%solr_dsn%' + core: '%solr_core%' + connections: + default: + entry_endpoints: + - endpoint0 + mapping: + default: endpoint0 diff --git a/config/packages/ibexa_taxonomy.yaml b/config/packages/ibexa_taxonomy.yaml new file mode 100644 index 000000000..248485056 --- /dev/null +++ b/config/packages/ibexa_taxonomy.yaml @@ -0,0 +1,9 @@ +ibexa_taxonomy: + taxonomies: + tags: + parent_location_remote_id: taxonomy_tags_folder + content_type: tag + field_mappings: + identifier: identifier + parent: parent + name: name diff --git a/config/packages/ibexa_welcome_page.yaml b/config/packages/ibexa_welcome_page.yaml new file mode 100644 index 000000000..bee1ae83a --- /dev/null +++ b/config/packages/ibexa_welcome_page.yaml @@ -0,0 +1,12 @@ +# You can safely delete this file to disable welcome page +ibexa: + system: + site: + content_view: + full: + welcome_page: + template: "@ibexadesign/full/welcome_page.html.twig" + match: + Id\Location: 2 + params: + project_dir: '%kernel.project_dir%' diff --git a/config/packages/knpu_oauth2_client.yaml b/config/packages/knpu_oauth2_client.yaml new file mode 100644 index 000000000..05e853399 --- /dev/null +++ b/config/packages/knpu_oauth2_client.yaml @@ -0,0 +1,3 @@ +knpu_oauth2_client: + clients: + # configure your clients as described here: https://github.com/knpuniversity/oauth2-client-bundle#configuration diff --git a/config/packages/lexik_jwt_authentication.yaml b/config/packages/lexik_jwt_authentication.yaml new file mode 100644 index 000000000..42ddd3cea --- /dev/null +++ b/config/packages/lexik_jwt_authentication.yaml @@ -0,0 +1,12 @@ +lexik_jwt_authentication: + secret_key: '%env(APP_SECRET)%' + encoder: + signature_algorithm: HS256 + # Disabled by default, because Page builder use an custom extractor + token_extractors: + authorization_header: + enabled: false + cookie: + enabled: false + query_parameter: + enabled: false diff --git a/config/packages/liip_imagine.yaml b/config/packages/liip_imagine.yaml new file mode 100644 index 000000000..4061f1dfe --- /dev/null +++ b/config/packages/liip_imagine.yaml @@ -0,0 +1,4 @@ +# Documentation on how to configure the bundle can be found at: https://symfony.com/doc/current/bundles/LiipImagineBundle/basic-usage.html +liip_imagine: + # valid drivers options include "gd" or "gmagick" or "imagick" + driver: "gd" diff --git a/config/packages/lock.yaml b/config/packages/lock.yaml new file mode 100644 index 000000000..574879f83 --- /dev/null +++ b/config/packages/lock.yaml @@ -0,0 +1,2 @@ +framework: + lock: '%env(LOCK_DSN)%' diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml new file mode 100644 index 000000000..9db7d8a7f --- /dev/null +++ b/config/packages/monolog.yaml @@ -0,0 +1,62 @@ +monolog: + channels: + - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists + +when@dev: + monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + channels: ["!event"] + # uncomment to get logging in your browser + # you may have to allow bigger header sizes in your Web server configuration + #firephp: + # type: firephp + # level: info + #chromephp: + # type: chromephp + # level: info + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] + +when@test: + monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + +when@prod: + monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + buffer_size: 50 # How many messages should be saved? Prevent memory leaks + nested: + type: stream + path: php://stderr + level: debug + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] + deprecation: + type: stream + channels: [deprecation] + path: php://stderr + formatter: monolog.formatter.json diff --git a/config/packages/nelmio_cors.yaml b/config/packages/nelmio_cors.yaml new file mode 100644 index 000000000..c7665081f --- /dev/null +++ b/config/packages/nelmio_cors.yaml @@ -0,0 +1,10 @@ +nelmio_cors: + defaults: + origin_regex: true + allow_origin: ['%env(CORS_ALLOW_ORIGIN)%'] + allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'] + allow_headers: ['Content-Type', 'Authorization'] + expose_headers: ['Link'] + max_age: 3600 + paths: + '^/': null diff --git a/config/packages/oneup_flysystem.yaml b/config/packages/oneup_flysystem.yaml new file mode 100644 index 000000000..c448b0316 --- /dev/null +++ b/config/packages/oneup_flysystem.yaml @@ -0,0 +1,10 @@ +# Read the documentation: https://github.com/1up-lab/OneupFlysystemBundle +oneup_flysystem: + adapters: + default_adapter: + local: + location: '%kernel.cache_dir%/flysystem' + filesystems: + default_filesystem: + adapter: default_adapter + alias: League\Flysystem\Filesystem diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 000000000..4b766ce57 --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,12 @@ +framework: + router: + utf8: true + + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + #default_uri: http://localhost + +when@prod: + framework: + router: + strict_requirements: null diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 index 000000000..2303d9bb4 --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,133 @@ +#security: +# # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers +# providers: +# in_memory: { memory: ~ } +# firewalls: +# dev: +# pattern: ^/(_(profiler|wdt)|css|images|js)/ +# security: false +# main: +# anonymous: true +# +# # activate different ways to authenticate +# +# # http_basic: true +# # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate +# +# # form_login: true +# # https://symfony.com/doc/current/security/form_login_setup.html +# +# # Easy way to control access for large sections of your site +# # Note: Only the *first* access control that matches will be used +# access_control: +# # - { path: ^/admin, roles: ROLE_ADMIN } +# # - { path: ^/profile, roles: ROLE_USER } +# + +# To get started with security, check out the documentation: +# https://symfony.com/doc/current/security.html +security: + # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded + providers: + ibexa: + id: ibexa.security.user_provider + #! in_memory: + #! memory: ~ + + firewalls: + # disables authentication for assets and the profiler, adapt it according to your needs + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + ibexa_forgot_password: + pattern: /user/(forgot-password|reset-password) + security: false + + ibexa_register_from_invitation: + pattern: /user/from-invite/register|/from-invite/register + security: false + + ibexa_corporate_dev: + pattern: ^/corporate/(css|images|js)/ + security: false + + ibexa_corporate_customer_portal_register: + pattern: ^/corporate/customer-portal/register + security: false + + ibexa_corporate_fieldtype_address: + pattern: ^/corporate/address/form/ + security: false + + # Uncomment `ibexa_cdp` rule if you are using Ibexa CDP connector + #ibexa_cdp: + # pattern: /cdp/webhook + # guard: + # authenticator: 'Ibexa\Cdp\Security\CdpRequestAuthenticator' + # stateless: true + + # Uncomment the rules below to enable JSON Web Token (JWT) authentication for REST and/or GraphQL + #ibexa_jwt_rest: + # request_matcher: Ibexa\Contracts\Rest\Security\AuthorizationHeaderRESTRequestMatcher + # user_checker: Ibexa\Core\MVC\Symfony\Security\UserChecker + # anonymous: ~ + # guard: + # authenticators: + # - lexik_jwt_authentication.jwt_token_authenticator + # entry_point: lexik_jwt_authentication.jwt_token_authenticator + # stateless: true + + #ibexa_jwt_graphql: + # request_matcher: Ibexa\GraphQL\Security\NonAdminGraphQLRequestMatcher + # user_checker: Ibexa\Core\MVC\Symfony\Security\UserChecker + # anonymous: ~ + # guard: + # authenticators: + # - lexik_jwt_authentication.jwt_token_authenticator + # entry_point: lexik_jwt_authentication.jwt_token_authenticator + # stateless: true + + # Uncomment ibexa_oauth2_connect, ibexa_oauth2_front rules and comment ibexa_front firewall + # to enable OAuth2 authentication + + #ibexa_oauth2_connect: + # pattern: /oauth2/connect/* + # security: false + + #ibexa_oauth2_front: + # pattern: ^/ + # user_checker: Ibexa\Core\MVC\Symfony\Security\UserChecker + # anonymous: ~ + # ibexa_rest_session: ~ + # guard: + # authenticators: + # - Ibexa\Bundle\OAuth2Client\Security\Authenticator\OAuth2Authenticator + # - Ibexa\PageBuilder\Security\EditorialMode\TokenAuthenticator + # entry_point: Ibexa\Bundle\OAuth2Client\Security\Authenticator\OAuth2Authenticator + # form_login: + # require_previous_session: false + # csrf_token_generator: security.csrf.token_manager + # logout: ~ + + ibexa_front: + pattern: ^/ + user_checker: Ibexa\Core\MVC\Symfony\Security\UserChecker + anonymous: ~ + ibexa_rest_session: ~ + form_login: + require_previous_session: false + csrf_token_generator: security.csrf.token_manager + guard: + authenticator: 'Ibexa\PageBuilder\Security\EditorialMode\TokenAuthenticator' + logout: ~ + + main: + anonymous: ~ + # activate different ways to authenticate + + # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate + #http_basic: ~ + + # https://symfony.com/doc/current/security/form_login_setup.html + #form_login: ~ diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml new file mode 100644 index 000000000..1821ccc07 --- /dev/null +++ b/config/packages/sensio_framework_extra.yaml @@ -0,0 +1,3 @@ +sensio_framework_extra: + router: + annotations: false diff --git a/config/packages/stof_doctrine_extensions.yaml b/config/packages/stof_doctrine_extensions.yaml new file mode 100644 index 000000000..b258add36 --- /dev/null +++ b/config/packages/stof_doctrine_extensions.yaml @@ -0,0 +1,4 @@ +# Read the documentation: https://symfony.com/doc/current/bundles/StofDoctrineExtensionsBundle/index.html +# See the official DoctrineExtensions documentation for more details: https://github.com/doctrine-extensions/DoctrineExtensions/tree/main/doc +stof_doctrine_extensions: + default_locale: en_US diff --git a/config/packages/swiftmailer.yaml b/config/packages/swiftmailer.yaml new file mode 100644 index 000000000..cae65084a --- /dev/null +++ b/config/packages/swiftmailer.yaml @@ -0,0 +1,3 @@ +swiftmailer: + url: '%env(MAILER_URL)%' + spool: { type: 'memory' } diff --git a/config/packages/test/swiftmailer.yaml b/config/packages/test/swiftmailer.yaml new file mode 100644 index 000000000..f43807805 --- /dev/null +++ b/config/packages/test/swiftmailer.yaml @@ -0,0 +1,2 @@ +swiftmailer: + disable_delivery: true diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml new file mode 100644 index 000000000..b3f8f9cfe --- /dev/null +++ b/config/packages/translation.yaml @@ -0,0 +1,7 @@ +framework: + default_locale: en + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - en + providers: diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 000000000..f9f4cc539 --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,6 @@ +twig: + default_path: '%kernel.project_dir%/templates' + +when@test: + twig: + strict_variables: true diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml new file mode 100644 index 000000000..0201281d3 --- /dev/null +++ b/config/packages/validator.yaml @@ -0,0 +1,13 @@ +framework: + validation: + email_validation_mode: html5 + + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + #auto_mapping: + # App\Entity\: [] + +when@test: + framework: + validation: + not_compromised_password: false diff --git a/config/packages/webpack_encore.yaml b/config/packages/webpack_encore.yaml new file mode 100644 index 000000000..4c009ee49 --- /dev/null +++ b/config/packages/webpack_encore.yaml @@ -0,0 +1,45 @@ +webpack_encore: + # The path where Encore is building the assets - i.e. Encore.setOutputPath() + output_path: '%kernel.project_dir%/public/build' + # If multiple builds are defined (as shown below), you can disable the default build: + # output_path: false + + # Set attributes that will be rendered on all script and link tags + script_attributes: + defer: true + # Uncomment (also under link_attributes) if using Turbo Drive + # https://turbo.hotwired.dev/handbook/drive#reloading-when-assets-change + # 'data-turbo-track': reload + # link_attributes: + # Uncomment if using Turbo Drive + # 'data-turbo-track': reload + + # If using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials') + # crossorigin: 'anonymous' + + # Preload all rendered script and link tags automatically via the HTTP/2 Link header + # preload: true + + # Throw an exception if the entrypoints.json file is missing or an entry is missing from the data + # strict_mode: false + + # If you have multiple builds: + # builds: + # frontend: '%kernel.project_dir%/public/frontend/build' + + # pass the build name as the 3rd argument to the Twig functions + # {{ encore_entry_script_tags('entry1', null, 'frontend') }} + +framework: + assets: + json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' + +#when@prod: +# webpack_encore: +# # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) +# # Available in version 1.2 +# cache: true + +#when@test: +# webpack_encore: +# strict_mode: false diff --git a/config/packages/workflow.yaml b/config/packages/workflow.yaml new file mode 100644 index 000000000..855df59cd --- /dev/null +++ b/config/packages/workflow.yaml @@ -0,0 +1,2 @@ +framework: + workflows: null diff --git a/config/preload.php b/config/preload.php new file mode 100644 index 000000000..5ebcdb215 --- /dev/null +++ b/config/preload.php @@ -0,0 +1,5 @@ + { + Encore.setOutputPath('public/assets/ibexa/build') + .setPublicPath('/assets/ibexa/build') + .addExternals({ + react: 'React', + 'react-dom': 'ReactDOM', + moment: 'moment', + 'popper.js': 'Popper', + alloyeditor: 'AlloyEditor', + 'prop-types': 'PropTypes', + }) + .enableSassLoader() + .enableReactPreset() + .enableSingleRuntimeChunk(); + + configSetups.forEach((configSetupPath) => { + const setupConfig = require(configSetupPath); + + setupConfig(Encore); + }); + + bundles.forEach((configPath) => { + const addEntries = require(configPath); + + addEntries(Encore); + }); + + const ibexaConfig = Encore.getWebpackConfig(); + + ibexaConfig.name = 'ibexa'; + + ibexaConfig.module.rules[4].oneOf[1].use[1].options.url = false; + ibexaConfig.module.rules[1].oneOf[1].use[1].options.url = false; + + configManagers.forEach((configManagerPath) => { + const configManager = require(configManagerPath); + + configManager(ibexaConfig, ibexaConfigManager); + }); + + Encore.reset(); + + return ibexaConfig; +}; diff --git a/ibexa.webpack.config.manager.js b/ibexa.webpack.config.manager.js new file mode 100644 index 000000000..cf8919c7e --- /dev/null +++ b/ibexa.webpack.config.manager.js @@ -0,0 +1,63 @@ +const fs = require('fs'); +/* + We changed all entry names to ibexa-, but for BC change we left possibility to still use ezplatform- + Note that using ezplatform- is deprecate and will be removed in version 5.0 +*/ +const ibexifyEntryName = (entryName) => { + let ibexaEntryName = entryName; + + if (entryName.indexOf('ezplatform-') === 0) { + console.warn('\x1b[43m%s\x1b[0m', 'Using ezplatform- is deprecated and will be removed in 5.0'); + + ibexaEntryName = entryName.replace('ezplatform-', 'ibexa-'); + } else if (entryName.indexOf('ezcommerce-') === 0) { + console.warn('\x1b[43m%s\x1b[0m', 'Using ezcommerce- is deprecated and will be removed in 5.0'); + + ibexaEntryName = entryName.replace('ezcommerce-', 'ibexa-commerce-'); + } + + return ibexaEntryName; +} +const findItems = (ibexaConfig, entryName) => { + const items = ibexaConfig.entry[entryName]; + + if (!items) { + throw new Error(`Couldn't find entry with name: "${entryName}". Please check if there is a typo in the name.`); + } + + return items; +}; +const replace = ({ ibexaConfig, eZConfig, entryName, itemToReplace, newItem }) => { + const config = ibexaConfig ? ibexaConfig : eZConfig; + const ibexaEntryName = ibexifyEntryName(entryName); + const items = findItems(config, ibexaEntryName); + const indexToReplace = items.indexOf(fs.realpathSync(itemToReplace)); + + if (indexToReplace < 0) { + throw new Error(`Couldn't find item "${itemToReplace}" in entry "${ibexaEntryName}". Please check if there is a typo in the name.`); + } + + items[indexToReplace] = newItem; +}; +const remove = ({ ibexaConfig, eZConfig, entryName, itemsToRemove }) => { + const config = ibexaConfig ? ibexaConfig : eZConfig; + const ibexaEntryName = ibexifyEntryName(entryName); + const items = findItems(config, ibexaEntryName); + const realPathItemsToRemove = itemsToRemove.map((item) => fs.realpathSync(item)); + + config.entry[ibexaEntryName] = items.filter((item) => !realPathItemsToRemove.includes(item)); +}; +const add = ({ ibexaConfig, eZConfig, entryName, newItems }) => { + const config = ibexaConfig ? ibexaConfig : eZConfig; + + const ibexaEntryName = ibexifyEntryName(entryName); + const items = findItems(config, ibexaEntryName); + + config.entry[ibexaEntryName] = [...items, ...newItems]; +}; + +module.exports = { + replace, + remove, + add +}; diff --git a/ibexa.webpack.config.react.blocks.js b/ibexa.webpack.config.react.blocks.js new file mode 100644 index 000000000..acc195ad4 --- /dev/null +++ b/ibexa.webpack.config.react.blocks.js @@ -0,0 +1,8 @@ +const fs = require('fs'); +const isReactBlockPathCreated = fs.existsSync( + './assets/page-builder/react/blocks' +); + +module.exports = { + isReactBlockPathCreated, +}; diff --git a/ibexa.webpack.custom.configs.js b/ibexa.webpack.custom.configs.js new file mode 100644 index 000000000..e8f46aaac --- /dev/null +++ b/ibexa.webpack.custom.configs.js @@ -0,0 +1,11 @@ +const customConfigs = require('./var/encore/ibexa.webpack.custom.config.js'); + +module.exports = customConfigs.reduce((configs, customConfigPath) => { + let customConfig = require(customConfigPath); + + if (!Array.isArray(customConfig)) { + customConfig = [customConfig]; + } + + return [ ...configs, ...customConfig ]; +}, []); diff --git a/migrations/.gitignore b/migrations/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/package.json b/package.json new file mode 100644 index 000000000..c818c7eb9 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "devDependencies": { + "@hotwired/stimulus": "^3.0.0", + "@symfony/stimulus-bridge": "^3.0.0", + "@symfony/webpack-encore": "^3.0.0", + "@babel/preset-react": "^7.0.0", + "core-js": "^3.0.0", + "regenerator-runtime": "^0.13.2", + "webpack-notifier": "^1.6.0", + "react-collapsible": "^2.5.0", + "sass": "^1.49.7", + "sass-loader": "^13.0.0", + "@babel/runtime": "^7.13.10", + "postcss-loader": "^4.3.0", + "raw-loader": "^4.0.1", + "style-loader": "^2.0.0", + "file-loader": "^6.0.0", + "@ckeditor/ckeditor5-alignment": "^36.0.1", + "@ckeditor/ckeditor5-build-inline": "^36.0.1", + "@ckeditor/ckeditor5-dev-utils": "^32.0.0", + "@ckeditor/ckeditor5-widget": "^36.0.1", + "@ckeditor/ckeditor5-theme-lark": "^36.0.1", + "@ckeditor/ckeditor5-code-block": "^36.0.1" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "license": "UNLICENSED", + "private": true, + "scripts": { + "dev-server": "encore dev-server", + "dev": "encore dev", + "watch": "encore dev --watch", + "build": "encore production --progress" + } +} diff --git a/public/build/app.css b/public/build/app.css new file mode 100644 index 000000000..526fe266a --- /dev/null +++ b/public/build/app.css @@ -0,0 +1,7 @@ +/*!**************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[1].use[1]!./assets/styles/app.css ***! + \**************************************************************************************************************/ +body { + background-color: lightgray; +} + diff --git a/public/build/app.js b/public/build/app.js new file mode 100644 index 000000000..9b52a827a --- /dev/null +++ b/public/build/app.js @@ -0,0 +1,7182 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([["app"],{ + +/***/ "./assets/controllers sync recursive ./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js! \\.[jt]sx?$": +/*!****************************************************************************************************************!*\ + !*** ./assets/controllers/ sync ./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js! \.[jt]sx?$ ***! + \****************************************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var map = { + "./hello_controller.js": "./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js!./assets/controllers/hello_controller.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "./assets/controllers sync recursive ./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js! \\.[jt]sx?$"; + +/***/ }), + +/***/ "./node_modules/@hotwired/stimulus/dist/stimulus.js": +/*!**********************************************************!*\ + !*** ./node_modules/@hotwired/stimulus/dist/stimulus.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Application: () => (/* binding */ Application), +/* harmony export */ AttributeObserver: () => (/* binding */ AttributeObserver), +/* harmony export */ Context: () => (/* binding */ Context), +/* harmony export */ Controller: () => (/* binding */ Controller), +/* harmony export */ ElementObserver: () => (/* binding */ ElementObserver), +/* harmony export */ IndexedMultimap: () => (/* binding */ IndexedMultimap), +/* harmony export */ Multimap: () => (/* binding */ Multimap), +/* harmony export */ SelectorObserver: () => (/* binding */ SelectorObserver), +/* harmony export */ StringMapObserver: () => (/* binding */ StringMapObserver), +/* harmony export */ TokenListObserver: () => (/* binding */ TokenListObserver), +/* harmony export */ ValueListObserver: () => (/* binding */ ValueListObserver), +/* harmony export */ add: () => (/* binding */ add), +/* harmony export */ defaultSchema: () => (/* binding */ defaultSchema), +/* harmony export */ del: () => (/* binding */ del), +/* harmony export */ fetch: () => (/* binding */ fetch), +/* harmony export */ prune: () => (/* binding */ prune) +/* harmony export */ }); +/* +Stimulus 3.2.1 +Copyright © 2023 Basecamp, LLC + */ +class EventListener { + constructor(eventTarget, eventName, eventOptions) { + this.eventTarget = eventTarget; + this.eventName = eventName; + this.eventOptions = eventOptions; + this.unorderedBindings = new Set(); + } + connect() { + this.eventTarget.addEventListener(this.eventName, this, this.eventOptions); + } + disconnect() { + this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions); + } + bindingConnected(binding) { + this.unorderedBindings.add(binding); + } + bindingDisconnected(binding) { + this.unorderedBindings.delete(binding); + } + handleEvent(event) { + const extendedEvent = extendEvent(event); + for (const binding of this.bindings) { + if (extendedEvent.immediatePropagationStopped) { + break; + } + else { + binding.handleEvent(extendedEvent); + } + } + } + hasBindings() { + return this.unorderedBindings.size > 0; + } + get bindings() { + return Array.from(this.unorderedBindings).sort((left, right) => { + const leftIndex = left.index, rightIndex = right.index; + return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0; + }); + } +} +function extendEvent(event) { + if ("immediatePropagationStopped" in event) { + return event; + } + else { + const { stopImmediatePropagation } = event; + return Object.assign(event, { + immediatePropagationStopped: false, + stopImmediatePropagation() { + this.immediatePropagationStopped = true; + stopImmediatePropagation.call(this); + }, + }); + } +} + +class Dispatcher { + constructor(application) { + this.application = application; + this.eventListenerMaps = new Map(); + this.started = false; + } + start() { + if (!this.started) { + this.started = true; + this.eventListeners.forEach((eventListener) => eventListener.connect()); + } + } + stop() { + if (this.started) { + this.started = false; + this.eventListeners.forEach((eventListener) => eventListener.disconnect()); + } + } + get eventListeners() { + return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []); + } + bindingConnected(binding) { + this.fetchEventListenerForBinding(binding).bindingConnected(binding); + } + bindingDisconnected(binding, clearEventListeners = false) { + this.fetchEventListenerForBinding(binding).bindingDisconnected(binding); + if (clearEventListeners) + this.clearEventListenersForBinding(binding); + } + handleError(error, message, detail = {}) { + this.application.handleError(error, `Error ${message}`, detail); + } + clearEventListenersForBinding(binding) { + const eventListener = this.fetchEventListenerForBinding(binding); + if (!eventListener.hasBindings()) { + eventListener.disconnect(); + this.removeMappedEventListenerFor(binding); + } + } + removeMappedEventListenerFor(binding) { + const { eventTarget, eventName, eventOptions } = binding; + const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget); + const cacheKey = this.cacheKey(eventName, eventOptions); + eventListenerMap.delete(cacheKey); + if (eventListenerMap.size == 0) + this.eventListenerMaps.delete(eventTarget); + } + fetchEventListenerForBinding(binding) { + const { eventTarget, eventName, eventOptions } = binding; + return this.fetchEventListener(eventTarget, eventName, eventOptions); + } + fetchEventListener(eventTarget, eventName, eventOptions) { + const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget); + const cacheKey = this.cacheKey(eventName, eventOptions); + let eventListener = eventListenerMap.get(cacheKey); + if (!eventListener) { + eventListener = this.createEventListener(eventTarget, eventName, eventOptions); + eventListenerMap.set(cacheKey, eventListener); + } + return eventListener; + } + createEventListener(eventTarget, eventName, eventOptions) { + const eventListener = new EventListener(eventTarget, eventName, eventOptions); + if (this.started) { + eventListener.connect(); + } + return eventListener; + } + fetchEventListenerMapForEventTarget(eventTarget) { + let eventListenerMap = this.eventListenerMaps.get(eventTarget); + if (!eventListenerMap) { + eventListenerMap = new Map(); + this.eventListenerMaps.set(eventTarget, eventListenerMap); + } + return eventListenerMap; + } + cacheKey(eventName, eventOptions) { + const parts = [eventName]; + Object.keys(eventOptions) + .sort() + .forEach((key) => { + parts.push(`${eventOptions[key] ? "" : "!"}${key}`); + }); + return parts.join(":"); + } +} + +const defaultActionDescriptorFilters = { + stop({ event, value }) { + if (value) + event.stopPropagation(); + return true; + }, + prevent({ event, value }) { + if (value) + event.preventDefault(); + return true; + }, + self({ event, value, element }) { + if (value) { + return element === event.target; + } + else { + return true; + } + }, +}; +const descriptorPattern = /^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/; +function parseActionDescriptorString(descriptorString) { + const source = descriptorString.trim(); + const matches = source.match(descriptorPattern) || []; + let eventName = matches[2]; + let keyFilter = matches[3]; + if (keyFilter && !["keydown", "keyup", "keypress"].includes(eventName)) { + eventName += `.${keyFilter}`; + keyFilter = ""; + } + return { + eventTarget: parseEventTarget(matches[4]), + eventName, + eventOptions: matches[7] ? parseEventOptions(matches[7]) : {}, + identifier: matches[5], + methodName: matches[6], + keyFilter: matches[1] || keyFilter, + }; +} +function parseEventTarget(eventTargetName) { + if (eventTargetName == "window") { + return window; + } + else if (eventTargetName == "document") { + return document; + } +} +function parseEventOptions(eventOptions) { + return eventOptions + .split(":") + .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, "")]: !/^!/.test(token) }), {}); +} +function stringifyEventTarget(eventTarget) { + if (eventTarget == window) { + return "window"; + } + else if (eventTarget == document) { + return "document"; + } +} + +function camelize(value) { + return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase()); +} +function namespaceCamelize(value) { + return camelize(value.replace(/--/g, "-").replace(/__/g, "_")); +} +function capitalize(value) { + return value.charAt(0).toUpperCase() + value.slice(1); +} +function dasherize(value) { + return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`); +} +function tokenize(value) { + return value.match(/[^\s]+/g) || []; +} + +function isSomething(object) { + return object !== null && object !== undefined; +} +function hasProperty(object, property) { + return Object.prototype.hasOwnProperty.call(object, property); +} + +const allModifiers = ["meta", "ctrl", "alt", "shift"]; +class Action { + constructor(element, index, descriptor, schema) { + this.element = element; + this.index = index; + this.eventTarget = descriptor.eventTarget || element; + this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error("missing event name"); + this.eventOptions = descriptor.eventOptions || {}; + this.identifier = descriptor.identifier || error("missing identifier"); + this.methodName = descriptor.methodName || error("missing method name"); + this.keyFilter = descriptor.keyFilter || ""; + this.schema = schema; + } + static forToken(token, schema) { + return new this(token.element, token.index, parseActionDescriptorString(token.content), schema); + } + toString() { + const eventFilter = this.keyFilter ? `.${this.keyFilter}` : ""; + const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : ""; + return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`; + } + shouldIgnoreKeyboardEvent(event) { + if (!this.keyFilter) { + return false; + } + const filters = this.keyFilter.split("+"); + if (this.keyFilterDissatisfied(event, filters)) { + return true; + } + const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0]; + if (!standardFilter) { + return false; + } + if (!hasProperty(this.keyMappings, standardFilter)) { + error(`contains unknown key filter: ${this.keyFilter}`); + } + return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase(); + } + shouldIgnoreMouseEvent(event) { + if (!this.keyFilter) { + return false; + } + const filters = [this.keyFilter]; + if (this.keyFilterDissatisfied(event, filters)) { + return true; + } + return false; + } + get params() { + const params = {}; + const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, "i"); + for (const { name, value } of Array.from(this.element.attributes)) { + const match = name.match(pattern); + const key = match && match[1]; + if (key) { + params[camelize(key)] = typecast(value); + } + } + return params; + } + get eventTargetName() { + return stringifyEventTarget(this.eventTarget); + } + get keyMappings() { + return this.schema.keyMappings; + } + keyFilterDissatisfied(event, filters) { + const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier)); + return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift; + } +} +const defaultEventNames = { + a: () => "click", + button: () => "click", + form: () => "submit", + details: () => "toggle", + input: (e) => (e.getAttribute("type") == "submit" ? "click" : "input"), + select: () => "change", + textarea: () => "input", +}; +function getDefaultEventNameForElement(element) { + const tagName = element.tagName.toLowerCase(); + if (tagName in defaultEventNames) { + return defaultEventNames[tagName](element); + } +} +function error(message) { + throw new Error(message); +} +function typecast(value) { + try { + return JSON.parse(value); + } + catch (o_O) { + return value; + } +} + +class Binding { + constructor(context, action) { + this.context = context; + this.action = action; + } + get index() { + return this.action.index; + } + get eventTarget() { + return this.action.eventTarget; + } + get eventOptions() { + return this.action.eventOptions; + } + get identifier() { + return this.context.identifier; + } + handleEvent(event) { + const actionEvent = this.prepareActionEvent(event); + if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) { + this.invokeWithEvent(actionEvent); + } + } + get eventName() { + return this.action.eventName; + } + get method() { + const method = this.controller[this.methodName]; + if (typeof method == "function") { + return method; + } + throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`); + } + applyEventModifiers(event) { + const { element } = this.action; + const { actionDescriptorFilters } = this.context.application; + const { controller } = this.context; + let passes = true; + for (const [name, value] of Object.entries(this.eventOptions)) { + if (name in actionDescriptorFilters) { + const filter = actionDescriptorFilters[name]; + passes = passes && filter({ name, value, event, element, controller }); + } + else { + continue; + } + } + return passes; + } + prepareActionEvent(event) { + return Object.assign(event, { params: this.action.params }); + } + invokeWithEvent(event) { + const { target, currentTarget } = event; + try { + this.method.call(this.controller, event); + this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName }); + } + catch (error) { + const { identifier, controller, element, index } = this; + const detail = { identifier, controller, element, index, event }; + this.context.handleError(error, `invoking action "${this.action}"`, detail); + } + } + willBeInvokedByEvent(event) { + const eventTarget = event.target; + if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) { + return false; + } + if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) { + return false; + } + if (this.element === eventTarget) { + return true; + } + else if (eventTarget instanceof Element && this.element.contains(eventTarget)) { + return this.scope.containsElement(eventTarget); + } + else { + return this.scope.containsElement(this.action.element); + } + } + get controller() { + return this.context.controller; + } + get methodName() { + return this.action.methodName; + } + get element() { + return this.scope.element; + } + get scope() { + return this.context.scope; + } +} + +class ElementObserver { + constructor(element, delegate) { + this.mutationObserverInit = { attributes: true, childList: true, subtree: true }; + this.element = element; + this.started = false; + this.delegate = delegate; + this.elements = new Set(); + this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations)); + } + start() { + if (!this.started) { + this.started = true; + this.mutationObserver.observe(this.element, this.mutationObserverInit); + this.refresh(); + } + } + pause(callback) { + if (this.started) { + this.mutationObserver.disconnect(); + this.started = false; + } + callback(); + if (!this.started) { + this.mutationObserver.observe(this.element, this.mutationObserverInit); + this.started = true; + } + } + stop() { + if (this.started) { + this.mutationObserver.takeRecords(); + this.mutationObserver.disconnect(); + this.started = false; + } + } + refresh() { + if (this.started) { + const matches = new Set(this.matchElementsInTree()); + for (const element of Array.from(this.elements)) { + if (!matches.has(element)) { + this.removeElement(element); + } + } + for (const element of Array.from(matches)) { + this.addElement(element); + } + } + } + processMutations(mutations) { + if (this.started) { + for (const mutation of mutations) { + this.processMutation(mutation); + } + } + } + processMutation(mutation) { + if (mutation.type == "attributes") { + this.processAttributeChange(mutation.target, mutation.attributeName); + } + else if (mutation.type == "childList") { + this.processRemovedNodes(mutation.removedNodes); + this.processAddedNodes(mutation.addedNodes); + } + } + processAttributeChange(element, attributeName) { + if (this.elements.has(element)) { + if (this.delegate.elementAttributeChanged && this.matchElement(element)) { + this.delegate.elementAttributeChanged(element, attributeName); + } + else { + this.removeElement(element); + } + } + else if (this.matchElement(element)) { + this.addElement(element); + } + } + processRemovedNodes(nodes) { + for (const node of Array.from(nodes)) { + const element = this.elementFromNode(node); + if (element) { + this.processTree(element, this.removeElement); + } + } + } + processAddedNodes(nodes) { + for (const node of Array.from(nodes)) { + const element = this.elementFromNode(node); + if (element && this.elementIsActive(element)) { + this.processTree(element, this.addElement); + } + } + } + matchElement(element) { + return this.delegate.matchElement(element); + } + matchElementsInTree(tree = this.element) { + return this.delegate.matchElementsInTree(tree); + } + processTree(tree, processor) { + for (const element of this.matchElementsInTree(tree)) { + processor.call(this, element); + } + } + elementFromNode(node) { + if (node.nodeType == Node.ELEMENT_NODE) { + return node; + } + } + elementIsActive(element) { + if (element.isConnected != this.element.isConnected) { + return false; + } + else { + return this.element.contains(element); + } + } + addElement(element) { + if (!this.elements.has(element)) { + if (this.elementIsActive(element)) { + this.elements.add(element); + if (this.delegate.elementMatched) { + this.delegate.elementMatched(element); + } + } + } + } + removeElement(element) { + if (this.elements.has(element)) { + this.elements.delete(element); + if (this.delegate.elementUnmatched) { + this.delegate.elementUnmatched(element); + } + } + } +} + +class AttributeObserver { + constructor(element, attributeName, delegate) { + this.attributeName = attributeName; + this.delegate = delegate; + this.elementObserver = new ElementObserver(element, this); + } + get element() { + return this.elementObserver.element; + } + get selector() { + return `[${this.attributeName}]`; + } + start() { + this.elementObserver.start(); + } + pause(callback) { + this.elementObserver.pause(callback); + } + stop() { + this.elementObserver.stop(); + } + refresh() { + this.elementObserver.refresh(); + } + get started() { + return this.elementObserver.started; + } + matchElement(element) { + return element.hasAttribute(this.attributeName); + } + matchElementsInTree(tree) { + const match = this.matchElement(tree) ? [tree] : []; + const matches = Array.from(tree.querySelectorAll(this.selector)); + return match.concat(matches); + } + elementMatched(element) { + if (this.delegate.elementMatchedAttribute) { + this.delegate.elementMatchedAttribute(element, this.attributeName); + } + } + elementUnmatched(element) { + if (this.delegate.elementUnmatchedAttribute) { + this.delegate.elementUnmatchedAttribute(element, this.attributeName); + } + } + elementAttributeChanged(element, attributeName) { + if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) { + this.delegate.elementAttributeValueChanged(element, attributeName); + } + } +} + +function add(map, key, value) { + fetch(map, key).add(value); +} +function del(map, key, value) { + fetch(map, key).delete(value); + prune(map, key); +} +function fetch(map, key) { + let values = map.get(key); + if (!values) { + values = new Set(); + map.set(key, values); + } + return values; +} +function prune(map, key) { + const values = map.get(key); + if (values != null && values.size == 0) { + map.delete(key); + } +} + +class Multimap { + constructor() { + this.valuesByKey = new Map(); + } + get keys() { + return Array.from(this.valuesByKey.keys()); + } + get values() { + const sets = Array.from(this.valuesByKey.values()); + return sets.reduce((values, set) => values.concat(Array.from(set)), []); + } + get size() { + const sets = Array.from(this.valuesByKey.values()); + return sets.reduce((size, set) => size + set.size, 0); + } + add(key, value) { + add(this.valuesByKey, key, value); + } + delete(key, value) { + del(this.valuesByKey, key, value); + } + has(key, value) { + const values = this.valuesByKey.get(key); + return values != null && values.has(value); + } + hasKey(key) { + return this.valuesByKey.has(key); + } + hasValue(value) { + const sets = Array.from(this.valuesByKey.values()); + return sets.some((set) => set.has(value)); + } + getValuesForKey(key) { + const values = this.valuesByKey.get(key); + return values ? Array.from(values) : []; + } + getKeysForValue(value) { + return Array.from(this.valuesByKey) + .filter(([_key, values]) => values.has(value)) + .map(([key, _values]) => key); + } +} + +class IndexedMultimap extends Multimap { + constructor() { + super(); + this.keysByValue = new Map(); + } + get values() { + return Array.from(this.keysByValue.keys()); + } + add(key, value) { + super.add(key, value); + add(this.keysByValue, value, key); + } + delete(key, value) { + super.delete(key, value); + del(this.keysByValue, value, key); + } + hasValue(value) { + return this.keysByValue.has(value); + } + getKeysForValue(value) { + const set = this.keysByValue.get(value); + return set ? Array.from(set) : []; + } +} + +class SelectorObserver { + constructor(element, selector, delegate, details) { + this._selector = selector; + this.details = details; + this.elementObserver = new ElementObserver(element, this); + this.delegate = delegate; + this.matchesByElement = new Multimap(); + } + get started() { + return this.elementObserver.started; + } + get selector() { + return this._selector; + } + set selector(selector) { + this._selector = selector; + this.refresh(); + } + start() { + this.elementObserver.start(); + } + pause(callback) { + this.elementObserver.pause(callback); + } + stop() { + this.elementObserver.stop(); + } + refresh() { + this.elementObserver.refresh(); + } + get element() { + return this.elementObserver.element; + } + matchElement(element) { + const { selector } = this; + if (selector) { + const matches = element.matches(selector); + if (this.delegate.selectorMatchElement) { + return matches && this.delegate.selectorMatchElement(element, this.details); + } + return matches; + } + else { + return false; + } + } + matchElementsInTree(tree) { + const { selector } = this; + if (selector) { + const match = this.matchElement(tree) ? [tree] : []; + const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match)); + return match.concat(matches); + } + else { + return []; + } + } + elementMatched(element) { + const { selector } = this; + if (selector) { + this.selectorMatched(element, selector); + } + } + elementUnmatched(element) { + const selectors = this.matchesByElement.getKeysForValue(element); + for (const selector of selectors) { + this.selectorUnmatched(element, selector); + } + } + elementAttributeChanged(element, _attributeName) { + const { selector } = this; + if (selector) { + const matches = this.matchElement(element); + const matchedBefore = this.matchesByElement.has(selector, element); + if (matches && !matchedBefore) { + this.selectorMatched(element, selector); + } + else if (!matches && matchedBefore) { + this.selectorUnmatched(element, selector); + } + } + } + selectorMatched(element, selector) { + this.delegate.selectorMatched(element, selector, this.details); + this.matchesByElement.add(selector, element); + } + selectorUnmatched(element, selector) { + this.delegate.selectorUnmatched(element, selector, this.details); + this.matchesByElement.delete(selector, element); + } +} + +class StringMapObserver { + constructor(element, delegate) { + this.element = element; + this.delegate = delegate; + this.started = false; + this.stringMap = new Map(); + this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations)); + } + start() { + if (!this.started) { + this.started = true; + this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true }); + this.refresh(); + } + } + stop() { + if (this.started) { + this.mutationObserver.takeRecords(); + this.mutationObserver.disconnect(); + this.started = false; + } + } + refresh() { + if (this.started) { + for (const attributeName of this.knownAttributeNames) { + this.refreshAttribute(attributeName, null); + } + } + } + processMutations(mutations) { + if (this.started) { + for (const mutation of mutations) { + this.processMutation(mutation); + } + } + } + processMutation(mutation) { + const attributeName = mutation.attributeName; + if (attributeName) { + this.refreshAttribute(attributeName, mutation.oldValue); + } + } + refreshAttribute(attributeName, oldValue) { + const key = this.delegate.getStringMapKeyForAttribute(attributeName); + if (key != null) { + if (!this.stringMap.has(attributeName)) { + this.stringMapKeyAdded(key, attributeName); + } + const value = this.element.getAttribute(attributeName); + if (this.stringMap.get(attributeName) != value) { + this.stringMapValueChanged(value, key, oldValue); + } + if (value == null) { + const oldValue = this.stringMap.get(attributeName); + this.stringMap.delete(attributeName); + if (oldValue) + this.stringMapKeyRemoved(key, attributeName, oldValue); + } + else { + this.stringMap.set(attributeName, value); + } + } + } + stringMapKeyAdded(key, attributeName) { + if (this.delegate.stringMapKeyAdded) { + this.delegate.stringMapKeyAdded(key, attributeName); + } + } + stringMapValueChanged(value, key, oldValue) { + if (this.delegate.stringMapValueChanged) { + this.delegate.stringMapValueChanged(value, key, oldValue); + } + } + stringMapKeyRemoved(key, attributeName, oldValue) { + if (this.delegate.stringMapKeyRemoved) { + this.delegate.stringMapKeyRemoved(key, attributeName, oldValue); + } + } + get knownAttributeNames() { + return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames))); + } + get currentAttributeNames() { + return Array.from(this.element.attributes).map((attribute) => attribute.name); + } + get recordedAttributeNames() { + return Array.from(this.stringMap.keys()); + } +} + +class TokenListObserver { + constructor(element, attributeName, delegate) { + this.attributeObserver = new AttributeObserver(element, attributeName, this); + this.delegate = delegate; + this.tokensByElement = new Multimap(); + } + get started() { + return this.attributeObserver.started; + } + start() { + this.attributeObserver.start(); + } + pause(callback) { + this.attributeObserver.pause(callback); + } + stop() { + this.attributeObserver.stop(); + } + refresh() { + this.attributeObserver.refresh(); + } + get element() { + return this.attributeObserver.element; + } + get attributeName() { + return this.attributeObserver.attributeName; + } + elementMatchedAttribute(element) { + this.tokensMatched(this.readTokensForElement(element)); + } + elementAttributeValueChanged(element) { + const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element); + this.tokensUnmatched(unmatchedTokens); + this.tokensMatched(matchedTokens); + } + elementUnmatchedAttribute(element) { + this.tokensUnmatched(this.tokensByElement.getValuesForKey(element)); + } + tokensMatched(tokens) { + tokens.forEach((token) => this.tokenMatched(token)); + } + tokensUnmatched(tokens) { + tokens.forEach((token) => this.tokenUnmatched(token)); + } + tokenMatched(token) { + this.delegate.tokenMatched(token); + this.tokensByElement.add(token.element, token); + } + tokenUnmatched(token) { + this.delegate.tokenUnmatched(token); + this.tokensByElement.delete(token.element, token); + } + refreshTokensForElement(element) { + const previousTokens = this.tokensByElement.getValuesForKey(element); + const currentTokens = this.readTokensForElement(element); + const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken)); + if (firstDifferingIndex == -1) { + return [[], []]; + } + else { + return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)]; + } + } + readTokensForElement(element) { + const attributeName = this.attributeName; + const tokenString = element.getAttribute(attributeName) || ""; + return parseTokenString(tokenString, element, attributeName); + } +} +function parseTokenString(tokenString, element, attributeName) { + return tokenString + .trim() + .split(/\s+/) + .filter((content) => content.length) + .map((content, index) => ({ element, attributeName, content, index })); +} +function zip(left, right) { + const length = Math.max(left.length, right.length); + return Array.from({ length }, (_, index) => [left[index], right[index]]); +} +function tokensAreEqual(left, right) { + return left && right && left.index == right.index && left.content == right.content; +} + +class ValueListObserver { + constructor(element, attributeName, delegate) { + this.tokenListObserver = new TokenListObserver(element, attributeName, this); + this.delegate = delegate; + this.parseResultsByToken = new WeakMap(); + this.valuesByTokenByElement = new WeakMap(); + } + get started() { + return this.tokenListObserver.started; + } + start() { + this.tokenListObserver.start(); + } + stop() { + this.tokenListObserver.stop(); + } + refresh() { + this.tokenListObserver.refresh(); + } + get element() { + return this.tokenListObserver.element; + } + get attributeName() { + return this.tokenListObserver.attributeName; + } + tokenMatched(token) { + const { element } = token; + const { value } = this.fetchParseResultForToken(token); + if (value) { + this.fetchValuesByTokenForElement(element).set(token, value); + this.delegate.elementMatchedValue(element, value); + } + } + tokenUnmatched(token) { + const { element } = token; + const { value } = this.fetchParseResultForToken(token); + if (value) { + this.fetchValuesByTokenForElement(element).delete(token); + this.delegate.elementUnmatchedValue(element, value); + } + } + fetchParseResultForToken(token) { + let parseResult = this.parseResultsByToken.get(token); + if (!parseResult) { + parseResult = this.parseToken(token); + this.parseResultsByToken.set(token, parseResult); + } + return parseResult; + } + fetchValuesByTokenForElement(element) { + let valuesByToken = this.valuesByTokenByElement.get(element); + if (!valuesByToken) { + valuesByToken = new Map(); + this.valuesByTokenByElement.set(element, valuesByToken); + } + return valuesByToken; + } + parseToken(token) { + try { + const value = this.delegate.parseValueForToken(token); + return { value }; + } + catch (error) { + return { error }; + } + } +} + +class BindingObserver { + constructor(context, delegate) { + this.context = context; + this.delegate = delegate; + this.bindingsByAction = new Map(); + } + start() { + if (!this.valueListObserver) { + this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this); + this.valueListObserver.start(); + } + } + stop() { + if (this.valueListObserver) { + this.valueListObserver.stop(); + delete this.valueListObserver; + this.disconnectAllActions(); + } + } + get element() { + return this.context.element; + } + get identifier() { + return this.context.identifier; + } + get actionAttribute() { + return this.schema.actionAttribute; + } + get schema() { + return this.context.schema; + } + get bindings() { + return Array.from(this.bindingsByAction.values()); + } + connectAction(action) { + const binding = new Binding(this.context, action); + this.bindingsByAction.set(action, binding); + this.delegate.bindingConnected(binding); + } + disconnectAction(action) { + const binding = this.bindingsByAction.get(action); + if (binding) { + this.bindingsByAction.delete(action); + this.delegate.bindingDisconnected(binding); + } + } + disconnectAllActions() { + this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true)); + this.bindingsByAction.clear(); + } + parseValueForToken(token) { + const action = Action.forToken(token, this.schema); + if (action.identifier == this.identifier) { + return action; + } + } + elementMatchedValue(element, action) { + this.connectAction(action); + } + elementUnmatchedValue(element, action) { + this.disconnectAction(action); + } +} + +class ValueObserver { + constructor(context, receiver) { + this.context = context; + this.receiver = receiver; + this.stringMapObserver = new StringMapObserver(this.element, this); + this.valueDescriptorMap = this.controller.valueDescriptorMap; + } + start() { + this.stringMapObserver.start(); + this.invokeChangedCallbacksForDefaultValues(); + } + stop() { + this.stringMapObserver.stop(); + } + get element() { + return this.context.element; + } + get controller() { + return this.context.controller; + } + getStringMapKeyForAttribute(attributeName) { + if (attributeName in this.valueDescriptorMap) { + return this.valueDescriptorMap[attributeName].name; + } + } + stringMapKeyAdded(key, attributeName) { + const descriptor = this.valueDescriptorMap[attributeName]; + if (!this.hasValue(key)) { + this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue)); + } + } + stringMapValueChanged(value, name, oldValue) { + const descriptor = this.valueDescriptorNameMap[name]; + if (value === null) + return; + if (oldValue === null) { + oldValue = descriptor.writer(descriptor.defaultValue); + } + this.invokeChangedCallback(name, value, oldValue); + } + stringMapKeyRemoved(key, attributeName, oldValue) { + const descriptor = this.valueDescriptorNameMap[key]; + if (this.hasValue(key)) { + this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue); + } + else { + this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue); + } + } + invokeChangedCallbacksForDefaultValues() { + for (const { key, name, defaultValue, writer } of this.valueDescriptors) { + if (defaultValue != undefined && !this.controller.data.has(key)) { + this.invokeChangedCallback(name, writer(defaultValue), undefined); + } + } + } + invokeChangedCallback(name, rawValue, rawOldValue) { + const changedMethodName = `${name}Changed`; + const changedMethod = this.receiver[changedMethodName]; + if (typeof changedMethod == "function") { + const descriptor = this.valueDescriptorNameMap[name]; + try { + const value = descriptor.reader(rawValue); + let oldValue = rawOldValue; + if (rawOldValue) { + oldValue = descriptor.reader(rawOldValue); + } + changedMethod.call(this.receiver, value, oldValue); + } + catch (error) { + if (error instanceof TypeError) { + error.message = `Stimulus Value "${this.context.identifier}.${descriptor.name}" - ${error.message}`; + } + throw error; + } + } + } + get valueDescriptors() { + const { valueDescriptorMap } = this; + return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]); + } + get valueDescriptorNameMap() { + const descriptors = {}; + Object.keys(this.valueDescriptorMap).forEach((key) => { + const descriptor = this.valueDescriptorMap[key]; + descriptors[descriptor.name] = descriptor; + }); + return descriptors; + } + hasValue(attributeName) { + const descriptor = this.valueDescriptorNameMap[attributeName]; + const hasMethodName = `has${capitalize(descriptor.name)}`; + return this.receiver[hasMethodName]; + } +} + +class TargetObserver { + constructor(context, delegate) { + this.context = context; + this.delegate = delegate; + this.targetsByName = new Multimap(); + } + start() { + if (!this.tokenListObserver) { + this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this); + this.tokenListObserver.start(); + } + } + stop() { + if (this.tokenListObserver) { + this.disconnectAllTargets(); + this.tokenListObserver.stop(); + delete this.tokenListObserver; + } + } + tokenMatched({ element, content: name }) { + if (this.scope.containsElement(element)) { + this.connectTarget(element, name); + } + } + tokenUnmatched({ element, content: name }) { + this.disconnectTarget(element, name); + } + connectTarget(element, name) { + var _a; + if (!this.targetsByName.has(name, element)) { + this.targetsByName.add(name, element); + (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name)); + } + } + disconnectTarget(element, name) { + var _a; + if (this.targetsByName.has(name, element)) { + this.targetsByName.delete(name, element); + (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name)); + } + } + disconnectAllTargets() { + for (const name of this.targetsByName.keys) { + for (const element of this.targetsByName.getValuesForKey(name)) { + this.disconnectTarget(element, name); + } + } + } + get attributeName() { + return `data-${this.context.identifier}-target`; + } + get element() { + return this.context.element; + } + get scope() { + return this.context.scope; + } +} + +function readInheritableStaticArrayValues(constructor, propertyName) { + const ancestors = getAncestorsForConstructor(constructor); + return Array.from(ancestors.reduce((values, constructor) => { + getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name)); + return values; + }, new Set())); +} +function readInheritableStaticObjectPairs(constructor, propertyName) { + const ancestors = getAncestorsForConstructor(constructor); + return ancestors.reduce((pairs, constructor) => { + pairs.push(...getOwnStaticObjectPairs(constructor, propertyName)); + return pairs; + }, []); +} +function getAncestorsForConstructor(constructor) { + const ancestors = []; + while (constructor) { + ancestors.push(constructor); + constructor = Object.getPrototypeOf(constructor); + } + return ancestors.reverse(); +} +function getOwnStaticArrayValues(constructor, propertyName) { + const definition = constructor[propertyName]; + return Array.isArray(definition) ? definition : []; +} +function getOwnStaticObjectPairs(constructor, propertyName) { + const definition = constructor[propertyName]; + return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : []; +} + +class OutletObserver { + constructor(context, delegate) { + this.started = false; + this.context = context; + this.delegate = delegate; + this.outletsByName = new Multimap(); + this.outletElementsByName = new Multimap(); + this.selectorObserverMap = new Map(); + this.attributeObserverMap = new Map(); + } + start() { + if (!this.started) { + this.outletDefinitions.forEach((outletName) => { + this.setupSelectorObserverForOutlet(outletName); + this.setupAttributeObserverForOutlet(outletName); + }); + this.started = true; + this.dependentContexts.forEach((context) => context.refresh()); + } + } + refresh() { + this.selectorObserverMap.forEach((observer) => observer.refresh()); + this.attributeObserverMap.forEach((observer) => observer.refresh()); + } + stop() { + if (this.started) { + this.started = false; + this.disconnectAllOutlets(); + this.stopSelectorObservers(); + this.stopAttributeObservers(); + } + } + stopSelectorObservers() { + if (this.selectorObserverMap.size > 0) { + this.selectorObserverMap.forEach((observer) => observer.stop()); + this.selectorObserverMap.clear(); + } + } + stopAttributeObservers() { + if (this.attributeObserverMap.size > 0) { + this.attributeObserverMap.forEach((observer) => observer.stop()); + this.attributeObserverMap.clear(); + } + } + selectorMatched(element, _selector, { outletName }) { + const outlet = this.getOutlet(element, outletName); + if (outlet) { + this.connectOutlet(outlet, element, outletName); + } + } + selectorUnmatched(element, _selector, { outletName }) { + const outlet = this.getOutletFromMap(element, outletName); + if (outlet) { + this.disconnectOutlet(outlet, element, outletName); + } + } + selectorMatchElement(element, { outletName }) { + const selector = this.selector(outletName); + const hasOutlet = this.hasOutlet(element, outletName); + const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`); + if (selector) { + return hasOutlet && hasOutletController && element.matches(selector); + } + else { + return false; + } + } + elementMatchedAttribute(_element, attributeName) { + const outletName = this.getOutletNameFromOutletAttributeName(attributeName); + if (outletName) { + this.updateSelectorObserverForOutlet(outletName); + } + } + elementAttributeValueChanged(_element, attributeName) { + const outletName = this.getOutletNameFromOutletAttributeName(attributeName); + if (outletName) { + this.updateSelectorObserverForOutlet(outletName); + } + } + elementUnmatchedAttribute(_element, attributeName) { + const outletName = this.getOutletNameFromOutletAttributeName(attributeName); + if (outletName) { + this.updateSelectorObserverForOutlet(outletName); + } + } + connectOutlet(outlet, element, outletName) { + var _a; + if (!this.outletElementsByName.has(outletName, element)) { + this.outletsByName.add(outletName, outlet); + this.outletElementsByName.add(outletName, element); + (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName)); + } + } + disconnectOutlet(outlet, element, outletName) { + var _a; + if (this.outletElementsByName.has(outletName, element)) { + this.outletsByName.delete(outletName, outlet); + this.outletElementsByName.delete(outletName, element); + (_a = this.selectorObserverMap + .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName)); + } + } + disconnectAllOutlets() { + for (const outletName of this.outletElementsByName.keys) { + for (const element of this.outletElementsByName.getValuesForKey(outletName)) { + for (const outlet of this.outletsByName.getValuesForKey(outletName)) { + this.disconnectOutlet(outlet, element, outletName); + } + } + } + } + updateSelectorObserverForOutlet(outletName) { + const observer = this.selectorObserverMap.get(outletName); + if (observer) { + observer.selector = this.selector(outletName); + } + } + setupSelectorObserverForOutlet(outletName) { + const selector = this.selector(outletName); + const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName }); + this.selectorObserverMap.set(outletName, selectorObserver); + selectorObserver.start(); + } + setupAttributeObserverForOutlet(outletName) { + const attributeName = this.attributeNameForOutletName(outletName); + const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this); + this.attributeObserverMap.set(outletName, attributeObserver); + attributeObserver.start(); + } + selector(outletName) { + return this.scope.outlets.getSelectorForOutletName(outletName); + } + attributeNameForOutletName(outletName) { + return this.scope.schema.outletAttributeForScope(this.identifier, outletName); + } + getOutletNameFromOutletAttributeName(attributeName) { + return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName); + } + get outletDependencies() { + const dependencies = new Multimap(); + this.router.modules.forEach((module) => { + const constructor = module.definition.controllerConstructor; + const outlets = readInheritableStaticArrayValues(constructor, "outlets"); + outlets.forEach((outlet) => dependencies.add(outlet, module.identifier)); + }); + return dependencies; + } + get outletDefinitions() { + return this.outletDependencies.getKeysForValue(this.identifier); + } + get dependentControllerIdentifiers() { + return this.outletDependencies.getValuesForKey(this.identifier); + } + get dependentContexts() { + const identifiers = this.dependentControllerIdentifiers; + return this.router.contexts.filter((context) => identifiers.includes(context.identifier)); + } + hasOutlet(element, outletName) { + return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName); + } + getOutlet(element, outletName) { + return this.application.getControllerForElementAndIdentifier(element, outletName); + } + getOutletFromMap(element, outletName) { + return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element); + } + get scope() { + return this.context.scope; + } + get schema() { + return this.context.schema; + } + get identifier() { + return this.context.identifier; + } + get application() { + return this.context.application; + } + get router() { + return this.application.router; + } +} + +class Context { + constructor(module, scope) { + this.logDebugActivity = (functionName, detail = {}) => { + const { identifier, controller, element } = this; + detail = Object.assign({ identifier, controller, element }, detail); + this.application.logDebugActivity(this.identifier, functionName, detail); + }; + this.module = module; + this.scope = scope; + this.controller = new module.controllerConstructor(this); + this.bindingObserver = new BindingObserver(this, this.dispatcher); + this.valueObserver = new ValueObserver(this, this.controller); + this.targetObserver = new TargetObserver(this, this); + this.outletObserver = new OutletObserver(this, this); + try { + this.controller.initialize(); + this.logDebugActivity("initialize"); + } + catch (error) { + this.handleError(error, "initializing controller"); + } + } + connect() { + this.bindingObserver.start(); + this.valueObserver.start(); + this.targetObserver.start(); + this.outletObserver.start(); + try { + this.controller.connect(); + this.logDebugActivity("connect"); + } + catch (error) { + this.handleError(error, "connecting controller"); + } + } + refresh() { + this.outletObserver.refresh(); + } + disconnect() { + try { + this.controller.disconnect(); + this.logDebugActivity("disconnect"); + } + catch (error) { + this.handleError(error, "disconnecting controller"); + } + this.outletObserver.stop(); + this.targetObserver.stop(); + this.valueObserver.stop(); + this.bindingObserver.stop(); + } + get application() { + return this.module.application; + } + get identifier() { + return this.module.identifier; + } + get schema() { + return this.application.schema; + } + get dispatcher() { + return this.application.dispatcher; + } + get element() { + return this.scope.element; + } + get parentElement() { + return this.element.parentElement; + } + handleError(error, message, detail = {}) { + const { identifier, controller, element } = this; + detail = Object.assign({ identifier, controller, element }, detail); + this.application.handleError(error, `Error ${message}`, detail); + } + targetConnected(element, name) { + this.invokeControllerMethod(`${name}TargetConnected`, element); + } + targetDisconnected(element, name) { + this.invokeControllerMethod(`${name}TargetDisconnected`, element); + } + outletConnected(outlet, element, name) { + this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element); + } + outletDisconnected(outlet, element, name) { + this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element); + } + invokeControllerMethod(methodName, ...args) { + const controller = this.controller; + if (typeof controller[methodName] == "function") { + controller[methodName](...args); + } + } +} + +function bless(constructor) { + return shadow(constructor, getBlessedProperties(constructor)); +} +function shadow(constructor, properties) { + const shadowConstructor = extend(constructor); + const shadowProperties = getShadowProperties(constructor.prototype, properties); + Object.defineProperties(shadowConstructor.prototype, shadowProperties); + return shadowConstructor; +} +function getBlessedProperties(constructor) { + const blessings = readInheritableStaticArrayValues(constructor, "blessings"); + return blessings.reduce((blessedProperties, blessing) => { + const properties = blessing(constructor); + for (const key in properties) { + const descriptor = blessedProperties[key] || {}; + blessedProperties[key] = Object.assign(descriptor, properties[key]); + } + return blessedProperties; + }, {}); +} +function getShadowProperties(prototype, properties) { + return getOwnKeys(properties).reduce((shadowProperties, key) => { + const descriptor = getShadowedDescriptor(prototype, properties, key); + if (descriptor) { + Object.assign(shadowProperties, { [key]: descriptor }); + } + return shadowProperties; + }, {}); +} +function getShadowedDescriptor(prototype, properties, key) { + const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key); + const shadowedByValue = shadowingDescriptor && "value" in shadowingDescriptor; + if (!shadowedByValue) { + const descriptor = Object.getOwnPropertyDescriptor(properties, key).value; + if (shadowingDescriptor) { + descriptor.get = shadowingDescriptor.get || descriptor.get; + descriptor.set = shadowingDescriptor.set || descriptor.set; + } + return descriptor; + } +} +const getOwnKeys = (() => { + if (typeof Object.getOwnPropertySymbols == "function") { + return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)]; + } + else { + return Object.getOwnPropertyNames; + } +})(); +const extend = (() => { + function extendWithReflect(constructor) { + function extended() { + return Reflect.construct(constructor, arguments, new.target); + } + extended.prototype = Object.create(constructor.prototype, { + constructor: { value: extended }, + }); + Reflect.setPrototypeOf(extended, constructor); + return extended; + } + function testReflectExtension() { + const a = function () { + this.a.call(this); + }; + const b = extendWithReflect(a); + b.prototype.a = function () { }; + return new b(); + } + try { + testReflectExtension(); + return extendWithReflect; + } + catch (error) { + return (constructor) => class extended extends constructor { + }; + } +})(); + +function blessDefinition(definition) { + return { + identifier: definition.identifier, + controllerConstructor: bless(definition.controllerConstructor), + }; +} + +class Module { + constructor(application, definition) { + this.application = application; + this.definition = blessDefinition(definition); + this.contextsByScope = new WeakMap(); + this.connectedContexts = new Set(); + } + get identifier() { + return this.definition.identifier; + } + get controllerConstructor() { + return this.definition.controllerConstructor; + } + get contexts() { + return Array.from(this.connectedContexts); + } + connectContextForScope(scope) { + const context = this.fetchContextForScope(scope); + this.connectedContexts.add(context); + context.connect(); + } + disconnectContextForScope(scope) { + const context = this.contextsByScope.get(scope); + if (context) { + this.connectedContexts.delete(context); + context.disconnect(); + } + } + fetchContextForScope(scope) { + let context = this.contextsByScope.get(scope); + if (!context) { + context = new Context(this, scope); + this.contextsByScope.set(scope, context); + } + return context; + } +} + +class ClassMap { + constructor(scope) { + this.scope = scope; + } + has(name) { + return this.data.has(this.getDataKey(name)); + } + get(name) { + return this.getAll(name)[0]; + } + getAll(name) { + const tokenString = this.data.get(this.getDataKey(name)) || ""; + return tokenize(tokenString); + } + getAttributeName(name) { + return this.data.getAttributeNameForKey(this.getDataKey(name)); + } + getDataKey(name) { + return `${name}-class`; + } + get data() { + return this.scope.data; + } +} + +class DataMap { + constructor(scope) { + this.scope = scope; + } + get element() { + return this.scope.element; + } + get identifier() { + return this.scope.identifier; + } + get(key) { + const name = this.getAttributeNameForKey(key); + return this.element.getAttribute(name); + } + set(key, value) { + const name = this.getAttributeNameForKey(key); + this.element.setAttribute(name, value); + return this.get(key); + } + has(key) { + const name = this.getAttributeNameForKey(key); + return this.element.hasAttribute(name); + } + delete(key) { + if (this.has(key)) { + const name = this.getAttributeNameForKey(key); + this.element.removeAttribute(name); + return true; + } + else { + return false; + } + } + getAttributeNameForKey(key) { + return `data-${this.identifier}-${dasherize(key)}`; + } +} + +class Guide { + constructor(logger) { + this.warnedKeysByObject = new WeakMap(); + this.logger = logger; + } + warn(object, key, message) { + let warnedKeys = this.warnedKeysByObject.get(object); + if (!warnedKeys) { + warnedKeys = new Set(); + this.warnedKeysByObject.set(object, warnedKeys); + } + if (!warnedKeys.has(key)) { + warnedKeys.add(key); + this.logger.warn(message, object); + } + } +} + +function attributeValueContainsToken(attributeName, token) { + return `[${attributeName}~="${token}"]`; +} + +class TargetSet { + constructor(scope) { + this.scope = scope; + } + get element() { + return this.scope.element; + } + get identifier() { + return this.scope.identifier; + } + get schema() { + return this.scope.schema; + } + has(targetName) { + return this.find(targetName) != null; + } + find(...targetNames) { + return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined); + } + findAll(...targetNames) { + return targetNames.reduce((targets, targetName) => [ + ...targets, + ...this.findAllTargets(targetName), + ...this.findAllLegacyTargets(targetName), + ], []); + } + findTarget(targetName) { + const selector = this.getSelectorForTargetName(targetName); + return this.scope.findElement(selector); + } + findAllTargets(targetName) { + const selector = this.getSelectorForTargetName(targetName); + return this.scope.findAllElements(selector); + } + getSelectorForTargetName(targetName) { + const attributeName = this.schema.targetAttributeForScope(this.identifier); + return attributeValueContainsToken(attributeName, targetName); + } + findLegacyTarget(targetName) { + const selector = this.getLegacySelectorForTargetName(targetName); + return this.deprecate(this.scope.findElement(selector), targetName); + } + findAllLegacyTargets(targetName) { + const selector = this.getLegacySelectorForTargetName(targetName); + return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName)); + } + getLegacySelectorForTargetName(targetName) { + const targetDescriptor = `${this.identifier}.${targetName}`; + return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor); + } + deprecate(element, targetName) { + if (element) { + const { identifier } = this; + const attributeName = this.schema.targetAttribute; + const revisedAttributeName = this.schema.targetAttributeForScope(identifier); + this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}="${identifier}.${targetName}" with ${revisedAttributeName}="${targetName}". ` + + `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`); + } + return element; + } + get guide() { + return this.scope.guide; + } +} + +class OutletSet { + constructor(scope, controllerElement) { + this.scope = scope; + this.controllerElement = controllerElement; + } + get element() { + return this.scope.element; + } + get identifier() { + return this.scope.identifier; + } + get schema() { + return this.scope.schema; + } + has(outletName) { + return this.find(outletName) != null; + } + find(...outletNames) { + return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined); + } + findAll(...outletNames) { + return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []); + } + getSelectorForOutletName(outletName) { + const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName); + return this.controllerElement.getAttribute(attributeName); + } + findOutlet(outletName) { + const selector = this.getSelectorForOutletName(outletName); + if (selector) + return this.findElement(selector, outletName); + } + findAllOutlets(outletName) { + const selector = this.getSelectorForOutletName(outletName); + return selector ? this.findAllElements(selector, outletName) : []; + } + findElement(selector, outletName) { + const elements = this.scope.queryElements(selector); + return elements.filter((element) => this.matchesElement(element, selector, outletName))[0]; + } + findAllElements(selector, outletName) { + const elements = this.scope.queryElements(selector); + return elements.filter((element) => this.matchesElement(element, selector, outletName)); + } + matchesElement(element, selector, outletName) { + const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || ""; + return element.matches(selector) && controllerAttribute.split(" ").includes(outletName); + } +} + +class Scope { + constructor(schema, element, identifier, logger) { + this.targets = new TargetSet(this); + this.classes = new ClassMap(this); + this.data = new DataMap(this); + this.containsElement = (element) => { + return element.closest(this.controllerSelector) === this.element; + }; + this.schema = schema; + this.element = element; + this.identifier = identifier; + this.guide = new Guide(logger); + this.outlets = new OutletSet(this.documentScope, element); + } + findElement(selector) { + return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement); + } + findAllElements(selector) { + return [ + ...(this.element.matches(selector) ? [this.element] : []), + ...this.queryElements(selector).filter(this.containsElement), + ]; + } + queryElements(selector) { + return Array.from(this.element.querySelectorAll(selector)); + } + get controllerSelector() { + return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier); + } + get isDocumentScope() { + return this.element === document.documentElement; + } + get documentScope() { + return this.isDocumentScope + ? this + : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger); + } +} + +class ScopeObserver { + constructor(element, schema, delegate) { + this.element = element; + this.schema = schema; + this.delegate = delegate; + this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this); + this.scopesByIdentifierByElement = new WeakMap(); + this.scopeReferenceCounts = new WeakMap(); + } + start() { + this.valueListObserver.start(); + } + stop() { + this.valueListObserver.stop(); + } + get controllerAttribute() { + return this.schema.controllerAttribute; + } + parseValueForToken(token) { + const { element, content: identifier } = token; + return this.parseValueForElementAndIdentifier(element, identifier); + } + parseValueForElementAndIdentifier(element, identifier) { + const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element); + let scope = scopesByIdentifier.get(identifier); + if (!scope) { + scope = this.delegate.createScopeForElementAndIdentifier(element, identifier); + scopesByIdentifier.set(identifier, scope); + } + return scope; + } + elementMatchedValue(element, value) { + const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1; + this.scopeReferenceCounts.set(value, referenceCount); + if (referenceCount == 1) { + this.delegate.scopeConnected(value); + } + } + elementUnmatchedValue(element, value) { + const referenceCount = this.scopeReferenceCounts.get(value); + if (referenceCount) { + this.scopeReferenceCounts.set(value, referenceCount - 1); + if (referenceCount == 1) { + this.delegate.scopeDisconnected(value); + } + } + } + fetchScopesByIdentifierForElement(element) { + let scopesByIdentifier = this.scopesByIdentifierByElement.get(element); + if (!scopesByIdentifier) { + scopesByIdentifier = new Map(); + this.scopesByIdentifierByElement.set(element, scopesByIdentifier); + } + return scopesByIdentifier; + } +} + +class Router { + constructor(application) { + this.application = application; + this.scopeObserver = new ScopeObserver(this.element, this.schema, this); + this.scopesByIdentifier = new Multimap(); + this.modulesByIdentifier = new Map(); + } + get element() { + return this.application.element; + } + get schema() { + return this.application.schema; + } + get logger() { + return this.application.logger; + } + get controllerAttribute() { + return this.schema.controllerAttribute; + } + get modules() { + return Array.from(this.modulesByIdentifier.values()); + } + get contexts() { + return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []); + } + start() { + this.scopeObserver.start(); + } + stop() { + this.scopeObserver.stop(); + } + loadDefinition(definition) { + this.unloadIdentifier(definition.identifier); + const module = new Module(this.application, definition); + this.connectModule(module); + const afterLoad = definition.controllerConstructor.afterLoad; + if (afterLoad) { + afterLoad.call(definition.controllerConstructor, definition.identifier, this.application); + } + } + unloadIdentifier(identifier) { + const module = this.modulesByIdentifier.get(identifier); + if (module) { + this.disconnectModule(module); + } + } + getContextForElementAndIdentifier(element, identifier) { + const module = this.modulesByIdentifier.get(identifier); + if (module) { + return module.contexts.find((context) => context.element == element); + } + } + proposeToConnectScopeForElementAndIdentifier(element, identifier) { + const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier); + if (scope) { + this.scopeObserver.elementMatchedValue(scope.element, scope); + } + else { + console.error(`Couldn't find or create scope for identifier: "${identifier}" and element:`, element); + } + } + handleError(error, message, detail) { + this.application.handleError(error, message, detail); + } + createScopeForElementAndIdentifier(element, identifier) { + return new Scope(this.schema, element, identifier, this.logger); + } + scopeConnected(scope) { + this.scopesByIdentifier.add(scope.identifier, scope); + const module = this.modulesByIdentifier.get(scope.identifier); + if (module) { + module.connectContextForScope(scope); + } + } + scopeDisconnected(scope) { + this.scopesByIdentifier.delete(scope.identifier, scope); + const module = this.modulesByIdentifier.get(scope.identifier); + if (module) { + module.disconnectContextForScope(scope); + } + } + connectModule(module) { + this.modulesByIdentifier.set(module.identifier, module); + const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier); + scopes.forEach((scope) => module.connectContextForScope(scope)); + } + disconnectModule(module) { + this.modulesByIdentifier.delete(module.identifier); + const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier); + scopes.forEach((scope) => module.disconnectContextForScope(scope)); + } +} + +const defaultSchema = { + controllerAttribute: "data-controller", + actionAttribute: "data-action", + targetAttribute: "data-target", + targetAttributeForScope: (identifier) => `data-${identifier}-target`, + outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`, + keyMappings: Object.assign(Object.assign({ enter: "Enter", tab: "Tab", esc: "Escape", space: " ", up: "ArrowUp", down: "ArrowDown", left: "ArrowLeft", right: "ArrowRight", home: "Home", end: "End", page_up: "PageUp", page_down: "PageDown" }, objectFromEntries("abcdefghijklmnopqrstuvwxyz".split("").map((c) => [c, c]))), objectFromEntries("0123456789".split("").map((n) => [n, n]))), +}; +function objectFromEntries(array) { + return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {}); +} + +class Application { + constructor(element = document.documentElement, schema = defaultSchema) { + this.logger = console; + this.debug = false; + this.logDebugActivity = (identifier, functionName, detail = {}) => { + if (this.debug) { + this.logFormattedMessage(identifier, functionName, detail); + } + }; + this.element = element; + this.schema = schema; + this.dispatcher = new Dispatcher(this); + this.router = new Router(this); + this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters); + } + static start(element, schema) { + const application = new this(element, schema); + application.start(); + return application; + } + async start() { + await domReady(); + this.logDebugActivity("application", "starting"); + this.dispatcher.start(); + this.router.start(); + this.logDebugActivity("application", "start"); + } + stop() { + this.logDebugActivity("application", "stopping"); + this.dispatcher.stop(); + this.router.stop(); + this.logDebugActivity("application", "stop"); + } + register(identifier, controllerConstructor) { + this.load({ identifier, controllerConstructor }); + } + registerActionOption(name, filter) { + this.actionDescriptorFilters[name] = filter; + } + load(head, ...rest) { + const definitions = Array.isArray(head) ? head : [head, ...rest]; + definitions.forEach((definition) => { + if (definition.controllerConstructor.shouldLoad) { + this.router.loadDefinition(definition); + } + }); + } + unload(head, ...rest) { + const identifiers = Array.isArray(head) ? head : [head, ...rest]; + identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier)); + } + get controllers() { + return this.router.contexts.map((context) => context.controller); + } + getControllerForElementAndIdentifier(element, identifier) { + const context = this.router.getContextForElementAndIdentifier(element, identifier); + return context ? context.controller : null; + } + handleError(error, message, detail) { + var _a; + this.logger.error(`%s\n\n%o\n\n%o`, message, error, detail); + (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, "", 0, 0, error); + } + logFormattedMessage(identifier, functionName, detail = {}) { + detail = Object.assign({ application: this }, detail); + this.logger.groupCollapsed(`${identifier} #${functionName}`); + this.logger.log("details:", Object.assign({}, detail)); + this.logger.groupEnd(); + } +} +function domReady() { + return new Promise((resolve) => { + if (document.readyState == "loading") { + document.addEventListener("DOMContentLoaded", () => resolve()); + } + else { + resolve(); + } + }); +} + +function ClassPropertiesBlessing(constructor) { + const classes = readInheritableStaticArrayValues(constructor, "classes"); + return classes.reduce((properties, classDefinition) => { + return Object.assign(properties, propertiesForClassDefinition(classDefinition)); + }, {}); +} +function propertiesForClassDefinition(key) { + return { + [`${key}Class`]: { + get() { + const { classes } = this; + if (classes.has(key)) { + return classes.get(key); + } + else { + const attribute = classes.getAttributeName(key); + throw new Error(`Missing attribute "${attribute}"`); + } + }, + }, + [`${key}Classes`]: { + get() { + return this.classes.getAll(key); + }, + }, + [`has${capitalize(key)}Class`]: { + get() { + return this.classes.has(key); + }, + }, + }; +} + +function OutletPropertiesBlessing(constructor) { + const outlets = readInheritableStaticArrayValues(constructor, "outlets"); + return outlets.reduce((properties, outletDefinition) => { + return Object.assign(properties, propertiesForOutletDefinition(outletDefinition)); + }, {}); +} +function getOutletController(controller, element, identifier) { + return controller.application.getControllerForElementAndIdentifier(element, identifier); +} +function getControllerAndEnsureConnectedScope(controller, element, outletName) { + let outletController = getOutletController(controller, element, outletName); + if (outletController) + return outletController; + controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName); + outletController = getOutletController(controller, element, outletName); + if (outletController) + return outletController; +} +function propertiesForOutletDefinition(name) { + const camelizedName = namespaceCamelize(name); + return { + [`${camelizedName}Outlet`]: { + get() { + const outletElement = this.outlets.find(name); + const selector = this.outlets.getSelectorForOutletName(name); + if (outletElement) { + const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name); + if (outletController) + return outletController; + throw new Error(`The provided outlet element is missing an outlet controller "${name}" instance for host controller "${this.identifier}"`); + } + throw new Error(`Missing outlet element "${name}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${selector}".`); + }, + }, + [`${camelizedName}Outlets`]: { + get() { + const outlets = this.outlets.findAll(name); + if (outlets.length > 0) { + return outlets + .map((outletElement) => { + const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name); + if (outletController) + return outletController; + console.warn(`The provided outlet element is missing an outlet controller "${name}" instance for host controller "${this.identifier}"`, outletElement); + }) + .filter((controller) => controller); + } + return []; + }, + }, + [`${camelizedName}OutletElement`]: { + get() { + const outletElement = this.outlets.find(name); + const selector = this.outlets.getSelectorForOutletName(name); + if (outletElement) { + return outletElement; + } + else { + throw new Error(`Missing outlet element "${name}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${selector}".`); + } + }, + }, + [`${camelizedName}OutletElements`]: { + get() { + return this.outlets.findAll(name); + }, + }, + [`has${capitalize(camelizedName)}Outlet`]: { + get() { + return this.outlets.has(name); + }, + }, + }; +} + +function TargetPropertiesBlessing(constructor) { + const targets = readInheritableStaticArrayValues(constructor, "targets"); + return targets.reduce((properties, targetDefinition) => { + return Object.assign(properties, propertiesForTargetDefinition(targetDefinition)); + }, {}); +} +function propertiesForTargetDefinition(name) { + return { + [`${name}Target`]: { + get() { + const target = this.targets.find(name); + if (target) { + return target; + } + else { + throw new Error(`Missing target element "${name}" for "${this.identifier}" controller`); + } + }, + }, + [`${name}Targets`]: { + get() { + return this.targets.findAll(name); + }, + }, + [`has${capitalize(name)}Target`]: { + get() { + return this.targets.has(name); + }, + }, + }; +} + +function ValuePropertiesBlessing(constructor) { + const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, "values"); + const propertyDescriptorMap = { + valueDescriptorMap: { + get() { + return valueDefinitionPairs.reduce((result, valueDefinitionPair) => { + const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier); + const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key); + return Object.assign(result, { [attributeName]: valueDescriptor }); + }, {}); + }, + }, + }; + return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => { + return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair)); + }, propertyDescriptorMap); +} +function propertiesForValueDefinitionPair(valueDefinitionPair, controller) { + const definition = parseValueDefinitionPair(valueDefinitionPair, controller); + const { key, name, reader: read, writer: write } = definition; + return { + [name]: { + get() { + const value = this.data.get(key); + if (value !== null) { + return read(value); + } + else { + return definition.defaultValue; + } + }, + set(value) { + if (value === undefined) { + this.data.delete(key); + } + else { + this.data.set(key, write(value)); + } + }, + }, + [`has${capitalize(name)}`]: { + get() { + return this.data.has(key) || definition.hasCustomDefaultValue; + }, + }, + }; +} +function parseValueDefinitionPair([token, typeDefinition], controller) { + return valueDescriptorForTokenAndTypeDefinition({ + controller, + token, + typeDefinition, + }); +} +function parseValueTypeConstant(constant) { + switch (constant) { + case Array: + return "array"; + case Boolean: + return "boolean"; + case Number: + return "number"; + case Object: + return "object"; + case String: + return "string"; + } +} +function parseValueTypeDefault(defaultValue) { + switch (typeof defaultValue) { + case "boolean": + return "boolean"; + case "number": + return "number"; + case "string": + return "string"; + } + if (Array.isArray(defaultValue)) + return "array"; + if (Object.prototype.toString.call(defaultValue) === "[object Object]") + return "object"; +} +function parseValueTypeObject(payload) { + const { controller, token, typeObject } = payload; + const hasType = isSomething(typeObject.type); + const hasDefault = isSomething(typeObject.default); + const fullObject = hasType && hasDefault; + const onlyType = hasType && !hasDefault; + const onlyDefault = !hasType && hasDefault; + const typeFromObject = parseValueTypeConstant(typeObject.type); + const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default); + if (onlyType) + return typeFromObject; + if (onlyDefault) + return typeFromDefaultValue; + if (typeFromObject !== typeFromDefaultValue) { + const propertyPath = controller ? `${controller}.${token}` : token; + throw new Error(`The specified default value for the Stimulus Value "${propertyPath}" must match the defined type "${typeFromObject}". The provided default value of "${typeObject.default}" is of type "${typeFromDefaultValue}".`); + } + if (fullObject) + return typeFromObject; +} +function parseValueTypeDefinition(payload) { + const { controller, token, typeDefinition } = payload; + const typeObject = { controller, token, typeObject: typeDefinition }; + const typeFromObject = parseValueTypeObject(typeObject); + const typeFromDefaultValue = parseValueTypeDefault(typeDefinition); + const typeFromConstant = parseValueTypeConstant(typeDefinition); + const type = typeFromObject || typeFromDefaultValue || typeFromConstant; + if (type) + return type; + const propertyPath = controller ? `${controller}.${typeDefinition}` : token; + throw new Error(`Unknown value type "${propertyPath}" for "${token}" value`); +} +function defaultValueForDefinition(typeDefinition) { + const constant = parseValueTypeConstant(typeDefinition); + if (constant) + return defaultValuesByType[constant]; + const hasDefault = hasProperty(typeDefinition, "default"); + const hasType = hasProperty(typeDefinition, "type"); + const typeObject = typeDefinition; + if (hasDefault) + return typeObject.default; + if (hasType) { + const { type } = typeObject; + const constantFromType = parseValueTypeConstant(type); + if (constantFromType) + return defaultValuesByType[constantFromType]; + } + return typeDefinition; +} +function valueDescriptorForTokenAndTypeDefinition(payload) { + const { token, typeDefinition } = payload; + const key = `${dasherize(token)}-value`; + const type = parseValueTypeDefinition(payload); + return { + type, + key, + name: camelize(key), + get defaultValue() { + return defaultValueForDefinition(typeDefinition); + }, + get hasCustomDefaultValue() { + return parseValueTypeDefault(typeDefinition) !== undefined; + }, + reader: readers[type], + writer: writers[type] || writers.default, + }; +} +const defaultValuesByType = { + get array() { + return []; + }, + boolean: false, + number: 0, + get object() { + return {}; + }, + string: "", +}; +const readers = { + array(value) { + const array = JSON.parse(value); + if (!Array.isArray(array)) { + throw new TypeError(`expected value of type "array" but instead got value "${value}" of type "${parseValueTypeDefault(array)}"`); + } + return array; + }, + boolean(value) { + return !(value == "0" || String(value).toLowerCase() == "false"); + }, + number(value) { + return Number(value.replace(/_/g, "")); + }, + object(value) { + const object = JSON.parse(value); + if (object === null || typeof object != "object" || Array.isArray(object)) { + throw new TypeError(`expected value of type "object" but instead got value "${value}" of type "${parseValueTypeDefault(object)}"`); + } + return object; + }, + string(value) { + return value; + }, +}; +const writers = { + default: writeString, + array: writeJSON, + object: writeJSON, +}; +function writeJSON(value) { + return JSON.stringify(value); +} +function writeString(value) { + return `${value}`; +} + +class Controller { + constructor(context) { + this.context = context; + } + static get shouldLoad() { + return true; + } + static afterLoad(_identifier, _application) { + return; + } + get application() { + return this.context.application; + } + get scope() { + return this.context.scope; + } + get element() { + return this.scope.element; + } + get identifier() { + return this.scope.identifier; + } + get targets() { + return this.scope.targets; + } + get outlets() { + return this.scope.outlets; + } + get classes() { + return this.scope.classes; + } + get data() { + return this.scope.data; + } + initialize() { + } + connect() { + } + disconnect() { + } + dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) { + const type = prefix ? `${prefix}:${eventName}` : eventName; + const event = new CustomEvent(type, { detail, bubbles, cancelable }); + target.dispatchEvent(event); + return event; + } +} +Controller.blessings = [ + ClassPropertiesBlessing, + TargetPropertiesBlessing, + ValuePropertiesBlessing, + OutletPropertiesBlessing, +]; +Controller.targets = []; +Controller.outlets = []; +Controller.values = {}; + + + + +/***/ }), + +/***/ "./node_modules/@symfony/stimulus-bridge/dist/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@symfony/stimulus-bridge/dist/index.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ startStimulusApp: () => (/* binding */ startStimulusApp) +/* harmony export */ }); +/* harmony import */ var _hotwired_stimulus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @hotwired/stimulus */ "./node_modules/@hotwired/stimulus/dist/stimulus.js"); +/* harmony import */ var _webpack_loader_symfony_stimulus_bridge_controllers_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpack/loader!@symfony/stimulus-bridge/controllers.json */ "./node_modules/@symfony/stimulus-bridge/dist/webpack/loader.js!./assets/controllers.json"); + + + +/* +Stimulus Webpack Helpers 1.0.0 +Copyright © 2021 Basecamp, LLC + */ +function definitionsFromContext(context) { + return context.keys() + .map((key) => definitionForModuleWithContextAndKey(context, key)) + .filter((value) => value); +} +function definitionForModuleWithContextAndKey(context, key) { + const identifier = identifierForContextKey(key); + if (identifier) { + return definitionForModuleAndIdentifier(context(key), identifier); + } +} +function definitionForModuleAndIdentifier(module, identifier) { + const controllerConstructor = module.default; + if (typeof controllerConstructor == "function") { + return { identifier, controllerConstructor }; + } +} +function identifierForContextKey(key) { + const logicalName = (key.match(/^(?:\.\/)?(.+)(?:[_-]controller\..+?)$/) || [])[1]; + if (logicalName) { + return logicalName.replace(/_/g, "-").replace(/\//g, "--"); + } +} + +function startStimulusApp(context) { + const application = _hotwired_stimulus__WEBPACK_IMPORTED_MODULE_0__.Application.start(); + if (true) { + application.debug = true; + } + if (context) { + application.load(definitionsFromContext(context)); + } + for (const controllerName in _webpack_loader_symfony_stimulus_bridge_controllers_json__WEBPACK_IMPORTED_MODULE_1__["default"]) { + if (!_webpack_loader_symfony_stimulus_bridge_controllers_json__WEBPACK_IMPORTED_MODULE_1__["default"].hasOwnProperty(controllerName)) { + continue; + } + application.register(controllerName, _webpack_loader_symfony_stimulus_bridge_controllers_json__WEBPACK_IMPORTED_MODULE_1__["default"][controllerName]); + } + return application; +} + + + + +/***/ }), + +/***/ "./node_modules/@symfony/stimulus-bridge/dist/webpack/loader.js!./assets/controllers.json": +/*!************************************************************************************************!*\ + !*** ./node_modules/@symfony/stimulus-bridge/dist/webpack/loader.js!./assets/controllers.json ***! + \************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ +}); + +/***/ }), + +/***/ "./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js!./assets/controllers/hello_controller.js": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js!./assets/controllers/hello_controller.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _default) +/* harmony export */ }); +/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js"); +/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js"); +/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js"); +/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_es_symbol_to_primitive_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.symbol.to-primitive.js */ "./node_modules/core-js/modules/es.symbol.to-primitive.js"); +/* harmony import */ var core_js_modules_es_symbol_to_primitive_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_to_primitive_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ "./node_modules/core-js/modules/es.array.iterator.js"); +/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_es_date_to_primitive_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.date.to-primitive.js */ "./node_modules/core-js/modules/es.date.to-primitive.js"); +/* harmony import */ var core_js_modules_es_date_to_primitive_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_primitive_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_es_function_bind_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.function.bind.js */ "./node_modules/core-js/modules/es.function.bind.js"); +/* harmony import */ var core_js_modules_es_function_bind_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_bind_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.number.constructor.js */ "./node_modules/core-js/modules/es.number.constructor.js"); +/* harmony import */ var core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_number_constructor_js__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_es_object_create_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.object.create.js */ "./node_modules/core-js/modules/es.object.create.js"); +/* harmony import */ var core_js_modules_es_object_create_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_create_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_es_object_define_property_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.object.define-property.js */ "./node_modules/core-js/modules/es.object.define-property.js"); +/* harmony import */ var core_js_modules_es_object_define_property_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_define_property_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_es_object_get_prototype_of_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.object.get-prototype-of.js */ "./node_modules/core-js/modules/es.object.get-prototype-of.js"); +/* harmony import */ var core_js_modules_es_object_get_prototype_of_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_prototype_of_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_modules_es_object_set_prototype_of_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.object.set-prototype-of.js */ "./node_modules/core-js/modules/es.object.set-prototype-of.js"); +/* harmony import */ var core_js_modules_es_object_set_prototype_of_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_set_prototype_of_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); +/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var core_js_modules_es_reflect_construct_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.reflect.construct.js */ "./node_modules/core-js/modules/es.reflect.construct.js"); +/* harmony import */ var core_js_modules_es_reflect_construct_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_construct_js__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ "./node_modules/core-js/modules/es.string.iterator.js"); +/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ "./node_modules/core-js/modules/web.dom-collections.iterator.js"); +/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var _hotwired_stimulus__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @hotwired/stimulus */ "./node_modules/@hotwired/stimulus/dist/stimulus.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } + + + + + + + + + + + + + + + + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + + +/* + * This is an example Stimulus controller! + * + * Any element with a data-controller="hello" attribute will cause + * this controller to be executed. The name "hello" comes from the filename: + * hello_controller.js -> "hello" + * + * Delete this file or adapt it for your use! + */ +var _default = /*#__PURE__*/function (_Controller) { + function _default() { + _classCallCheck(this, _default); + return _callSuper(this, _default, arguments); + } + _inherits(_default, _Controller); + return _createClass(_default, [{ + key: "connect", + value: function connect() { + this.element.textContent = 'Hello Stimulus! Edit me in assets/controllers/hello_controller.js'; + } + }]); +}(_hotwired_stimulus__WEBPACK_IMPORTED_MODULE_16__.Controller); + + +/***/ }), + +/***/ "./assets/app.js": +/*!***********************!*\ + !*** ./assets/app.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _styles_app_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./styles/app.css */ "./assets/styles/app.css"); +/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bootstrap */ "./assets/bootstrap.js"); +/* + * Welcome to your app's main JavaScript file! + * + * We recommend including the built version of this JavaScript file + * (and its CSS file) in your base layout (base.html.twig). + */ + +// any CSS you import will output into a single css file (app.css in this case) + + +// start the Stimulus application + + +/***/ }), + +/***/ "./assets/bootstrap.js": +/*!*****************************!*\ + !*** ./assets/bootstrap.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ app: () => (/* binding */ app) +/* harmony export */ }); +/* harmony import */ var _symfony_stimulus_bridge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @symfony/stimulus-bridge */ "./node_modules/@symfony/stimulus-bridge/dist/index.js"); + + +// Registers Stimulus controllers from controllers.json and in the controllers/ directory +var app = (0,_symfony_stimulus_bridge__WEBPACK_IMPORTED_MODULE_0__.startStimulusApp)(__webpack_require__("./assets/controllers sync recursive ./node_modules/@symfony/stimulus-bridge/lazy-controller-loader.js! \\.[jt]sx?$")); + +// register any custom, 3rd party controllers here +// app.register('some_controller_name', SomeImportedController); + +/***/ }), + +/***/ "./assets/styles/app.css": +/*!*******************************!*\ + !*** ./assets/styles/app.css ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + +/***/ }), + +/***/ "./node_modules/core-js/internals/a-callable.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/a-callable.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js"); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/a-constructor.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/a-constructor.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js"); + +var $TypeError = TypeError; + +// `Assert: IsConstructor(argument) is true` +module.exports = function (argument) { + if (isConstructor(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a constructor'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/a-possible-prototype.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/a-possible-prototype.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isPossiblePrototype = __webpack_require__(/*! ../internals/is-possible-prototype */ "./node_modules/core-js/internals/is-possible-prototype.js"); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (isPossiblePrototype(argument)) return argument; + throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/add-to-unscopables.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/internals/add-to-unscopables.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] === undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/an-object.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/an-object.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/array-includes.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/array-includes.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/array-iteration.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/array-iteration.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "./node_modules/core-js/internals/length-of-array-like.js"); +var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js"); + +var push = uncurryThis([].push); + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation +var createMethod = function (TYPE) { + var IS_MAP = TYPE === 1; + var IS_FILTER = TYPE === 2; + var IS_SOME = TYPE === 3; + var IS_EVERY = TYPE === 4; + var IS_FIND_INDEX = TYPE === 6; + var IS_FILTER_REJECT = TYPE === 7; + var NO_HOLES = TYPE === 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject($this); + var self = IndexedObject(O); + var length = lengthOfArrayLike(self); + var boundFunction = bind(callbackfn, that); + var index = 0; + var create = specificCreate || arraySpeciesCreate; + var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: push(target, value); // filter + } else switch (TYPE) { + case 4: return false; // every + case 7: push(target, value); // filterReject + } + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + +module.exports = { + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + forEach: createMethod(0), + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + map: createMethod(1), + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + filter: createMethod(2), + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + some: createMethod(3), + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + every: createMethod(4), + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + find: createMethod(5), + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod(6), + // `Array.prototype.filterReject` method + // https://github.com/tc39/proposal-array-filtering + filterReject: createMethod(7) +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/array-slice.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/array-slice.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = uncurryThis([].slice); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/array-species-constructor.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/internals/array-species-constructor.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); +var $Array = Array; + +// a part of `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? $Array : C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/array-species-create.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/array-species-create.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ "./node_modules/core-js/internals/array-species-constructor.js"); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/classof-raw.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/classof-raw.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/classof.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/internals/classof.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/copy-constructor-properties.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/correct-prototype-getter.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/create-iter-result-object.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/internals/create-iter-result-object.js ***! + \*********************************************************************/ +/***/ ((module) => { + +"use strict"; + +// `CreateIterResultObject` abstract operation +// https://tc39.es/ecma262/#sec-createiterresultobject +module.exports = function (value, done) { + return { value: value, done: done }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/create-non-enumerable-property.js": +/*!**************************************************************************!*\ + !*** ./node_modules/core-js/internals/create-non-enumerable-property.js ***! + \**************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/create-property-descriptor.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/internals/create-property-descriptor.js ***! + \**********************************************************************/ +/***/ ((module) => { + +"use strict"; + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/date-to-primitive.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/date-to-primitive.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); +var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "./node_modules/core-js/internals/ordinary-to-primitive.js"); + +var $TypeError = TypeError; + +// `Date.prototype[@@toPrimitive](hint)` method implementation +// https://tc39.es/ecma262/#sec-date.prototype-@@toprimitive +module.exports = function (hint) { + anObject(this); + if (hint === 'string' || hint === 'default') hint = 'string'; + else if (hint !== 'number') throw new $TypeError('Incorrect hint'); + return ordinaryToPrimitive(this, hint); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/define-built-in-accessor.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/define-built-in-accessor.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var makeBuiltIn = __webpack_require__(/*! ../internals/make-built-in */ "./node_modules/core-js/internals/make-built-in.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, name, descriptor) { + if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); + if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); + return defineProperty.f(target, name, descriptor); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/define-built-in.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/define-built-in.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); +var makeBuiltIn = __webpack_require__(/*! ../internals/make-built-in */ "./node_modules/core-js/internals/make-built-in.js"); +var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js/internals/define-global-property.js"); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/define-global-property.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/internals/define-global-property.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/descriptors.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/descriptors.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/document-create-element.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/document-create-element.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/dom-iterables.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/dom-iterables.js ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; + +// iterable DOM collections +// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods +module.exports = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/dom-token-list-prototype.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/dom-token-list-prototype.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList` +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); + +var classList = documentCreateElement('span').classList; +var DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype; + +module.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/engine-user-agent.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/engine-user-agent.js ***! + \*************************************************************/ +/***/ ((module) => { + +"use strict"; + +module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || ''; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/engine-v8-version.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/engine-v8-version.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js"); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/enum-bug-keys.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/enum-bug-keys.js ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/export.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/internals/export.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); +var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js/internals/define-global-property.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = global[TARGET] && global[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/fails.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/internals/fails.js ***! + \*************************************************/ +/***/ ((module) => { + +"use strict"; + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-apply.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/function-apply.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); + +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var call = FunctionPrototype.call; + +// eslint-disable-next-line es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-bind-context.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/internals/function-bind-context.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this-clause */ "./node_modules/core-js/internals/function-uncurry-this-clause.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js"); +var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-bind-native.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/function-bind-native.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = (function () { /* empty */ }).bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-bind.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/function-bind.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js/internals/array-slice.js"); +var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); + +var $Function = Function; +var concat = uncurryThis([].concat); +var join = uncurryThis([].join); +var factories = {}; + +var construct = function (C, argsLength, args) { + if (!hasOwn(factories, argsLength)) { + var list = []; + var i = 0; + for (; i < argsLength; i++) list[i] = 'a[' + i + ']'; + factories[argsLength] = $Function('C,a', 'return new C(' + join(list, ',') + ')'); + } return factories[argsLength](C, args); +}; + +// `Function.prototype.bind` method implementation +// https://tc39.es/ecma262/#sec-function.prototype.bind +// eslint-disable-next-line es/no-function-prototype-bind -- detection +module.exports = NATIVE_BIND ? $Function.bind : function bind(that /* , ...args */) { + var F = aCallable(this); + var Prototype = F.prototype; + var partArgs = arraySlice(arguments, 1); + var boundFunction = function bound(/* args... */) { + var args = concat(partArgs, arraySlice(arguments)); + return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args); + }; + if (isObject(Prototype)) boundFunction.prototype = Prototype; + return boundFunction; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-call.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/function-call.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); + +var call = Function.prototype.call; + +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-name.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/function-name.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-uncurry-this-accessor.js": +/*!**************************************************************************!*\ + !*** ./node_modules/core-js/internals/function-uncurry-this-accessor.js ***! + \**************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js"); + +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-uncurry-this-clause.js": +/*!************************************************************************!*\ + !*** ./node_modules/core-js/internals/function-uncurry-this-clause.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = function (fn) { + // Nashorn bug: + // https://github.com/zloirock/core-js/issues/1128 + // https://github.com/zloirock/core-js/issues/1130 + if (classofRaw(fn) === 'Function') return uncurryThis(fn); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/function-uncurry-this.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/internals/function-uncurry-this.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ "./node_modules/core-js/internals/function-bind-native.js"); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/get-built-in.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/get-built-in.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/get-json-replacer-function.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/internals/get-json-replacer-function.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); + +var push = uncurryThis([].push); + +module.exports = function (replacer) { + if (isCallable(replacer)) return replacer; + if (!isArray(replacer)) return; + var rawLength = replacer.length; + var keys = []; + for (var i = 0; i < rawLength; i++) { + var element = replacer[i]; + if (typeof element == 'string') push(keys, element); + else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') push(keys, toString(element)); + } + var keysLength = keys.length; + var root = true; + return function (key, value) { + if (root) { + root = false; + return value; + } + if (isArray(this)) return value; + for (var j = 0; j < keysLength; j++) if (keys[j] === key) return value; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/get-method.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/get-method.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js"); +var isNullOrUndefined = __webpack_require__(/*! ../internals/is-null-or-undefined */ "./node_modules/core-js/internals/is-null-or-undefined.js"); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/global.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/internals/global.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/has-own-property.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/internals/has-own-property.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/hidden-keys.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/hidden-keys.js ***! + \*******************************************************/ +/***/ ((module) => { + +"use strict"; + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/html.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/internals/html.js ***! + \************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('document', 'documentElement'); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/ie8-dom-define.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/ie8-dom-define.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/indexed-object.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/indexed-object.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/inherit-if-required.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/internals/inherit-if-required.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/inspect-source.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/inspect-source.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/internal-state.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/internal-state.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/weak-map-basic-detection */ "./node_modules/core-js/internals/weak-map-basic-detection.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var shared = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-array.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/internals/is-array.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-callable.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/is-callable.js ***! + \*******************************************************/ +/***/ ((module) => { + +"use strict"; + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-constructor.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/is-constructor.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); + +var noop = function () { /* empty */ }; +var construct = getBuiltIn('Reflect', 'construct'); +var constructorRegExp = /^\s*(?:class|function)\b/; +var exec = uncurryThis(constructorRegExp.exec); +var INCORRECT_TO_STRING = !constructorRegExp.test(noop); + +var isConstructorModern = function isConstructor(argument) { + if (!isCallable(argument)) return false; + try { + construct(noop, [], argument); + return true; + } catch (error) { + return false; + } +}; + +var isConstructorLegacy = function isConstructor(argument) { + if (!isCallable(argument)) return false; + switch (classof(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': return false; + } + try { + // we can't check .prototype since constructors produced by .bind haven't it + // `Function#toString` throws on some built-it function in some legacy engines + // (for example, `DOMQuad` and similar in FF41-) + return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); + } catch (error) { + return true; + } +}; + +isConstructorLegacy.sham = true; + +// `IsConstructor` abstract operation +// https://tc39.es/ecma262/#sec-isconstructor +module.exports = !construct || fails(function () { + var called; + return isConstructorModern(isConstructorModern.call) + || !isConstructorModern(Object) + || !isConstructorModern(function () { called = true; }) + || called; +}) ? isConstructorLegacy : isConstructorModern; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-forced.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/is-forced.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-null-or-undefined.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/is-null-or-undefined.js ***! + \****************************************************************/ +/***/ ((module) => { + +"use strict"; + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-object.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/is-object.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-possible-prototype.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/internals/is-possible-prototype.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); + +module.exports = function (argument) { + return isObject(argument) || argument === null; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-pure.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/internals/is-pure.js ***! + \***************************************************/ +/***/ ((module) => { + +"use strict"; + +module.exports = false; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/is-symbol.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/is-symbol.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js"); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterator-create-constructor.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/internals/iterator-create-constructor.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var IteratorPrototype = (__webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js").IteratorPrototype); +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterator-define.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/iterator-define.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); +var FunctionName = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var createIteratorConstructor = __webpack_require__(/*! ../internals/iterator-create-constructor */ "./node_modules/core-js/internals/iterator-create-constructor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); +var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js"); + +var PROPER_FUNCTION_NAME = FunctionName.PROPER; +var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND]; + + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } + + return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { + defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array.prototype.{ values, @@iterator }.name in V8 / FF + if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return call(nativeIterator, this); }; + } + } + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + defineBuiltIn(IterablePrototype, KEY, methods[KEY]); + } + } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); + } + Iterators[NAME] = defaultIterator; + + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterators-core.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/internals/iterators-core.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/iterators.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/iterators.js ***! + \*****************************************************/ +/***/ ((module) => { + +"use strict"; + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/length-of-array-like.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/length-of-array-like.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/make-built-in.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/make-built-in.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").CONFIGURABLE); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/math-trunc.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/math-trunc.js ***! + \******************************************************/ +/***/ ((module) => { + +"use strict"; + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-create.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/object-create.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +/* global ActiveXObject -- old IE, WSH */ +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); +var definePropertiesModule = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); +var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js"); +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-define-properties.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/object-define-properties.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(/*! ../internals/v8-prototype-define-bug */ "./node_modules/core-js/internals/v8-prototype-define-bug.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-define-property.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-define-property.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(/*! ../internals/v8-prototype-define-bug */ "./node_modules/core-js/internals/v8-prototype-define-bug.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!******************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-names-external.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-names-external.js ***! + \**********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +/* eslint-disable es/no-object-getownpropertynames -- safe */ +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var $getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js/internals/array-slice.js"); + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return $getOwnPropertyNames(it); + } catch (error) { + return arraySlice(windowNames); + } +}; + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && classof(it) === 'Window' + ? getWindowNames(it) + : $getOwnPropertyNames(toIndexedObject(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-names.js": +/*!*************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-get-prototype-of.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js"); + +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof $Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-is-prototype-of.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-is-prototype-of.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-keys-internal.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/internals/object-keys-internal.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var indexOf = (__webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-keys.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/object-keys.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-property-is-enumerable.js": +/*!*************************************************************************!*\ + !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-set-prototype-of.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = __webpack_require__(/*! ../internals/function-uncurry-this-accessor */ "./node_modules/core-js/internals/function-uncurry-this-accessor.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); +var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + requireObjectCoercible(O); + aPossiblePrototype(proto); + if (!isObject(O)) return O; + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/object-to-string.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/internals/object-to-string.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); + +// `Object.prototype.toString` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.tostring +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/ordinary-to-primitive.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/internals/ordinary-to-primitive.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/own-keys.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/internals/own-keys.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/path.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/internals/path.js ***! + \************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); + +module.exports = global; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/require-object-coercible.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/require-object-coercible.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var isNullOrUndefined = __webpack_require__(/*! ../internals/is-null-or-undefined */ "./node_modules/core-js/internals/is-null-or-undefined.js"); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/set-to-string-tag.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/set-to-string-tag.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +module.exports = function (target, TAG, STATIC) { + if (target && !STATIC) target = target.prototype; + if (target && !hasOwn(target, TO_STRING_TAG)) { + defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG }); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/shared-key.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/internals/shared-key.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/shared-store.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/shared-store.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); +var globalThis = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js/internals/define-global-property.js"); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.36.1', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.36.1/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/shared.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/internals/shared.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); + +module.exports = function (key, value) { + return store[key] || (store[key] = value || {}); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/string-multibyte.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/internals/string-multibyte.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); + +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var stringSlice = uncurryThis(''.slice); + +var createMethod = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = toString(requireObjectCoercible($this)); + var position = toIntegerOrInfinity(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = charCodeAt(S, position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING + ? charAt(S, position) + : first + : CONVERT_TO_STRING + ? stringSlice(S, position, position + 2) + : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; +}; + +module.exports = { + // `String.prototype.codePointAt` method + // https://tc39.es/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod(true) +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/string-trim.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/string-trim.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js"); + +var replace = uncurryThis(''.replace); +var ltrim = RegExp('^[' + whitespaces + ']+'); +var rtrim = RegExp('(^|[^' + whitespaces + '])[' + whitespaces + ']+$'); + +// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation +var createMethod = function (TYPE) { + return function ($this) { + var string = toString(requireObjectCoercible($this)); + if (TYPE & 1) string = replace(string, ltrim, ''); + if (TYPE & 2) string = replace(string, rtrim, '$1'); + return string; + }; +}; + +module.exports = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + start: createMethod(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + end: createMethod(2), + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + trim: createMethod(3) +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/symbol-constructor-detection.js": +/*!************************************************************************!*\ + !*** ./node_modules/core-js/internals/symbol-constructor-detection.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); + +var $String = global.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/symbol-define-to-primitive.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/internals/symbol-define-to-primitive.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); + +module.exports = function () { + var Symbol = getBuiltIn('Symbol'); + var SymbolPrototype = Symbol && Symbol.prototype; + var valueOf = SymbolPrototype && SymbolPrototype.valueOf; + var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + + if (SymbolPrototype && !SymbolPrototype[TO_PRIMITIVE]) { + // `Symbol.prototype[@@toPrimitive]` method + // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive + // eslint-disable-next-line no-unused-vars -- required for .length + defineBuiltIn(SymbolPrototype, TO_PRIMITIVE, function (hint) { + return call(valueOf, this); + }, { arity: 1 }); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/symbol-registry-detection.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/internals/symbol-registry-detection.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js/internals/symbol-constructor-detection.js"); + +/* eslint-disable es/no-symbol -- safe */ +module.exports = NATIVE_SYMBOL && !!Symbol['for'] && !!Symbol.keyFor; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/this-number-value.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/this-number-value.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); + +// `thisNumberValue` abstract operation +// https://tc39.es/ecma262/#sec-thisnumbervalue +module.exports = uncurryThis(1.0.valueOf); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-absolute-index.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/to-absolute-index.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-indexed-object.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/to-indexed-object.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-integer-or-infinity.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/internals/to-integer-or-infinity.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var trunc = __webpack_require__(/*! ../internals/math-trunc */ "./node_modules/core-js/internals/math-trunc.js"); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-length.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/to-length.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "./node_modules/core-js/internals/to-integer-or-infinity.js"); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-object.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/to-object.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-primitive.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/internals/to-primitive.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js"); +var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "./node_modules/core-js/internals/ordinary-to-primitive.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-property-key.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/internals/to-property-key.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-string-tag-support.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/internals/to-string-tag-support.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/to-string.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/internals/to-string.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/try-to-string.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/internals/try-to-string.js ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/uid.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/internals/uid.js ***! + \***********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/use-symbol-as-uid.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/use-symbol-as-uid.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js/internals/symbol-constructor-detection.js"); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/v8-prototype-define-bug.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/internals/v8-prototype-define-bug.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/weak-map-basic-detection.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/weak-map-basic-detection.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); + +var WeakMap = global.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + + +/***/ }), + +/***/ "./node_modules/core-js/internals/well-known-symbol-define.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/internals/well-known-symbol-define.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js"); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); + +module.exports = function (NAME) { + var Symbol = path.Symbol || (path.Symbol = {}); + if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, { + value: wrappedWellKnownSymbolModule.f(NAME) + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/well-known-symbol-wrapped.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/internals/well-known-symbol-wrapped.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +exports.f = wellKnownSymbol; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/well-known-symbol.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/internals/well-known-symbol.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js/internals/symbol-constructor-detection.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js"); + +var Symbol = global.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/internals/whitespaces.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/internals/whitespaces.js ***! + \*******************************************************/ +/***/ ((module) => { + +"use strict"; + +// a string of all valid unicode whitespaces +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.array.iterator.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.array.iterator.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); +var defineIterator = __webpack_require__(/*! ../internals/iterator-define */ "./node_modules/core-js/internals/iterator-define.js"); +var createIterResultObject = __webpack_require__(/*! ../internals/create-iter-result-object */ "./node_modules/core-js/internals/create-iter-result-object.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); + +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); + +// `Array.prototype.entries` method +// https://tc39.es/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.es/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.es/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.es/ecma262/#sec-createarrayiterator +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), // target + index: 0, // next index + kind: kind // kind + }); +// `%ArrayIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState(this); + var target = state.target; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return createIterResultObject(undefined, true); + } + switch (state.kind) { + case 'keys': return createIterResultObject(index, false); + case 'values': return createIterResultObject(target[index], false); + } return createIterResultObject([index, target[index]], false); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.es/ecma262/#sec-createunmappedargumentsobject +// https://tc39.es/ecma262/#sec-createmappedargumentsobject +var values = Iterators.Arguments = Iterators.Array; + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + +// V8 ~ Chrome 45- bug +if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try { + defineProperty(values, 'name', { value: 'values' }); +} catch (error) { /* empty */ } + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.date.to-primitive.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es.date.to-primitive.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); +var dateToPrimitive = __webpack_require__(/*! ../internals/date-to-primitive */ "./node_modules/core-js/internals/date-to-primitive.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); +var DatePrototype = Date.prototype; + +// `Date.prototype[@@toPrimitive]` method +// https://tc39.es/ecma262/#sec-date.prototype-@@toprimitive +if (!hasOwn(DatePrototype, TO_PRIMITIVE)) { + defineBuiltIn(DatePrototype, TO_PRIMITIVE, dateToPrimitive); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.function.bind.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es.function.bind.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +// TODO: Remove from `core-js@4` +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/core-js/internals/function-bind.js"); + +// `Function.prototype.bind` method +// https://tc39.es/ecma262/#sec-function.prototype.bind +// eslint-disable-next-line es/no-function-prototype-bind -- detection +$({ target: 'Function', proto: true, forced: Function.bind !== bind }, { + bind: bind +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.json.stringify.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.json.stringify.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js/internals/function-apply.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js/internals/array-slice.js"); +var getReplacerFunction = __webpack_require__(/*! ../internals/get-json-replacer-function */ "./node_modules/core-js/internals/get-json-replacer-function.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js/internals/symbol-constructor-detection.js"); + +var $String = String; +var $stringify = getBuiltIn('JSON', 'stringify'); +var exec = uncurryThis(/./.exec); +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var replace = uncurryThis(''.replace); +var numberToString = uncurryThis(1.0.toString); + +var tester = /[\uD800-\uDFFF]/g; +var low = /^[\uD800-\uDBFF]$/; +var hi = /^[\uDC00-\uDFFF]$/; + +var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { + var symbol = getBuiltIn('Symbol')('stringify detection'); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) !== '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) !== '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) !== '{}'; +}); + +// https://github.com/tc39/proposal-well-formed-stringify +var ILL_FORMED_UNICODE = fails(function () { + return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' + || $stringify('\uDEAD') !== '"\\udead"'; +}); + +var stringifyWithSymbolsFix = function (it, replacer) { + var args = arraySlice(arguments); + var $replacer = getReplacerFunction(replacer); + if (!isCallable($replacer) && (it === undefined || isSymbol(it))) return; // IE8 returns string on undefined + args[1] = function (key, value) { + // some old implementations (like WebKit) could pass numbers as keys + if (isCallable($replacer)) value = call($replacer, this, $String(key), value); + if (!isSymbol(value)) return value; + }; + return apply($stringify, null, args); +}; + +var fixIllFormed = function (match, offset, string) { + var prev = charAt(string, offset - 1); + var next = charAt(string, offset + 1); + if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) { + return '\\u' + numberToString(charCodeAt(match, 0), 16); + } return match; +}; + +if ($stringify) { + // `JSON.stringify` method + // https://tc39.es/ecma262/#sec-json.stringify + $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + stringify: function stringify(it, replacer, space) { + var args = arraySlice(arguments); + var result = apply(WRONG_SYMBOLS_CONVERSION ? stringifyWithSymbolsFix : $stringify, null, args); + return ILL_FORMED_UNICODE && typeof result == 'string' ? replace(result, tester, fixIllFormed) : result; + } + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.number.constructor.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es.number.constructor.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f); +var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); +var thisNumberValue = __webpack_require__(/*! ../internals/this-number-value */ "./node_modules/core-js/internals/this-number-value.js"); +var trim = (__webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim); + +var NUMBER = 'Number'; +var NativeNumber = global[NUMBER]; +var PureNumberNamespace = path[NUMBER]; +var NumberPrototype = NativeNumber.prototype; +var TypeError = global.TypeError; +var stringSlice = uncurryThis(''.slice); +var charCodeAt = uncurryThis(''.charCodeAt); + +// `ToNumeric` abstract operation +// https://tc39.es/ecma262/#sec-tonumeric +var toNumeric = function (value) { + var primValue = toPrimitive(value, 'number'); + return typeof primValue == 'bigint' ? primValue : toNumber(primValue); +}; + +// `ToNumber` abstract operation +// https://tc39.es/ecma262/#sec-tonumber +var toNumber = function (argument) { + var it = toPrimitive(argument, 'number'); + var first, third, radix, maxCode, digits, length, index, code; + if (isSymbol(it)) throw new TypeError('Cannot convert a Symbol value to a number'); + if (typeof it == 'string' && it.length > 2) { + it = trim(it); + first = charCodeAt(it, 0); + if (first === 43 || first === 45) { + third = charCodeAt(it, 2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (charCodeAt(it, 1)) { + // fast equal of /^0b[01]+$/i + case 66: + case 98: + radix = 2; + maxCode = 49; + break; + // fast equal of /^0o[0-7]+$/i + case 79: + case 111: + radix = 8; + maxCode = 55; + break; + default: + return +it; + } + digits = stringSlice(it, 2); + length = digits.length; + for (index = 0; index < length; index++) { + code = charCodeAt(digits, index); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +var FORCED = isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1')); + +var calledWithNew = function (dummy) { + // includes check on 1..constructor(foo) case + return isPrototypeOf(NumberPrototype, dummy) && fails(function () { thisNumberValue(dummy); }); +}; + +// `Number` constructor +// https://tc39.es/ecma262/#sec-number-constructor +var NumberWrapper = function Number(value) { + var n = arguments.length < 1 ? 0 : NativeNumber(toNumeric(value)); + return calledWithNew(this) ? inheritIfRequired(Object(n), this, NumberWrapper) : n; +}; + +NumberWrapper.prototype = NumberPrototype; +if (FORCED && !IS_PURE) NumberPrototype.constructor = NumberWrapper; + +$({ global: true, constructor: true, wrap: true, forced: FORCED }, { + Number: NumberWrapper +}); + +// Use `internal/copy-constructor-properties` helper in `core-js@4` +var copyConstructorProperties = function (target, source) { + for (var keys = DESCRIPTORS ? getOwnPropertyNames(source) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES2015 (in case, if modules with ES2015 Number statics required before): + 'EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,' + + // ESNext + 'fromString,range' + ).split(','), j = 0, key; keys.length > j; j++) { + if (hasOwn(source, key = keys[j]) && !hasOwn(target, key)) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +if (IS_PURE && PureNumberNamespace) copyConstructorProperties(path[NUMBER], PureNumberNamespace); +if (FORCED || IS_PURE) copyConstructorProperties(path[NUMBER], NativeNumber); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.create.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.create.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +// TODO: Remove from `core-js@4` +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, { + create: create +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.define-property.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.define-property.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f); + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +// eslint-disable-next-line es/no-object-defineproperty -- safe +$({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProperty, sham: !DESCRIPTORS }, { + defineProperty: defineProperty +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.get-own-property-symbols.js": +/*!****************************************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.get-own-property-symbols.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js/internals/symbol-constructor-detection.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); + +// V8 ~ Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FORCED = !NATIVE_SYMBOL || fails(function () { getOwnPropertySymbolsModule.f(1); }); + +// `Object.getOwnPropertySymbols` method +// https://tc39.es/ecma262/#sec-object.getownpropertysymbols +$({ target: 'Object', stat: true, forced: FORCED }, { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + var $getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return $getOwnPropertySymbols ? $getOwnPropertySymbols(toObject(it)) : []; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.get-prototype-of.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.get-prototype-of.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); +var nativeGetPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js"); + +var FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); }); + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, { + getPrototypeOf: function getPrototypeOf(it) { + return nativeGetPrototypeOf(toObject(it)); + } +}); + + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.set-prototype-of.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.set-prototype-of.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +$({ target: 'Object', stat: true }, { + setPrototypeOf: setPrototypeOf +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.object.to-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es.object.to-string.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); +var toString = __webpack_require__(/*! ../internals/object-to-string */ "./node_modules/core-js/internals/object-to-string.js"); + +// `Object.prototype.toString` method +// https://tc39.es/ecma262/#sec-object.prototype.tostring +if (!TO_STRING_TAG_SUPPORT) { + defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.reflect.construct.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es.reflect.construct.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js/internals/function-apply.js"); +var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/core-js/internals/function-bind.js"); +var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "./node_modules/core-js/internals/a-constructor.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); + +var nativeConstruct = getBuiltIn('Reflect', 'construct'); +var ObjectPrototype = Object.prototype; +var push = [].push; + +// `Reflect.construct` method +// https://tc39.es/ecma262/#sec-reflect.construct +// MS Edge supports only 2 arguments and argumentsList argument is optional +// FF Nightly sets third argument as `new.target`, but does not create `this` from it +var NEW_TARGET_BUG = fails(function () { + function F() { /* empty */ } + return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F); +}); + +var ARGS_BUG = !fails(function () { + nativeConstruct(function () { /* empty */ }); +}); + +var FORCED = NEW_TARGET_BUG || ARGS_BUG; + +$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, { + construct: function construct(Target, args /* , newTarget */) { + aConstructor(Target); + anObject(args); + var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget); + if (Target === newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + apply(push, $args, args); + return new (apply(bind, Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = create(isObject(proto) ? proto : ObjectPrototype); + var result = apply(Target, instance, args); + return isObject(result) ? result : instance; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.string.iterator.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.string.iterator.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var charAt = (__webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt); +var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/iterator-define */ "./node_modules/core-js/internals/iterator-define.js"); +var createIterResultObject = __webpack_require__(/*! ../internals/create-iter-result-object */ "./node_modules/core-js/internals/create-iter-result-object.js"); + +var STRING_ITERATOR = 'String Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + +// `String.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-string.prototype-@@iterator +defineIterator(String, 'String', function (iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: toString(iterated), + index: 0 + }); +// `%StringIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return createIterResultObject(undefined, true); + point = charAt(string, index); + state.index += point.length; + return createIterResultObject(point, false); +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.constructor.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.constructor.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js/internals/function-call.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js/internals/symbol-constructor-detection.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js"); +var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); +var nativeObjectCreate = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertyNamesExternal = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); +var definePropertiesModule = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); +var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js/internals/define-built-in.js"); +var defineBuiltInAccessor = __webpack_require__(/*! ../internals/define-built-in-accessor */ "./node_modules/core-js/internals/define-built-in-accessor.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); +var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js"); +var defineWellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol-define */ "./node_modules/core-js/internals/well-known-symbol-define.js"); +var defineSymbolToPrimitive = __webpack_require__(/*! ../internals/symbol-define-to-primitive */ "./node_modules/core-js/internals/symbol-define-to-primitive.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); +var $forEach = (__webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach); + +var HIDDEN = sharedKey('hidden'); +var SYMBOL = 'Symbol'; +var PROTOTYPE = 'prototype'; + +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(SYMBOL); + +var ObjectPrototype = Object[PROTOTYPE]; +var $Symbol = global.Symbol; +var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE]; +var RangeError = global.RangeError; +var TypeError = global.TypeError; +var QObject = global.QObject; +var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; +var nativeDefineProperty = definePropertyModule.f; +var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; +var nativePropertyIsEnumerable = propertyIsEnumerableModule.f; +var push = uncurryThis([].push); + +var AllSymbols = shared('symbols'); +var ObjectPrototypeSymbols = shared('op-symbols'); +var WellKnownSymbolsStore = shared('wks'); + +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var fallbackDefineProperty = function (O, P, Attributes) { + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P); + if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; + nativeDefineProperty(O, P, Attributes); + if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { + nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor); + } +}; + +var setSymbolDescriptor = DESCRIPTORS && fails(function () { + return nativeObjectCreate(nativeDefineProperty({}, 'a', { + get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; } + })).a !== 7; +}) ? fallbackDefineProperty : nativeDefineProperty; + +var wrap = function (tag, description) { + var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype); + setInternalState(symbol, { + type: SYMBOL, + tag: tag, + description: description + }); + if (!DESCRIPTORS) symbol.description = description; + return symbol; +}; + +var $defineProperty = function defineProperty(O, P, Attributes) { + if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); + anObject(O); + var key = toPropertyKey(P); + anObject(Attributes); + if (hasOwn(AllSymbols, key)) { + if (!Attributes.enumerable) { + if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, nativeObjectCreate(null))); + O[HIDDEN][key] = true; + } else { + if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; + Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) }); + } return setSymbolDescriptor(O, key, Attributes); + } return nativeDefineProperty(O, key, Attributes); +}; + +var $defineProperties = function defineProperties(O, Properties) { + anObject(O); + var properties = toIndexedObject(Properties); + var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); + $forEach(keys, function (key) { + if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]); + }); + return O; +}; + +var $create = function create(O, Properties) { + return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties); +}; + +var $propertyIsEnumerable = function propertyIsEnumerable(V) { + var P = toPropertyKey(V); + var enumerable = call(nativePropertyIsEnumerable, this, P); + if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false; + return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P] + ? enumerable : true; +}; + +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { + var it = toIndexedObject(O); + var key = toPropertyKey(P); + if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return; + var descriptor = nativeGetOwnPropertyDescriptor(it, key); + if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) { + descriptor.enumerable = true; + } + return descriptor; +}; + +var $getOwnPropertyNames = function getOwnPropertyNames(O) { + var names = nativeGetOwnPropertyNames(toIndexedObject(O)); + var result = []; + $forEach(names, function (key) { + if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key); + }); + return result; +}; + +var $getOwnPropertySymbols = function (O) { + var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; + var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); + var result = []; + $forEach(names, function (key) { + if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) { + push(result, AllSymbols[key]); + } + }); + return result; +}; + +// `Symbol` constructor +// https://tc39.es/ecma262/#sec-symbol-constructor +if (!NATIVE_SYMBOL) { + $Symbol = function Symbol() { + if (isPrototypeOf(SymbolPrototype, this)) throw new TypeError('Symbol is not a constructor'); + var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); + var tag = uid(description); + var setter = function (value) { + var $this = this === undefined ? global : this; + if ($this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); + if (hasOwn($this, HIDDEN) && hasOwn($this[HIDDEN], tag)) $this[HIDDEN][tag] = false; + var descriptor = createPropertyDescriptor(1, value); + try { + setSymbolDescriptor($this, tag, descriptor); + } catch (error) { + if (!(error instanceof RangeError)) throw error; + fallbackDefineProperty($this, tag, descriptor); + } + }; + if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); + return wrap(tag, description); + }; + + SymbolPrototype = $Symbol[PROTOTYPE]; + + defineBuiltIn(SymbolPrototype, 'toString', function toString() { + return getInternalState(this).tag; + }); + + defineBuiltIn($Symbol, 'withoutSetter', function (description) { + return wrap(uid(description), description); + }); + + propertyIsEnumerableModule.f = $propertyIsEnumerable; + definePropertyModule.f = $defineProperty; + definePropertiesModule.f = $defineProperties; + getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor; + getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; + getOwnPropertySymbolsModule.f = $getOwnPropertySymbols; + + wrappedWellKnownSymbolModule.f = function (name) { + return wrap(wellKnownSymbol(name), name); + }; + + if (DESCRIPTORS) { + // https://github.com/tc39/proposal-Symbol-description + defineBuiltInAccessor(SymbolPrototype, 'description', { + configurable: true, + get: function description() { + return getInternalState(this).description; + } + }); + if (!IS_PURE) { + defineBuiltIn(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); + } + } +} + +$({ global: true, constructor: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { + Symbol: $Symbol +}); + +$forEach(objectKeys(WellKnownSymbolsStore), function (name) { + defineWellKnownSymbol(name); +}); + +$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, { + useSetter: function () { USE_SETTER = true; }, + useSimple: function () { USE_SETTER = false; } +}); + +$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, { + // `Object.create` method + // https://tc39.es/ecma262/#sec-object.create + create: $create, + // `Object.defineProperty` method + // https://tc39.es/ecma262/#sec-object.defineproperty + defineProperty: $defineProperty, + // `Object.defineProperties` method + // https://tc39.es/ecma262/#sec-object.defineproperties + defineProperties: $defineProperties, + // `Object.getOwnPropertyDescriptor` method + // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors + getOwnPropertyDescriptor: $getOwnPropertyDescriptor +}); + +$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, { + // `Object.getOwnPropertyNames` method + // https://tc39.es/ecma262/#sec-object.getownpropertynames + getOwnPropertyNames: $getOwnPropertyNames +}); + +// `Symbol.prototype[@@toPrimitive]` method +// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive +defineSymbolToPrimitive(); + +// `Symbol.prototype[@@toStringTag]` property +// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag +setToStringTag($Symbol, SYMBOL); + +hiddenKeys[HIDDEN] = true; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.description.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.description.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// `Symbol.prototype.description` getter +// https://tc39.es/ecma262/#sec-symbol.prototype.description + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "./node_modules/core-js/internals/object-is-prototype-of.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); +var defineBuiltInAccessor = __webpack_require__(/*! ../internals/define-built-in-accessor */ "./node_modules/core-js/internals/define-built-in-accessor.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); + +var NativeSymbol = global.Symbol; +var SymbolPrototype = NativeSymbol && NativeSymbol.prototype; + +if (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) || + // Safari 12 bug + NativeSymbol().description !== undefined +)) { + var EmptyStringDescriptionStore = {}; + // wrap Symbol constructor for correct work with undefined description + var SymbolWrapper = function Symbol() { + var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]); + var result = isPrototypeOf(SymbolPrototype, this) + ? new NativeSymbol(description) + // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' + : description === undefined ? NativeSymbol() : NativeSymbol(description); + if (description === '') EmptyStringDescriptionStore[result] = true; + return result; + }; + + copyConstructorProperties(SymbolWrapper, NativeSymbol); + SymbolWrapper.prototype = SymbolPrototype; + SymbolPrototype.constructor = SymbolWrapper; + + var NATIVE_SYMBOL = String(NativeSymbol('description detection')) === 'Symbol(description detection)'; + var thisSymbolValue = uncurryThis(SymbolPrototype.valueOf); + var symbolDescriptiveString = uncurryThis(SymbolPrototype.toString); + var regexp = /^Symbol\((.*)\)[^)]+$/; + var replace = uncurryThis(''.replace); + var stringSlice = uncurryThis(''.slice); + + defineBuiltInAccessor(SymbolPrototype, 'description', { + configurable: true, + get: function description() { + var symbol = thisSymbolValue(this); + if (hasOwn(EmptyStringDescriptionStore, symbol)) return ''; + var string = symbolDescriptiveString(symbol); + var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1'); + return desc === '' ? undefined : desc; + } + }); + + $({ global: true, constructor: true, forced: true }, { + Symbol: SymbolWrapper + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.for.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.for.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); +var NATIVE_SYMBOL_REGISTRY = __webpack_require__(/*! ../internals/symbol-registry-detection */ "./node_modules/core-js/internals/symbol-registry-detection.js"); + +var StringToSymbolRegistry = shared('string-to-symbol-registry'); +var SymbolToStringRegistry = shared('symbol-to-string-registry'); + +// `Symbol.for` method +// https://tc39.es/ecma262/#sec-symbol.for +$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, { + 'for': function (key) { + var string = toString(key); + if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; + var symbol = getBuiltIn('Symbol')(string); + StringToSymbolRegistry[string] = symbol; + SymbolToStringRegistry[symbol] = string; + return symbol; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.iterator.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.iterator.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var defineWellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol-define */ "./node_modules/core-js/internals/well-known-symbol-define.js"); + +// `Symbol.iterator` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.iterator +defineWellKnownSymbol('iterator'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +// TODO: Remove this module from `core-js@4` since it's split to modules listed below +__webpack_require__(/*! ../modules/es.symbol.constructor */ "./node_modules/core-js/modules/es.symbol.constructor.js"); +__webpack_require__(/*! ../modules/es.symbol.for */ "./node_modules/core-js/modules/es.symbol.for.js"); +__webpack_require__(/*! ../modules/es.symbol.key-for */ "./node_modules/core-js/modules/es.symbol.key-for.js"); +__webpack_require__(/*! ../modules/es.json.stringify */ "./node_modules/core-js/modules/es.json.stringify.js"); +__webpack_require__(/*! ../modules/es.object.get-own-property-symbols */ "./node_modules/core-js/modules/es.object.get-own-property-symbols.js"); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.key-for.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.key-for.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js/internals/has-own-property.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); +var NATIVE_SYMBOL_REGISTRY = __webpack_require__(/*! ../internals/symbol-registry-detection */ "./node_modules/core-js/internals/symbol-registry-detection.js"); + +var SymbolToStringRegistry = shared('symbol-to-string-registry'); + +// `Symbol.keyFor` method +// https://tc39.es/ecma262/#sec-symbol.keyfor +$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, { + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw new TypeError(tryToString(sym) + ' is not a symbol'); + if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es.symbol.to-primitive.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es.symbol.to-primitive.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var defineWellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol-define */ "./node_modules/core-js/internals/well-known-symbol-define.js"); +var defineSymbolToPrimitive = __webpack_require__(/*! ../internals/symbol-define-to-primitive */ "./node_modules/core-js/internals/symbol-define-to-primitive.js"); + +// `Symbol.toPrimitive` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.toprimitive +defineWellKnownSymbol('toPrimitive'); + +// `Symbol.prototype[@@toPrimitive]` method +// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive +defineSymbolToPrimitive(); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); +var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js"); +var DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ "./node_modules/core-js/internals/dom-token-list-prototype.js"); +var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayValues = ArrayIteratorMethods.values; + +var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) { + if (CollectionPrototype) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[ITERATOR] !== ArrayValues) try { + createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues); + } catch (error) { + CollectionPrototype[ITERATOR] = ArrayValues; + } + setToStringTag(CollectionPrototype, COLLECTION_NAME, true); + if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { + createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); + } catch (error) { + CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; + } + } + } +}; + +for (var COLLECTION_NAME in DOMIterables) { + handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME); +} + +handlePrototype(DOMTokenListPrototype, 'DOMTokenList'); + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__("./assets/app.js")); +/******/ } +]); \ No newline at end of file diff --git a/public/build/entrypoints.json b/public/build/entrypoints.json new file mode 100644 index 000000000..d6a57ee65 --- /dev/null +++ b/public/build/entrypoints.json @@ -0,0 +1,28 @@ +{ + "entrypoints": { + "welcome-page-css": { + "js": [ + "/build/runtime.js", + "/build/welcome-page-css.js" + ], + "css": [ + "/build/welcome-page-css.css" + ] + }, + "welcome-page-js": { + "js": [ + "/build/runtime.js", + "/build/welcome-page-js.js" + ] + }, + "app": { + "js": [ + "/build/runtime.js", + "/build/app.js" + ], + "css": [ + "/build/app.css" + ] + } + } +} \ No newline at end of file diff --git a/public/build/images/caret-down.svg b/public/build/images/caret-down.svg new file mode 100644 index 000000000..8ac6b1a9d --- /dev/null +++ b/public/build/images/caret-down.svg @@ -0,0 +1,4 @@ + +caret-down + + diff --git a/public/build/images/content.png b/public/build/images/content.png new file mode 100644 index 000000000..1d49c14e1 Binary files /dev/null and b/public/build/images/content.png differ diff --git a/public/build/images/development.svg b/public/build/images/development.svg new file mode 100644 index 000000000..503209ef8 --- /dev/null +++ b/public/build/images/development.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/build/images/documentation.svg b/public/build/images/documentation.svg new file mode 100644 index 000000000..c9948a761 --- /dev/null +++ b/public/build/images/documentation.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/build/images/experience.svg b/public/build/images/experience.svg new file mode 100644 index 000000000..9c9756370 --- /dev/null +++ b/public/build/images/experience.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/build/images/header-background.bc7e1aa9.png b/public/build/images/header-background.bc7e1aa9.png new file mode 100644 index 000000000..cae7e28f7 Binary files /dev/null and b/public/build/images/header-background.bc7e1aa9.png differ diff --git a/public/build/images/header-background.png b/public/build/images/header-background.png new file mode 100644 index 000000000..cae7e28f7 Binary files /dev/null and b/public/build/images/header-background.png differ diff --git a/public/build/images/oss.svg b/public/build/images/oss.svg new file mode 100644 index 000000000..47a588736 --- /dev/null +++ b/public/build/images/oss.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/build/images/php-api.svg b/public/build/images/php-api.svg new file mode 100644 index 000000000..d04a1beeb --- /dev/null +++ b/public/build/images/php-api.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/build/images/rest-api.svg b/public/build/images/rest-api.svg new file mode 100644 index 000000000..099fd0082 --- /dev/null +++ b/public/build/images/rest-api.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/build/images/support-background.db61c7b3.png b/public/build/images/support-background.db61c7b3.png new file mode 100644 index 000000000..67e10c595 Binary files /dev/null and b/public/build/images/support-background.db61c7b3.png differ diff --git a/public/build/images/support-background.png b/public/build/images/support-background.png new file mode 100644 index 000000000..67e10c595 Binary files /dev/null and b/public/build/images/support-background.png differ diff --git a/public/build/images/support.png b/public/build/images/support.png new file mode 100644 index 000000000..ed03b369e Binary files /dev/null and b/public/build/images/support.png differ diff --git a/public/build/images/training-background.854fda81.png b/public/build/images/training-background.854fda81.png new file mode 100644 index 000000000..dac433b9d Binary files /dev/null and b/public/build/images/training-background.854fda81.png differ diff --git a/public/build/images/training-background.png b/public/build/images/training-background.png new file mode 100644 index 000000000..dac433b9d Binary files /dev/null and b/public/build/images/training-background.png differ diff --git a/public/build/images/training.svg b/public/build/images/training.svg new file mode 100644 index 000000000..3ceedf1e5 --- /dev/null +++ b/public/build/images/training.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/build/images/tutorials-icon.svg b/public/build/images/tutorials-icon.svg new file mode 100644 index 000000000..763471c73 --- /dev/null +++ b/public/build/images/tutorials-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/build/images/tutorials.svg b/public/build/images/tutorials.svg new file mode 100644 index 000000000..a49f9f5cd --- /dev/null +++ b/public/build/images/tutorials.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/build/images/user.svg b/public/build/images/user.svg new file mode 100644 index 000000000..46eefebde --- /dev/null +++ b/public/build/images/user.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/build/manifest.json b/public/build/manifest.json new file mode 100644 index 000000000..32304f59a --- /dev/null +++ b/public/build/manifest.json @@ -0,0 +1,24 @@ +{ + "build/welcome-page-css.css": "/build/welcome-page-css.css", + "build/welcome-page-css.js": "/build/welcome-page-css.js", + "build/welcome-page-js.js": "/build/welcome-page-js.js", + "build/app.css": "/build/app.css", + "build/app.js": "/build/app.js", + "build/runtime.js": "/build/runtime.js", + "build/images/header-background.png": "/build/images/header-background.png", + "build/images/support-background.png": "/build/images/support-background.png", + "build/images/oss.svg": "/build/images/oss.svg", + "build/images/content.png": "/build/images/content.png", + "build/images/experience.svg": "/build/images/experience.svg", + "build/images/training-background.png": "/build/images/training-background.png", + "build/images/tutorials.svg": "/build/images/tutorials.svg", + "build/images/support.png": "/build/images/support.png", + "build/images/rest-api.svg": "/build/images/rest-api.svg", + "build/images/training.svg": "/build/images/training.svg", + "build/images/tutorials-icon.svg": "/build/images/tutorials-icon.svg", + "build/images/documentation.svg": "/build/images/documentation.svg", + "build/images/php-api.svg": "/build/images/php-api.svg", + "build/images/user.svg": "/build/images/user.svg", + "build/images/caret-down.svg": "/build/images/caret-down.svg", + "build/images/development.svg": "/build/images/development.svg" +} \ No newline at end of file diff --git a/public/build/runtime.js b/public/build/runtime.js new file mode 100644 index 000000000..0aefa1d70 --- /dev/null +++ b/public/build/runtime.js @@ -0,0 +1,179 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/build/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "runtime": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ +/******/ })() +; \ No newline at end of file diff --git a/public/build/welcome-page-css.css b/public/build/welcome-page-css.css new file mode 100644 index 000000000..ebbbdfbc4 --- /dev/null +++ b/public/build/welcome-page-css.css @@ -0,0 +1,735 @@ +/*!******************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf[1].use[1]!./assets/scss/normalize.css ***! + \******************************************************************************************************************/ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} + +/*!**********************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf[1].use[1]!./node_modules/resolve-url-loader/index.js??ruleSet[1].rules[4].oneOf[1].use[2]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf[1].use[3]!./assets/scss/welcome-page.scss ***! + \**********************************************************************************************************************************************************************************************************************************************************************************/ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + position: relative; + min-height: 100%; +} + +body { + font-size: 16px; + line-height: 24px; + letter-spacing: 0.12px; + color: #131c26; + overflow-x: hidden; + font-family: "Noto Sans", sans-serif; + font-weight: 400; + font-style: normal; +} + +.logo { + max-width: 117px; + max-height: 33px; +} + +.ibexa-welcome-container { + max-width: 1170px; + margin: 0 auto; +} + +.ibexa-welcome-blocks { + margin-top: 32px; +} + +.ibexa-welcome-row { + display: flex; +} + +.ibexa-welcome-column { + display: flex; + flex: 1; + flex-direction: column; + align-items: flex-start; +} +.ibexa-welcome-column + .ibexa-welcome-column { + margin-left: 30px; +} +.ibexa-welcome-column--center { + align-items: center; + text-align: center; +} + +.ibexa-welcome-section-header { + font-size: 48px; + line-height: 72px; + font-family: "Work Sans", sans-serif; + font-weight: 600; + letter-spacing: 0.27px; + margin: 72px 0 24px; +} + +.ibexa-welcome-block-header { + font-size: 22px; + line-height: 36px; + font-family: "Work Sans", sans-serif; + font-weight: 600; + margin: 14px 0 20px; +} + +.ibexa-welcome-circle { + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.ibexa-welcome-paragraph { + margin-bottom: 20px; +} + +.ibexa-welcome-btn { + display: inline-flex; + justify-content: center; + align-items: center; + white-space: nowrap; + outline: none; + font-weight: 600; + font-size: 14px; + line-height: 21px; + padding: 14px 16px; + border-width: 1px; + border-style: solid; + border-radius: 10px; + color: #ae1164; + cursor: pointer; + text-decoration: none; + transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); +} +.ibexa-welcome-btn:hover { + border-color: #131c26; + color: #131c26; +} +.ibexa-welcome-btn--filled { + color: #ffffff; + fill: #ffffff; + border-width: 0; + background: linear-gradient(to right, #db0032 0%, #ae1164 100%); +} +.ibexa-welcome-btn--filled:hover { + color: #ffffff; + box-shadow: 0 0 0 transparent, 0 22px 24px 0 rgba(219, 0, 50, 0.2); +} + +.ibexa-welcome-link { + text-decoration: underline; + color: #131c26; + font-weight: 600; + font-size: 14px; + line-height: 21px; +} + +.ibexa-welcome-img { + display: inline-flex; + flex: 1; +} +.ibexa-welcome-img--center { + align-self: center; +} +.ibexa-welcome-img--right { + align-self: flex-end; +} + +@media only screen and (max-width: 1200px) { + .ibexa-welcome-container { + padding-left: 32px; + padding-right: 32px; + } +} +@media only screen and (max-width: 768px) { + .ibexa-welcome-row { + flex-direction: column; + } + .ibexa-welcome-img { + display: none; + } + .ibexa-welcome-column + .ibexa-welcome-column { + margin-top: 30px; + margin-left: 0; + } +} +.ibexa-welcome-header { + height: 100vh; + min-height: 820px; + background-image: url(/build/images/header-background.bc7e1aa9.png); + background-size: cover; + color: #ffffff; + position: relative; +} +.ibexa-welcome-header__logo { + margin-top: 40px; +} +.ibexa-welcome-header__go-down { + background: none; + border: 0; + outline: none; + fill: #ffffff; + position: absolute; + bottom: 50px; + left: calc(50% - 22px); + cursor: pointer; +} +.ibexa-welcome-header .ibexa-welcome-section-header { + font-size: 60px; + line-height: 82px; + margin: 200px 0 40px; +} +.ibexa-welcome-header .ibexa-welcome-paragraph { + font-size: 22px; + line-height: 36px; + font-weight: 600; + margin: 0 0 40px 0; +} +.ibexa-welcome-header .ibexa-welcome-img { + margin-top: 150px; + margin-right: -300px; +} +.ibexa-welcome-header .ibexa-welcome-btn + .ibexa-welcome-btn { + margin-left: 24px; +} + +@media only screen and (max-width: 1700px) { + .ibexa-welcome-header .ibexa-welcome-img { + width: 100%; + margin-right: 0; + } +} +@media only screen and (max-width: 1200px) { + .ibexa-welcome-header__img-column { + display: none; + } +} +@media only screen and (max-width: 600px) { + .ibexa-welcome-header .ibexa-welcome-section-header { + font-size: 48px; + line-height: 72px; + margin-top: 100px; + } +} +@media only screen and (max-width: 1700px) { + .ibexa-welcome-header .ibexa-welcome-img { + width: 100%; + margin-right: 0; + } +} +@media only screen and (max-width: 1200px) { + .ibexa-welcome-header__img-column { + display: none; + } +} +@media only screen and (max-width: 600px) { + .ibexa-welcome-header .ibexa-welcome-section-header { + font-size: 48px; + line-height: 72px; + margin-top: 100px; + } +} +.ibexa-welcome-documentation-hub .ibexa-welcome-circle { + margin: 16px; + width: 96px; + height: 96px; + background: radial-gradient(35.33% 35.33% at 32.17% 6.51%, rgba(220, 2, 61, 0.1) 0%, rgba(202, 11, 63, 0.00001) 100%), #e0e0e8; +} +.ibexa-welcome-documentation-hub .ibexa-welcome-btn { + margin: auto 0 0; +} + +.ibexa-welcome-tutorials-and-resources__subheader { + max-width: 500px; + font-weight: 600; +} +.ibexa-welcome-tutorials-and-resources__block { + background-color: #f9f9fa; + padding: 30px 22px 16px 48px; + border-radius: 10px; +} +.ibexa-welcome-tutorials-and-resources__block .ibexa-welcome-paragraph { + margin: 0 0 40px 0; +} +.ibexa-welcome-tutorials-and-resources__block .ibexa-welcome-link { + margin: auto 0 0 auto; +} +.ibexa-welcome-tutorials-and-resources__block .ibexa-welcome-circle { + width: 54px; + height: 54px; + background: #ffffff; +} +.ibexa-welcome-tutorials-and-resources__block--get-started { + padding: 50px 60px; + margin: 76px 0 25px; +} +.ibexa-welcome-tutorials-and-resources__block--get-started .ibexa-welcome-block-header { + font-size: 28px; + line-height: 42px; + margin: 0 0 8px; +} +.ibexa-welcome-tutorials-and-resources__block--get-started .ibexa-welcome-link { + margin-left: 0; +} +.ibexa-welcome-tutorials-and-resources__block--get-started .ibexa-welcome-img { + margin-top: -130px; + margin-right: -25px; +} +.ibexa-welcome-tutorials-and-resources__block--tutorials { + flex-basis: 25%; +} +.ibexa-welcome-tutorials-and-resources__block--rest-api { + flex-basis: 42%; +} +.ibexa-welcome-tutorials-and-resources__block--php-api { + flex-basis: 33%; +} + +@media only screen and (max-width: 1200px) { + .ibexa-welcome-tutorials-and-resources__img-column { + display: none; + } +} +@media only screen and (max-width: 768px) { + .ibexa-welcome-tutorials-and-resources__block { + padding: 30px 22px 16px 48px; + } + .ibexa-welcome-tutorials-and-resources__block--get-started .ibexa-welcome-link { + margin-left: auto; + } +} +.ibexa-welcome-training-platform__block { + background: center url(/build/images/training-background.854fda81.png); + background-size: cover; + border-radius: 10px; + max-height: 286px; + margin: 50px 0; + padding: 50px 60px; + color: #ffffff; +} +.ibexa-welcome-training-platform__img-column { + flex: 0; +} +.ibexa-welcome-training-platform .ibexa-welcome-column { + align-items: center; +} +.ibexa-welcome-training-platform .ibexa-welcome-block-header { + font-size: 28px; + line-height: 42px; + margin: 0 0 8px; +} +.ibexa-welcome-training-platform .ibexa-welcome-paragraph { + margin: 0 0 40px 0; +} + +@media only screen and (max-width: 900px) { + .ibexa-welcome-training-platform__img-column { + display: none; + } +} +@media only screen and (max-width: 768px) { + .ibexa-welcome-training-platform__block { + padding-top: 32px; + padding-bottom: 32px; + max-height: 100%; + } + .ibexa-welcome-training-platform__img-column { + display: none; + } + .ibexa-welcome-training-platform .ibexa-welcome-column { + margin-top: 0; + } +} +.ibexa-welcome-contact { + background-image: url(/build/images/support-background.db61c7b3.png); +} +.ibexa-welcome-contact__block { + padding: 23px 0 38px; +} +.ibexa-welcome-contact .ibexa-welcome-block-header { + font-size: 28px; + line-height: 42px; + margin: 60px 0 8px; +} +.ibexa-welcome-contact .ibexa-welcome-paragraph { + margin: 0 0 40px 0; +} +.ibexa-welcome-contact .ibexa-welcome-btn { + margin: 0 0 40px 0; +} + +@media only screen and (max-width: 768px) { + .ibexa-welcome-contact .ibexa-welcome-block-header { + margin-top: 0; + } + .ibexa-welcome-contact .ibexa-welcome-column { + margin-top: 0; + } + .ibexa-welcome-contact .ibexa-welcome-btn { + margin-bottom: 0; + } +} +.ibexa-welcome-footer { + background-color: #0b1117; +} +.ibexa-welcome-footer .ibexa-welcome-paragraph { + margin: 18px 0; + color: #ffffff; + font-weight: 700; +} +.ibexa-welcome-footer .ibexa-welcome-paragraph a { + color: #ffffff; +} diff --git a/public/build/welcome-page-css.js b/public/build/welcome-page-css.js new file mode 100644 index 000000000..9e6eb3290 --- /dev/null +++ b/public/build/welcome-page-css.js @@ -0,0 +1,21 @@ +"use strict"; +(self["webpackChunk"] = self["webpackChunk"] || []).push([["welcome-page-css"],{ + +/***/ "./assets/scss/welcome-page.scss": +/*!***************************************!*\ + !*** ./assets/scss/welcome-page.scss ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__("./assets/scss/welcome-page.scss")); +/******/ } +]); \ No newline at end of file diff --git a/public/build/welcome-page-js.js b/public/build/welcome-page-js.js new file mode 100644 index 000000000..5ebca4ec9 --- /dev/null +++ b/public/build/welcome-page-js.js @@ -0,0 +1,27 @@ +(self["webpackChunk"] = self["webpackChunk"] || []).push([["welcome-page-js"],{ + +/***/ "./assets/js/welcome.page.js": +/*!***********************************!*\ + !*** ./assets/js/welcome.page.js ***! + \***********************************/ +/***/ (() => { + +(function (global, doc) { + var btnDown = doc.querySelector('.ibexa-welcome-header__go-down'); + btnDown.addEventListener('click', function () { + var header = doc.querySelector('.ibexa-welcome-header'); + global.scrollTo({ + top: header.offsetHeight, + behavior: 'smooth' + }); + }); +})(window, document); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__("./assets/js/welcome.page.js")); +/******/ } +]); \ No newline at end of file diff --git a/public/bundles/babdevpagerfanta/css/pagerfantaDefault.css b/public/bundles/babdevpagerfanta/css/pagerfantaDefault.css new file mode 100644 index 000000000..c4b9be940 --- /dev/null +++ b/public/bundles/babdevpagerfanta/css/pagerfantaDefault.css @@ -0,0 +1,56 @@ +.pagerfanta { +} + +.pagerfanta a, +.pagerfanta span { + display: inline-block; + border: 1px solid blue; + color: blue; + margin-right: .2em; + padding: .25em .35em; +} + +.pagerfanta a { + text-decoration: none; +} + +.pagerfanta a:hover { + background: #ccf; +} + +.pagerfanta .dots { + border-width: 0; +} + +.pagerfanta .current { + background: #ccf; + font-weight: bold; +} + +.pagerfanta .disabled { + border-color: #ccf; + color: #ccf; +} + +/* + +.pagerfanta a, +.pagerfanta span { + border-color: blue; + color: blue; +} + +.pagerfanta a:hover { + background: #ccf; +} + +.pagerfanta .current { + background: #ccf; +} + +.pagerfanta .disabled { + border-color: #ccf; + color: #cf; +} + +*/ diff --git a/public/bundles/bazingajstranslation/js/translator.min.js b/public/bundles/bazingajstranslation/js/translator.min.js new file mode 100644 index 000000000..82a95eca3 --- /dev/null +++ b/public/bundles/bazingajstranslation/js/translator.min.js @@ -0,0 +1,5 @@ +/** + * @author William DURAND + * @license MIT Licensed + */ +!function(e,a){"object"==typeof module&&module.exports?module.exports=a(require("intl-messageformat")):"function"==typeof define&&define.amd?define(["intl-messageformat"],a):e.Translator=a(e.IntlMessageFormat)}(this,function(e){"use strict";function a(e,a){var s,t=g.placeHolderPrefix,n=g.placeHolderSuffix;for(s in a){var r=new RegExp(t+s+n,"g");if(r.test(e)){var c=String(a[s]).replace(new RegExp("\\$","g"),"$$$$");e=e.replace(r,c)}}return e}function s(e,a,s,n,r,c){var i=s||n||r,l=a,u=c||{},d=i.split("_")[0];if(u.isICU=!1,!(i in o))if(d in o)i=d;else{if(!(r in o))return e;i=r}if(void 0===l||null===l)for(var h=0;h2&&(m=i.length,g=i.split(/[\s_]+/),b=g[g.length-1],v=b.length,1!==g.length);)if(i=i.substring(0,m-(v+1)),t(i,l,e))return o[i][l][e];return t(r,l,e)?o[r][l][e]:e}function t(e,a,s){return e in o&&(a in o[e]&&s in o[e][a])}function n(e,a,s){var t,n,i=[],l=[],o=e.split(g.pluralSeparator),u=[];for(t=0;t=v:a>v)&&("]"===u[6]?a<=I:a3&&(s=s.split("_")[0]),s){case"bo":case"dz":case"id":case"ja":case"jv":case"ka":case"km":case"kn":case"ko":case"ms":case"th":case"tr":case"vi":case"zh":return 0;case"af":case"az":case"bn":case"bg":case"ca":case"da":case"de":case"el":case"en":case"eo":case"es":case"et":case"eu":case"fa":case"fi":case"fo":case"fur":case"fy":case"gl":case"gu":case"ha":case"he":case"hu":case"is":case"it":case"ku":case"lb":case"ml":case"mn":case"mr":case"nah":case"nb":case"ne":case"nl":case"nn":case"no":case"om":case"or":case"pa":case"pap":case"ps":case"pt":case"so":case"sq":case"sv":case"sw":case"ta":case"te":case"tk":case"ur":case"zu":return 1==e?0:1;case"am":case"bh":case"fil":case"fr":case"gun":case"hi":case"ln":case"mg":case"nso":case"xbr":case"ti":case"wa":return 0===e||1==e?0:1;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2;case"cs":case"sk":return 1==e?0:e>=2&&e<=4?1:2;case"ga":return 1==e?0:2==e?1:2;case"lt":return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2;case"sl":return e%100==1?0:e%100==2?1:e%100==3||e%100==4?2:3;case"mk":return e%10==1?0:1;case"mt":return 1==e?0:0===e||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3;case"lv":return 0===e?0:e%10==1&&e%100!=11?1:2;case"pl":return 1==e?0:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?1:2;case"cy":return 1==e?0:2==e?1:8==e||11==e?2:3;case"ro":return 1==e?0:0===e||e%100>0&&e%100<20?1:2;case"ar":return 0===e?0:1==e?1:2==e?2:e>=3&&e<=10?3:e>=11&&e<=99?4:5;default:return 0}}function i(e,a){for(var s=0;s=} routes + */ + function Router(context, routes) { + _classCallCheck(this, Router); + + this.context_ = context || { base_url: '', prefix: '', host: '', port: '', scheme: '', locale: '' }; + this.setRoutes(routes || {}); + } + + /** + * Returns the current instance. + * @returns {Router} + */ + + + _createClass(Router, [{ + key: 'setRoutingData', + + + /** + * Sets data for the current instance + * @param {Object} data + */ + value: function setRoutingData(data) { + this.setBaseUrl(data['base_url']); + this.setRoutes(data['routes']); + + if ('prefix' in data) { + this.setPrefix(data['prefix']); + } + if ('port' in data) { + this.setPort(data['port']); + } + if ('locale' in data) { + this.setLocale(data['locale']); + } + + this.setHost(data['host']); + this.setScheme(data['scheme']); + } + + /** + * @param {Object.} routes + */ + + }, { + key: 'setRoutes', + value: function setRoutes(routes) { + this.routes_ = Object.freeze(routes); + } + + /** + * @return {Object.} routes + */ + + }, { + key: 'getRoutes', + value: function getRoutes() { + return this.routes_; + } + + /** + * @param {string} baseUrl + */ + + }, { + key: 'setBaseUrl', + value: function setBaseUrl(baseUrl) { + this.context_.base_url = baseUrl; + } + + /** + * @return {string} + */ + + }, { + key: 'getBaseUrl', + value: function getBaseUrl() { + return this.context_.base_url; + } + + /** + * @param {string} prefix + */ + + }, { + key: 'setPrefix', + value: function setPrefix(prefix) { + this.context_.prefix = prefix; + } + + /** + * @param {string} scheme + */ + + }, { + key: 'setScheme', + value: function setScheme(scheme) { + this.context_.scheme = scheme; + } + + /** + * @return {string} + */ + + }, { + key: 'getScheme', + value: function getScheme() { + return this.context_.scheme; + } + + /** + * @param {string} host + */ + + }, { + key: 'setHost', + value: function setHost(host) { + this.context_.host = host; + } + + /** + * @return {string} + */ + + }, { + key: 'getHost', + value: function getHost() { + return this.context_.host; + } + + /** + * @param {string} port + */ + + }, { + key: 'setPort', + value: function setPort(port) { + this.context_.port = port; + } + + /** + * @return {string} + */ + + }, { + key: 'getPort', + value: function getPort() { + return this.context_.port; + } + }, { + key: 'setLocale', + + + /** + * @param {string} locale + */ + value: function setLocale(locale) { + this.context_.locale = locale; + } + + /** + * @return {string} + */ + + }, { + key: 'getLocale', + value: function getLocale() { + return this.context_.locale; + } + }, { + key: 'buildQueryParams', + + + /** + * Builds query string params added to a URL. + * Port of jQuery's $.param() function, so credit is due there. + * + * @param {string} prefix + * @param {Array|Object|string} params + * @param {Function} add + */ + value: function buildQueryParams(prefix, params, add) { + var _this = this; + + var name = void 0; + var rbracket = new RegExp(/\[\]$/); + + if (params instanceof Array) { + params.forEach(function (val, i) { + if (rbracket.test(prefix)) { + add(prefix, val); + } else { + _this.buildQueryParams(prefix + '[' + ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' ? i : '') + ']', val, add); + } + }); + } else if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) === 'object') { + for (name in params) { + this.buildQueryParams(prefix + '[' + name + ']', params[name], add); + } + } else { + add(prefix, params); + } + } + + /** + * Returns a raw route object. + * + * @param {string} name + * @return {Router.Route} + */ + + }, { + key: 'getRoute', + value: function getRoute(name) { + var prefixedName = this.context_.prefix + name; + var sf41i18nName = name + '.' + this.context_.locale; + var prefixedSf41i18nName = this.context_.prefix + name + '.' + this.context_.locale; + var variants = [prefixedName, sf41i18nName, prefixedSf41i18nName, name]; + + for (var i in variants) { + if (variants[i] in this.routes_) { + return this.routes_[variants[i]]; + } + } + + throw new Error('The route "' + name + '" does not exist.'); + } + + /** + * Generates the URL for a route. + * + * @param {string} name + * @param {Object.} opt_params + * @param {boolean} absolute + * @return {string} + */ + + }, { + key: 'generate', + value: function generate(name, opt_params) { + var absolute = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var route = this.getRoute(name), + params = opt_params || {}, + unusedParams = _extends({}, params), + url = '', + optional = true, + host = '', + port = typeof this.getPort() == "undefined" || this.getPort() === null ? '' : this.getPort(); + + route.tokens.forEach(function (token) { + if ('text' === token[0]) { + url = Router.encodePathComponent(token[1]) + url; + optional = false; + + return; + } + + if ('variable' === token[0]) { + var hasDefault = route.defaults && token[3] in route.defaults; + if (false === optional || !hasDefault || token[3] in params && params[token[3]] != route.defaults[token[3]]) { + var value = void 0; + + if (token[3] in params) { + value = params[token[3]]; + delete unusedParams[token[3]]; + } else if (hasDefault) { + value = route.defaults[token[3]]; + } else if (optional) { + return; + } else { + throw new Error('The route "' + name + '" requires the parameter "' + token[3] + '".'); + } + + var empty = true === value || false === value || '' === value; + + if (!empty || !optional) { + var encodedValue = Router.encodePathComponent(value); + + if ('null' === encodedValue && null === value) { + encodedValue = ''; + } + + url = token[1] + encodedValue + url; + } + + optional = false; + } else if (hasDefault && token[3] in unusedParams) { + delete unusedParams[token[3]]; + } + + return; + } + + throw new Error('The token type "' + token[0] + '" is not supported.'); + }); + + if (url === '') { + url = '/'; + } + + route.hosttokens.forEach(function (token) { + var value = void 0; + + if ('text' === token[0]) { + host = token[1] + host; + + return; + } + + if ('variable' === token[0]) { + if (token[3] in params) { + value = params[token[3]]; + delete unusedParams[token[3]]; + } else if (route.defaults && token[3] in route.defaults) { + value = route.defaults[token[3]]; + } + + host = token[1] + value + host; + } + }); + // Foo-bar! + url = this.context_.base_url + url; + + if (route.requirements && "_scheme" in route.requirements && this.getScheme() != route.requirements["_scheme"]) { + var currentHost = host || this.getHost(); + + url = route.requirements["_scheme"] + "://" + currentHost + (currentHost.indexOf(':' + port) > -1 || '' === port ? '' : ':' + port) + url; + } else if ("undefined" !== typeof route.schemes && "undefined" !== typeof route.schemes[0] && this.getScheme() !== route.schemes[0]) { + var _currentHost = host || this.getHost(); + + url = route.schemes[0] + "://" + _currentHost + (_currentHost.indexOf(':' + port) > -1 || '' === port ? '' : ':' + port) + url; + } else if (host && this.getHost() !== host + (host.indexOf(':' + port) > -1 || '' === port ? '' : ':' + port)) { + url = this.getScheme() + "://" + host + (host.indexOf(':' + port) > -1 || '' === port ? '' : ':' + port) + url; + } else if (absolute === true) { + url = this.getScheme() + "://" + this.getHost() + (this.getHost().indexOf(':' + port) > -1 || '' === port ? '' : ':' + port) + url; + } + + if (Object.keys(unusedParams).length > 0) { + var prefix = void 0; + var queryParams = []; + var add = function add(key, value) { + // if value is a function then call it and assign it's return value as value + value = typeof value === 'function' ? value() : value; + + // change null to empty string + value = value === null ? '' : value; + + queryParams.push(Router.encodeQueryComponent(key) + '=' + Router.encodeQueryComponent(value)); + }; + + for (prefix in unusedParams) { + this.buildQueryParams(prefix, unusedParams[prefix], add); + } + + url = url + '?' + queryParams.join('&'); + } + + return url; + } + + /** + * Returns the given string encoded to mimic Symfony URL generator. + * + * @param {string} value + * @return {string} + */ + + }], [{ + key: 'getInstance', + value: function getInstance() { + return Routing; + } + + /** + * Configures the current Router instance with the provided data. + * @param {Object} data + */ + + }, { + key: 'setData', + value: function setData(data) { + var router = Router.getInstance(); + + router.setRoutingData(data); + } + }, { + key: 'customEncodeURIComponent', + value: function customEncodeURIComponent(value) { + return encodeURIComponent(value).replace(/%2F/g, '/').replace(/%40/g, '@').replace(/%3A/g, ':').replace(/%21/g, '!').replace(/%3B/g, ';').replace(/%2C/g, ',').replace(/%2A/g, '*').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/'/g, '%27'); + } + + /** + * Returns the given path properly encoded to mimic Symfony URL generator. + * + * @param {string} value + * @return {string} + */ + + }, { + key: 'encodePathComponent', + value: function encodePathComponent(value) { + return Router.customEncodeURIComponent(value).replace(/%3D/g, '=').replace(/%2B/g, '+').replace(/%21/g, '!').replace(/%7C/g, '|'); + } + + /** + * Returns the given query parameter or value properly encoded to mimic Symfony URL generator. + * + * @param {string} value + * @return {string} + */ + + }, { + key: 'encodeQueryComponent', + value: function encodeQueryComponent(value) { + return Router.customEncodeURIComponent(value).replace(/%3F/g, '?'); + } + }]); + + return Router; +}(); + +/** + * @typedef {{ + * tokens: (Array.>), + * defaults: (Object.), + * requirements: Object, + * hosttokens: (Array.) + * }} + */ + + +Router.Route; + +/** + * @typedef {{ + * base_url: (string) + * }} + */ +Router.Context; + +/** + * Router singleton. + * @const + * @type {Router} + */ +var Routing = new Router(); + + return { Router: Router, Routing: Routing }; +})); \ No newline at end of file diff --git a/public/bundles/fosjsrouting/js/router.min.js b/public/bundles/fosjsrouting/js/router.min.js new file mode 100644 index 000000000..0b97ba8b6 --- /dev/null +++ b/public/bundles/fosjsrouting/js/router.min.js @@ -0,0 +1 @@ +!function(e,t){var n=t();"function"==typeof define&&define.amd?define([],n.Routing):"object"==typeof module&&module.exports?module.exports=n.Routing:(e.Routing=n.Routing,e.fos={Router:n.Router})}(this,function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=Object.assign||function(e){for(var t=1;t2&&void 0!==arguments[2]&&arguments[2],i=this.getRoute(e),u=n||{},s=t({},u),c="",a=!0,l="",f="undefined"==typeof this.getPort()||null===this.getPort()?"":this.getPort();if(i.tokens.forEach(function(t){if("text"===t[0])return c=r.encodePathComponent(t[1])+c,void(a=!1);{if("variable"!==t[0])throw new Error('The token type "'+t[0]+'" is not supported.');var n=i.defaults&&t[3]in i.defaults;if(!1===a||!n||t[3]in u&&u[t[3]]!=i.defaults[t[3]]){var o=void 0;if(t[3]in u)o=u[t[3]],delete s[t[3]];else{if(!n){if(a)return;throw new Error('The route "'+e+'" requires the parameter "'+t[3]+'".')}o=i.defaults[t[3]]}var l=!0===o||!1===o||""===o;if(!l||!a){var f=r.encodePathComponent(o);"null"===f&&null===o&&(f=""),c=t[1]+f+c}a=!1}else n&&t[3]in s&&delete s[t[3]]}}),""===c&&(c="/"),i.hosttokens.forEach(function(e){var t=void 0;return"text"===e[0]?void(l=e[1]+l):void("variable"===e[0]&&(e[3]in u?(t=u[e[3]],delete s[e[3]]):i.defaults&&e[3]in i.defaults&&(t=i.defaults[e[3]]),l=e[1]+t+l))}),c=this.context_.base_url+c,i.requirements&&"_scheme"in i.requirements&&this.getScheme()!=i.requirements._scheme){var h=l||this.getHost();c=i.requirements._scheme+"://"+h+(h.indexOf(":"+f)>-1||""===f?"":":"+f)+c}else if("undefined"!=typeof i.schemes&&"undefined"!=typeof i.schemes[0]&&this.getScheme()!==i.schemes[0]){var p=l||this.getHost();c=i.schemes[0]+"://"+p+(p.indexOf(":"+f)>-1||""===f?"":":"+f)+c}else l&&this.getHost()!==l+(l.indexOf(":"+f)>-1||""===f?"":":"+f)?c=this.getScheme()+"://"+l+(l.indexOf(":"+f)>-1||""===f?"":":"+f)+c:o===!0&&(c=this.getScheme()+"://"+this.getHost()+(this.getHost().indexOf(":"+f)>-1||""===f?"":":"+f)+c);if(Object.keys(s).length>0){var d=void 0,y=[],v=function(e,t){t="function"==typeof t?t():t,t=null===t?"":t,y.push(r.encodeQueryComponent(e)+"="+r.encodeQueryComponent(t))};for(d in s)this.buildQueryParams(d,s[d],v);c=c+"?"+y.join("&")}return c}}],[{key:"getInstance",value:function(){return i}},{key:"setData",value:function(e){var t=r.getInstance();t.setRoutingData(e)}},{key:"customEncodeURIComponent",value:function(e){return encodeURIComponent(e).replace(/%2F/g,"/").replace(/%40/g,"@").replace(/%3A/g,":").replace(/%21/g,"!").replace(/%3B/g,";").replace(/%2C/g,",").replace(/%2A/g,"*").replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/'/g,"%27")}},{key:"encodePathComponent",value:function(e){return r.customEncodeURIComponent(e).replace(/%3D/g,"=").replace(/%2B/g,"+").replace(/%21/g,"!").replace(/%7C/g,"|")}},{key:"encodeQueryComponent",value:function(e){return r.customEncodeURIComponent(e).replace(/%3F/g,"?")}}]),r}();r.Route,r.Context;var i=new r;return{Router:r,Routing:i}}); \ No newline at end of file diff --git a/public/bundles/ibexaadminui/font/NotoSans-Bold.ttf b/public/bundles/ibexaadminui/font/NotoSans-Bold.ttf new file mode 100644 index 000000000..d84248ed1 Binary files /dev/null and b/public/bundles/ibexaadminui/font/NotoSans-Bold.ttf differ diff --git a/public/bundles/ibexaadminui/font/NotoSans-BoldItalic.ttf b/public/bundles/ibexaadminui/font/NotoSans-BoldItalic.ttf new file mode 100644 index 000000000..3a34c4c34 Binary files /dev/null and b/public/bundles/ibexaadminui/font/NotoSans-BoldItalic.ttf differ diff --git a/public/bundles/ibexaadminui/font/NotoSans-Italic.ttf b/public/bundles/ibexaadminui/font/NotoSans-Italic.ttf new file mode 100644 index 000000000..c40c3562c Binary files /dev/null and b/public/bundles/ibexaadminui/font/NotoSans-Italic.ttf differ diff --git a/public/bundles/ibexaadminui/font/NotoSans-Regular.ttf b/public/bundles/ibexaadminui/font/NotoSans-Regular.ttf new file mode 100644 index 000000000..fa4cff505 Binary files /dev/null and b/public/bundles/ibexaadminui/font/NotoSans-Regular.ttf differ diff --git a/public/bundles/ibexaadminui/font/NotoSans-SemiBold.ttf b/public/bundles/ibexaadminui/font/NotoSans-SemiBold.ttf new file mode 100644 index 000000000..d3ed423e1 Binary files /dev/null and b/public/bundles/ibexaadminui/font/NotoSans-SemiBold.ttf differ diff --git a/public/bundles/ibexaadminui/font/NotoSans-SemiBoldItalic.ttf b/public/bundles/ibexaadminui/font/NotoSans-SemiBoldItalic.ttf new file mode 100644 index 000000000..c83e750e2 Binary files /dev/null and b/public/bundles/ibexaadminui/font/NotoSans-SemiBoldItalic.ttf differ diff --git a/public/bundles/ibexaadminui/font/WorkSans-SemiBold.ttf b/public/bundles/ibexaadminui/font/WorkSans-SemiBold.ttf new file mode 100644 index 000000000..3ef9f833a Binary files /dev/null and b/public/bundles/ibexaadminui/font/WorkSans-SemiBold.ttf differ diff --git a/public/bundles/ibexaadminui/img/_favicon.ico b/public/bundles/ibexaadminui/img/_favicon.ico new file mode 100644 index 000000000..16bdc633a Binary files /dev/null and b/public/bundles/ibexaadminui/img/_favicon.ico differ diff --git a/public/bundles/ibexaadminui/img/default-profile-picture.png b/public/bundles/ibexaadminui/img/default-profile-picture.png new file mode 100644 index 000000000..7852b952e Binary files /dev/null and b/public/bundles/ibexaadminui/img/default-profile-picture.png differ diff --git a/public/bundles/ibexaadminui/img/down.svg b/public/bundles/ibexaadminui/img/down.svg new file mode 100644 index 000000000..31133e26b --- /dev/null +++ b/public/bundles/ibexaadminui/img/down.svg @@ -0,0 +1,11 @@ + + + icon/sort/down + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/empty-field-definition-group.svg b/public/bundles/ibexaadminui/img/empty-field-definition-group.svg new file mode 100644 index 000000000..3353d67ef --- /dev/null +++ b/public/bundles/ibexaadminui/img/empty-field-definition-group.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/empty-library.svg b/public/bundles/ibexaadminui/img/empty-library.svg new file mode 100644 index 000000000..7abd1c8b2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/empty-library.svg @@ -0,0 +1,68 @@ + + + Ilustration/empty library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/error_403.svg b/public/bundles/ibexaadminui/img/error_403.svg new file mode 100644 index 000000000..71cbeffca --- /dev/null +++ b/public/bundles/ibexaadminui/img/error_403.svg @@ -0,0 +1,58 @@ + + + Access denied + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ******* + ** + + + ******* + ** + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/error_404.svg b/public/bundles/ibexaadminui/img/error_404.svg new file mode 100644 index 000000000..c143bfcd4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/error_404.svg @@ -0,0 +1,72 @@ + + + page isn't available + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/error_unknown.svg b/public/bundles/ibexaadminui/img/error_unknown.svg new file mode 100644 index 000000000..f5158dcac --- /dev/null +++ b/public/bundles/ibexaadminui/img/error_unknown.svg @@ -0,0 +1,72 @@ + + + Something went wrong + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/errors/403.png b/public/bundles/ibexaadminui/img/errors/403.png new file mode 100755 index 000000000..a64d8d72f Binary files /dev/null and b/public/bundles/ibexaadminui/img/errors/403.png differ diff --git a/public/bundles/ibexaadminui/img/errors/404.png b/public/bundles/ibexaadminui/img/errors/404.png new file mode 100755 index 000000000..a2f6555b3 Binary files /dev/null and b/public/bundles/ibexaadminui/img/errors/404.png differ diff --git a/public/bundles/ibexaadminui/img/errors/500.png b/public/bundles/ibexaadminui/img/errors/500.png new file mode 100755 index 000000000..d9bda0cd4 Binary files /dev/null and b/public/bundles/ibexaadminui/img/errors/500.png differ diff --git a/public/bundles/ibexaadminui/img/errors/background.png b/public/bundles/ibexaadminui/img/errors/background.png new file mode 100644 index 000000000..efa645263 Binary files /dev/null and b/public/bundles/ibexaadminui/img/errors/background.png differ diff --git a/public/bundles/ibexaadminui/img/ez-logo.svg b/public/bundles/ibexaadminui/img/ez-logo.svg new file mode 100644 index 000000000..2dd8f3c54 --- /dev/null +++ b/public/bundles/ibexaadminui/img/ez-logo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/favicon-16x16.png b/public/bundles/ibexaadminui/img/favicon-16x16.png new file mode 100755 index 000000000..971bf9465 Binary files /dev/null and b/public/bundles/ibexaadminui/img/favicon-16x16.png differ diff --git a/public/bundles/ibexaadminui/img/favicon-32x32.png b/public/bundles/ibexaadminui/img/favicon-32x32.png new file mode 100755 index 000000000..c90a773ce Binary files /dev/null and b/public/bundles/ibexaadminui/img/favicon-32x32.png differ diff --git a/public/bundles/ibexaadminui/img/favicon.ico b/public/bundles/ibexaadminui/img/favicon.ico new file mode 100644 index 000000000..d67902320 Binary files /dev/null and b/public/bundles/ibexaadminui/img/favicon.ico differ diff --git a/public/bundles/ibexaadminui/img/ibexa-empty-table.svg b/public/bundles/ibexaadminui/img/ibexa-empty-table.svg new file mode 100644 index 000000000..392f90b56 --- /dev/null +++ b/public/bundles/ibexaadminui/img/ibexa-empty-table.svg @@ -0,0 +1,66 @@ + + + ilu_empty table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/ibexa-icons.svg b/public/bundles/ibexaadminui/img/ibexa-icons.svg new file mode 100644 index 000000000..8ae4ba9c4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/ibexa-icons.svg @@ -0,0 +1,883 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/ibexa-logo.svg b/public/bundles/ibexaadminui/img/ibexa-logo.svg new file mode 100644 index 000000000..0a85962c1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/ibexa-logo.svg @@ -0,0 +1,81 @@ + + + +image/svg+xml + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/ibexa-wordmark.svg b/public/bundles/ibexaadminui/img/ibexa-wordmark.svg new file mode 100644 index 000000000..6a5e5b6b3 --- /dev/null +++ b/public/bundles/ibexaadminui/img/ibexa-wordmark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/icons/about-info.svg b/public/bundles/ibexaadminui/img/icons/about-info.svg new file mode 100755 index 000000000..13034a15d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/about-info.svg @@ -0,0 +1,4 @@ + +about-info + + diff --git a/public/bundles/ibexaadminui/img/icons/about.svg b/public/bundles/ibexaadminui/img/icons/about.svg new file mode 100755 index 000000000..02084dbd3 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/about.svg @@ -0,0 +1,4 @@ + +about + + diff --git a/public/bundles/ibexaadminui/img/icons/airtime.svg b/public/bundles/ibexaadminui/img/icons/airtime.svg new file mode 100755 index 000000000..c4eb999c1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/airtime.svg @@ -0,0 +1,4 @@ + +airtime + + diff --git a/public/bundles/ibexaadminui/img/icons/align-center.svg b/public/bundles/ibexaadminui/img/icons/align-center.svg new file mode 100755 index 000000000..e4aac6dde --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/align-center.svg @@ -0,0 +1,4 @@ + +align-center + + diff --git a/public/bundles/ibexaadminui/img/icons/align-justify.svg b/public/bundles/ibexaadminui/img/icons/align-justify.svg new file mode 100755 index 000000000..24854d910 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/align-justify.svg @@ -0,0 +1,4 @@ + +align-justify + + diff --git a/public/bundles/ibexaadminui/img/icons/align-left.svg b/public/bundles/ibexaadminui/img/icons/align-left.svg new file mode 100755 index 000000000..49fe66de6 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/align-left.svg @@ -0,0 +1,4 @@ + +align-left + + diff --git a/public/bundles/ibexaadminui/img/icons/align-right.svg b/public/bundles/ibexaadminui/img/icons/align-right.svg new file mode 100755 index 000000000..cb00427cb --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/align-right.svg @@ -0,0 +1,4 @@ + +align-right + + diff --git a/public/bundles/ibexaadminui/img/icons/approved.svg b/public/bundles/ibexaadminui/img/icons/approved.svg new file mode 100644 index 000000000..28df2519d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/approved.svg @@ -0,0 +1,4 @@ + + approved + + diff --git a/public/bundles/ibexaadminui/img/icons/archive-restore.svg b/public/bundles/ibexaadminui/img/icons/archive-restore.svg new file mode 100755 index 000000000..fa2958b81 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/archive-restore.svg @@ -0,0 +1,4 @@ + +archive-restore + + diff --git a/public/bundles/ibexaadminui/img/icons/article.svg b/public/bundles/ibexaadminui/img/icons/article.svg new file mode 100755 index 000000000..e1d42a8e0 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/article.svg @@ -0,0 +1,4 @@ + +article + + diff --git a/public/bundles/ibexaadminui/img/icons/assign-section.svg b/public/bundles/ibexaadminui/img/icons/assign-section.svg new file mode 100644 index 000000000..2fabbdb0b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/assign-section.svg @@ -0,0 +1,4 @@ + +assign-section + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/assign-user.svg b/public/bundles/ibexaadminui/img/icons/assign-user.svg new file mode 100644 index 000000000..349767397 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/assign-user.svg @@ -0,0 +1,4 @@ + +assign-user + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/author.svg b/public/bundles/ibexaadminui/img/icons/author.svg new file mode 100755 index 000000000..98f86ff44 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/author.svg @@ -0,0 +1,4 @@ + +author + + diff --git a/public/bundles/ibexaadminui/img/icons/autosave-error.svg b/public/bundles/ibexaadminui/img/icons/autosave-error.svg new file mode 100644 index 000000000..2476ef5b7 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/autosave-error.svg @@ -0,0 +1,7 @@ + + autosave-error + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/autosave-off.svg b/public/bundles/ibexaadminui/img/icons/autosave-off.svg new file mode 100644 index 000000000..17d7118b3 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/autosave-off.svg @@ -0,0 +1,7 @@ + + autosave-off + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/autosave-on.svg b/public/bundles/ibexaadminui/img/icons/autosave-on.svg new file mode 100644 index 000000000..3411059ed --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/autosave-on.svg @@ -0,0 +1,5 @@ + + + autosave-on + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/autosave-saved.svg b/public/bundles/ibexaadminui/img/icons/autosave-saved.svg new file mode 100644 index 000000000..b43ab840c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/autosave-saved.svg @@ -0,0 +1,8 @@ + + + autosave-saved + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/autosave-saving.svg b/public/bundles/ibexaadminui/img/icons/autosave-saving.svg new file mode 100644 index 000000000..a741cc46d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/autosave-saving.svg @@ -0,0 +1,8 @@ + + + autosave-saving + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/autosave.svg b/public/bundles/ibexaadminui/img/icons/autosave.svg new file mode 100644 index 000000000..af3d909cf --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/autosave.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/icons/b2b.svg b/public/bundles/ibexaadminui/img/icons/b2b.svg new file mode 100755 index 000000000..644bc8770 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/b2b.svg @@ -0,0 +1,4 @@ + +b2b + + diff --git a/public/bundles/ibexaadminui/img/icons/back-current-date.svg b/public/bundles/ibexaadminui/img/icons/back-current-date.svg new file mode 100755 index 000000000..1d4f0a297 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/back-current-date.svg @@ -0,0 +1,4 @@ + +back-current-date + + diff --git a/public/bundles/ibexaadminui/img/icons/back.svg b/public/bundles/ibexaadminui/img/icons/back.svg new file mode 100755 index 000000000..e5bdfdd91 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/back.svg @@ -0,0 +1,4 @@ + +back + + diff --git a/public/bundles/ibexaadminui/img/icons/banner.svg b/public/bundles/ibexaadminui/img/icons/banner.svg new file mode 100755 index 000000000..b173bd6bb --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/banner.svg @@ -0,0 +1,4 @@ + +banner + + diff --git a/public/bundles/ibexaadminui/img/icons/bell.svg b/public/bundles/ibexaadminui/img/icons/bell.svg new file mode 100644 index 000000000..0f39a0ee9 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bell.svg @@ -0,0 +1,9 @@ + + + bell + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/bestseller.svg b/public/bundles/ibexaadminui/img/icons/bestseller.svg new file mode 100755 index 000000000..9405994bf --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bestseller.svg @@ -0,0 +1,4 @@ + +bestseller + + diff --git a/public/bundles/ibexaadminui/img/icons/block-add.svg b/public/bundles/ibexaadminui/img/icons/block-add.svg new file mode 100644 index 000000000..4e4e7ac99 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/block-add.svg @@ -0,0 +1,4 @@ + +block-add + + diff --git a/public/bundles/ibexaadminui/img/icons/block-invisible.svg b/public/bundles/ibexaadminui/img/icons/block-invisible.svg new file mode 100755 index 000000000..db59b4b83 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/block-invisible.svg @@ -0,0 +1,4 @@ + +block-invisible + + diff --git a/public/bundles/ibexaadminui/img/icons/block-visible-recurring.svg b/public/bundles/ibexaadminui/img/icons/block-visible-recurring.svg new file mode 100755 index 000000000..ce1d72504 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/block-visible-recurring.svg @@ -0,0 +1,4 @@ + +block-visible-recurring + + diff --git a/public/bundles/ibexaadminui/img/icons/block-visible.svg b/public/bundles/ibexaadminui/img/icons/block-visible.svg new file mode 100755 index 000000000..ea8b94ed1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/block-visible.svg @@ -0,0 +1,4 @@ + +block-visible + + diff --git a/public/bundles/ibexaadminui/img/icons/blog.svg b/public/bundles/ibexaadminui/img/icons/blog.svg new file mode 100755 index 000000000..8cc65a2ce --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/blog.svg @@ -0,0 +1,4 @@ + +blog + + diff --git a/public/bundles/ibexaadminui/img/icons/blog_post.svg b/public/bundles/ibexaadminui/img/icons/blog_post.svg new file mode 100755 index 000000000..f845492ef --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/blog_post.svg @@ -0,0 +1,4 @@ + +blog_post + + diff --git a/public/bundles/ibexaadminui/img/icons/bold.svg b/public/bundles/ibexaadminui/img/icons/bold.svg new file mode 100755 index 000000000..756ea5af2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bold.svg @@ -0,0 +1,4 @@ + +bold + + diff --git a/public/bundles/ibexaadminui/img/icons/bookmark-active.svg b/public/bundles/ibexaadminui/img/icons/bookmark-active.svg new file mode 100755 index 000000000..41dd54af5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bookmark-active.svg @@ -0,0 +1,4 @@ + +bookmark-active + + diff --git a/public/bundles/ibexaadminui/img/icons/bookmark-manager.svg b/public/bundles/ibexaadminui/img/icons/bookmark-manager.svg new file mode 100755 index 000000000..ddb7a7002 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bookmark-manager.svg @@ -0,0 +1,4 @@ + +bookmark-manager + + diff --git a/public/bundles/ibexaadminui/img/icons/bookmark.svg b/public/bundles/ibexaadminui/img/icons/bookmark.svg new file mode 100755 index 000000000..8f8ce9037 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bookmark.svg @@ -0,0 +1,4 @@ + +bookmark + + diff --git a/public/bundles/ibexaadminui/img/icons/box-collapse.svg b/public/bundles/ibexaadminui/img/icons/box-collapse.svg new file mode 100644 index 000000000..c8c135f61 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/box-collapse.svg @@ -0,0 +1,4 @@ + +box-collapse + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/browse.svg b/public/bundles/ibexaadminui/img/icons/browse.svg new file mode 100755 index 000000000..d04e9fcaf --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/browse.svg @@ -0,0 +1,4 @@ + +browse + + diff --git a/public/bundles/ibexaadminui/img/icons/bubbles.svg b/public/bundles/ibexaadminui/img/icons/bubbles.svg new file mode 100755 index 000000000..3e9aa369a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/bubbles.svg @@ -0,0 +1,4 @@ + +bubbles + + diff --git a/public/bundles/ibexaadminui/img/icons/business-deal-cash.svg b/public/bundles/ibexaadminui/img/icons/business-deal-cash.svg new file mode 100644 index 000000000..2db25e5ec --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/business-deal-cash.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/icons/button.svg b/public/bundles/ibexaadminui/img/icons/button.svg new file mode 100755 index 000000000..12762d86b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/button.svg @@ -0,0 +1,4 @@ + +button + + diff --git a/public/bundles/ibexaadminui/img/icons/captcha.svg b/public/bundles/ibexaadminui/img/icons/captcha.svg new file mode 100755 index 000000000..f6a44b781 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/captcha.svg @@ -0,0 +1,4 @@ + +captcha + + diff --git a/public/bundles/ibexaadminui/img/icons/caret-back.svg b/public/bundles/ibexaadminui/img/icons/caret-back.svg new file mode 100755 index 000000000..d1f332c19 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-back.svg @@ -0,0 +1,4 @@ + +caret-back + + diff --git a/public/bundles/ibexaadminui/img/icons/caret-double-back.svg b/public/bundles/ibexaadminui/img/icons/caret-double-back.svg new file mode 100644 index 000000000..7e3a53b1f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-double-back.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/icons/caret-double-next.svg b/public/bundles/ibexaadminui/img/icons/caret-double-next.svg new file mode 100644 index 000000000..41d13ea6d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-double-next.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/icons/caret-down.svg b/public/bundles/ibexaadminui/img/icons/caret-down.svg new file mode 100755 index 000000000..187fc24cb --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-down.svg @@ -0,0 +1,4 @@ + +caret-down + + diff --git a/public/bundles/ibexaadminui/img/icons/caret-expanded.svg b/public/bundles/ibexaadminui/img/icons/caret-expanded.svg new file mode 100644 index 000000000..5d1443133 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-expanded.svg @@ -0,0 +1 @@ + diff --git a/public/bundles/ibexaadminui/img/icons/caret-next.svg b/public/bundles/ibexaadminui/img/icons/caret-next.svg new file mode 100755 index 000000000..50e97f275 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-next.svg @@ -0,0 +1,4 @@ + +caret-next + + diff --git a/public/bundles/ibexaadminui/img/icons/caret-up.svg b/public/bundles/ibexaadminui/img/icons/caret-up.svg new file mode 100755 index 000000000..7a0a49b8f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/caret-up.svg @@ -0,0 +1,4 @@ + +caret-up + + diff --git a/public/bundles/ibexaadminui/img/icons/cart-full.svg b/public/bundles/ibexaadminui/img/icons/cart-full.svg new file mode 100755 index 000000000..b5f8c20a9 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/cart-full.svg @@ -0,0 +1,4 @@ + +cart + + diff --git a/public/bundles/ibexaadminui/img/icons/cart-upload.svg b/public/bundles/ibexaadminui/img/icons/cart-upload.svg new file mode 100755 index 000000000..38b37722d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/cart-upload.svg @@ -0,0 +1,4 @@ + +cart-upload + + diff --git a/public/bundles/ibexaadminui/img/icons/cart-wishlist.svg b/public/bundles/ibexaadminui/img/icons/cart-wishlist.svg new file mode 100755 index 000000000..f44b8f4e2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/cart-wishlist.svg @@ -0,0 +1,4 @@ + +cart-wishlist + + diff --git a/public/bundles/ibexaadminui/img/icons/cart.svg b/public/bundles/ibexaadminui/img/icons/cart.svg new file mode 100644 index 000000000..5f783fa1f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/cart.svg @@ -0,0 +1,6 @@ + + +icon/+oss/ecommerce + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/catalog.svg b/public/bundles/ibexaadminui/img/icons/catalog.svg new file mode 100755 index 000000000..7dca67c0f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/catalog.svg @@ -0,0 +1,5 @@ + + +catalog + + diff --git a/public/bundles/ibexaadminui/img/icons/category.svg b/public/bundles/ibexaadminui/img/icons/category.svg new file mode 100755 index 000000000..e1852f3c6 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/category.svg @@ -0,0 +1,4 @@ + +category + + diff --git a/public/bundles/ibexaadminui/img/icons/checkbox-multiple.svg b/public/bundles/ibexaadminui/img/icons/checkbox-multiple.svg new file mode 100755 index 000000000..751843f2d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/checkbox-multiple.svg @@ -0,0 +1,4 @@ + +checkbox-multiple + + diff --git a/public/bundles/ibexaadminui/img/icons/checkbox.svg b/public/bundles/ibexaadminui/img/icons/checkbox.svg new file mode 100755 index 000000000..3c50b041d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/checkbox.svg @@ -0,0 +1,4 @@ + +checkbox + + diff --git a/public/bundles/ibexaadminui/img/icons/checkmark.svg b/public/bundles/ibexaadminui/img/icons/checkmark.svg new file mode 100755 index 000000000..1b4e417f7 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/checkmark.svg @@ -0,0 +1,4 @@ + +checkmark + + diff --git a/public/bundles/ibexaadminui/img/icons/circle-caret-down.svg b/public/bundles/ibexaadminui/img/icons/circle-caret-down.svg new file mode 100755 index 000000000..06bf4fd80 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/circle-caret-down.svg @@ -0,0 +1,4 @@ + +circle-caret-down + + diff --git a/public/bundles/ibexaadminui/img/icons/circle-caret-left.svg b/public/bundles/ibexaadminui/img/icons/circle-caret-left.svg new file mode 100755 index 000000000..11ba54fb5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/circle-caret-left.svg @@ -0,0 +1,4 @@ + +circle-caret-left + + diff --git a/public/bundles/ibexaadminui/img/icons/circle-caret-right.svg b/public/bundles/ibexaadminui/img/icons/circle-caret-right.svg new file mode 100755 index 000000000..641b6635e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/circle-caret-right.svg @@ -0,0 +1,4 @@ + +circle-caret-right + + diff --git a/public/bundles/ibexaadminui/img/icons/circle-caret-up.svg b/public/bundles/ibexaadminui/img/icons/circle-caret-up.svg new file mode 100755 index 000000000..8b054054b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/circle-caret-up.svg @@ -0,0 +1,4 @@ + +circle-caret-up + + diff --git a/public/bundles/ibexaadminui/img/icons/circle-close.svg b/public/bundles/ibexaadminui/img/icons/circle-close.svg new file mode 100755 index 000000000..9aba38de8 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/circle-close.svg @@ -0,0 +1,4 @@ + +circle-close + + diff --git a/public/bundles/ibexaadminui/img/icons/circle-create.svg b/public/bundles/ibexaadminui/img/icons/circle-create.svg new file mode 100755 index 000000000..7234059ad --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/circle-create.svg @@ -0,0 +1,4 @@ + +circle-create + + diff --git a/public/bundles/ibexaadminui/img/icons/clicked-recommendations.svg b/public/bundles/ibexaadminui/img/icons/clicked-recommendations.svg new file mode 100644 index 000000000..84f99395c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/clicked-recommendations.svg @@ -0,0 +1,4 @@ + +clicked-recommendations + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/clipboard.svg b/public/bundles/ibexaadminui/img/icons/clipboard.svg new file mode 100755 index 000000000..da9ab2965 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/clipboard.svg @@ -0,0 +1,4 @@ + +clipboard + + diff --git a/public/bundles/ibexaadminui/img/icons/collection.svg b/public/bundles/ibexaadminui/img/icons/collection.svg new file mode 100755 index 000000000..3e1ffaf4a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/collection.svg @@ -0,0 +1,4 @@ + +align-justify + + diff --git a/public/bundles/ibexaadminui/img/icons/comment.svg b/public/bundles/ibexaadminui/img/icons/comment.svg new file mode 100755 index 000000000..0af60116a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/comment.svg @@ -0,0 +1,4 @@ + +comment + + diff --git a/public/bundles/ibexaadminui/img/icons/components.svg b/public/bundles/ibexaadminui/img/icons/components.svg new file mode 100755 index 000000000..3910cac21 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/components.svg @@ -0,0 +1,4 @@ + +components + + diff --git a/public/bundles/ibexaadminui/img/icons/content-tree.svg b/public/bundles/ibexaadminui/img/icons/content-tree.svg new file mode 100755 index 000000000..2ea559ab7 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/content-tree.svg @@ -0,0 +1,4 @@ + +content-tree + + diff --git a/public/bundles/ibexaadminui/img/icons/content-type-group.svg b/public/bundles/ibexaadminui/img/icons/content-type-group.svg new file mode 100755 index 000000000..05fc95c5e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/content-type-group.svg @@ -0,0 +1,4 @@ + +content-type-group + + diff --git a/public/bundles/ibexaadminui/img/icons/content-type.svg b/public/bundles/ibexaadminui/img/icons/content-type.svg new file mode 100755 index 000000000..0e0ae7400 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/content-type.svg @@ -0,0 +1,4 @@ + +content-type + + diff --git a/public/bundles/ibexaadminui/img/icons/contentlist.svg b/public/bundles/ibexaadminui/img/icons/contentlist.svg new file mode 100755 index 000000000..72b006ef2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/contentlist.svg @@ -0,0 +1,4 @@ + +content_list + + diff --git a/public/bundles/ibexaadminui/img/icons/copy-subtree.svg b/public/bundles/ibexaadminui/img/icons/copy-subtree.svg new file mode 100644 index 000000000..6923e6512 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/copy-subtree.svg @@ -0,0 +1,4 @@ + +copy-subtree + + diff --git a/public/bundles/ibexaadminui/img/icons/copy.svg b/public/bundles/ibexaadminui/img/icons/copy.svg new file mode 100755 index 000000000..ec9008deb --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/copy.svg @@ -0,0 +1,4 @@ + +copy + + diff --git a/public/bundles/ibexaadminui/img/icons/core.svg b/public/bundles/ibexaadminui/img/icons/core.svg new file mode 100755 index 000000000..9a86b74a4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/core.svg @@ -0,0 +1,4 @@ + +core + + diff --git a/public/bundles/ibexaadminui/img/icons/create-content.svg b/public/bundles/ibexaadminui/img/icons/create-content.svg new file mode 100755 index 000000000..067352984 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/create-content.svg @@ -0,0 +1,4 @@ + +create-content + + diff --git a/public/bundles/ibexaadminui/img/icons/create.svg b/public/bundles/ibexaadminui/img/icons/create.svg new file mode 100755 index 000000000..a55079de8 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/create.svg @@ -0,0 +1,4 @@ + +create + + diff --git a/public/bundles/ibexaadminui/img/icons/custom_tags.svg b/public/bundles/ibexaadminui/img/icons/custom_tags.svg new file mode 100755 index 000000000..55fd0da7d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/custom_tags.svg @@ -0,0 +1,4 @@ + +custom_tags + + diff --git a/public/bundles/ibexaadminui/img/icons/customer.svg b/public/bundles/ibexaadminui/img/icons/customer.svg new file mode 100755 index 000000000..dd7bb3433 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/customer.svg @@ -0,0 +1,4 @@ + +customer + + diff --git a/public/bundles/ibexaadminui/img/icons/dashboard-clean.svg b/public/bundles/ibexaadminui/img/icons/dashboard-clean.svg new file mode 100644 index 000000000..7c0a04149 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/dashboard-clean.svg @@ -0,0 +1,6 @@ + + +icon/+oss/dashboard + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/dashboard.svg b/public/bundles/ibexaadminui/img/icons/dashboard.svg new file mode 100644 index 000000000..6f9a63eaf --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/dashboard.svg @@ -0,0 +1,12 @@ + + +icon/+oss/autosave copy 5 + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/database.svg b/public/bundles/ibexaadminui/img/icons/database.svg new file mode 100644 index 000000000..6576b527d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/database.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/date-updated.svg b/public/bundles/ibexaadminui/img/icons/date-updated.svg new file mode 100644 index 000000000..614d7cbb5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/date-updated.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/date.svg b/public/bundles/ibexaadminui/img/icons/date.svg new file mode 100755 index 000000000..a1bb91ef0 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/date.svg @@ -0,0 +1,4 @@ + +date + + diff --git a/public/bundles/ibexaadminui/img/icons/discard.svg b/public/bundles/ibexaadminui/img/icons/discard.svg new file mode 100755 index 000000000..30a9fef53 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/discard.svg @@ -0,0 +1,4 @@ + +discard + + diff --git a/public/bundles/ibexaadminui/img/icons/download.svg b/public/bundles/ibexaadminui/img/icons/download.svg new file mode 100755 index 000000000..6dfb3c50c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/download.svg @@ -0,0 +1,4 @@ + +download + + diff --git a/public/bundles/ibexaadminui/img/icons/drag.svg b/public/bundles/ibexaadminui/img/icons/drag.svg new file mode 100755 index 000000000..38a92904b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/drag.svg @@ -0,0 +1,4 @@ + +drag + + diff --git a/public/bundles/ibexaadminui/img/icons/dropdown.svg b/public/bundles/ibexaadminui/img/icons/dropdown.svg new file mode 100755 index 000000000..4273bfdde --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/dropdown.svg @@ -0,0 +1,4 @@ + +dropdown + + diff --git a/public/bundles/ibexaadminui/img/icons/edit.svg b/public/bundles/ibexaadminui/img/icons/edit.svg new file mode 100755 index 000000000..c11d58719 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/edit.svg @@ -0,0 +1,4 @@ + +edit + + diff --git a/public/bundles/ibexaadminui/img/icons/embed-inline.svg b/public/bundles/ibexaadminui/img/icons/embed-inline.svg new file mode 100644 index 000000000..682a6fe33 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/embed-inline.svg @@ -0,0 +1,7 @@ + + + embed inline + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/embed.svg b/public/bundles/ibexaadminui/img/icons/embed.svg new file mode 100755 index 000000000..341bd3310 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/embed.svg @@ -0,0 +1,14 @@ + + + embed + + + + + + + + + + + diff --git a/public/bundles/ibexaadminui/img/icons/erp.svg b/public/bundles/ibexaadminui/img/icons/erp.svg new file mode 100755 index 000000000..651ab2938 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/erp.svg @@ -0,0 +1,4 @@ + +erp + + diff --git a/public/bundles/ibexaadminui/img/icons/error.svg b/public/bundles/ibexaadminui/img/icons/error.svg new file mode 100755 index 000000000..1095b4720 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/error.svg @@ -0,0 +1,4 @@ + +error + + diff --git a/public/bundles/ibexaadminui/img/icons/events-collected.svg b/public/bundles/ibexaadminui/img/icons/events-collected.svg new file mode 100644 index 000000000..52a2c7b9f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/events-collected.svg @@ -0,0 +1,4 @@ + +events-collected + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/fields.svg b/public/bundles/ibexaadminui/img/icons/fields.svg new file mode 100755 index 000000000..720682f75 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/fields.svg @@ -0,0 +1,4 @@ + +fields + + diff --git a/public/bundles/ibexaadminui/img/icons/file-text.svg b/public/bundles/ibexaadminui/img/icons/file-text.svg new file mode 100755 index 000000000..06ed0c09c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/file-text.svg @@ -0,0 +1,4 @@ + +file-text + + diff --git a/public/bundles/ibexaadminui/img/icons/file-video.svg b/public/bundles/ibexaadminui/img/icons/file-video.svg new file mode 100755 index 000000000..f55c63191 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/file-video.svg @@ -0,0 +1,4 @@ + +file-video + + diff --git a/public/bundles/ibexaadminui/img/icons/file.svg b/public/bundles/ibexaadminui/img/icons/file.svg new file mode 100755 index 000000000..ea7da3b69 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/file.svg @@ -0,0 +1,4 @@ + +file + + diff --git a/public/bundles/ibexaadminui/img/icons/filters-funnel.svg b/public/bundles/ibexaadminui/img/icons/filters-funnel.svg new file mode 100755 index 000000000..cb2ae4f53 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/filters-funnel.svg @@ -0,0 +1,4 @@ + +filters-funnel + + diff --git a/public/bundles/ibexaadminui/img/icons/filters.svg b/public/bundles/ibexaadminui/img/icons/filters.svg new file mode 100755 index 000000000..180297a8a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/filters.svg @@ -0,0 +1,4 @@ + +filters + + diff --git a/public/bundles/ibexaadminui/img/icons/flag.svg b/public/bundles/ibexaadminui/img/icons/flag.svg new file mode 100644 index 000000000..6daea3e36 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/flag.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/focus.svg b/public/bundles/ibexaadminui/img/icons/focus.svg new file mode 100755 index 000000000..065d23aa0 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/focus.svg @@ -0,0 +1,4 @@ + +focus + + diff --git a/public/bundles/ibexaadminui/img/icons/folder-empty.svg b/public/bundles/ibexaadminui/img/icons/folder-empty.svg new file mode 100755 index 000000000..d37db2c27 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/folder-empty.svg @@ -0,0 +1,4 @@ + +folder-empty + + diff --git a/public/bundles/ibexaadminui/img/icons/folder.svg b/public/bundles/ibexaadminui/img/icons/folder.svg new file mode 100755 index 000000000..6d91666e5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/folder.svg @@ -0,0 +1,4 @@ + +folder + + diff --git a/public/bundles/ibexaadminui/img/icons/form-data.svg b/public/bundles/ibexaadminui/img/icons/form-data.svg new file mode 100755 index 000000000..906a58363 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/form-data.svg @@ -0,0 +1,4 @@ + +form-data + + diff --git a/public/bundles/ibexaadminui/img/icons/form.svg b/public/bundles/ibexaadminui/img/icons/form.svg new file mode 100755 index 000000000..444408f96 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/form.svg @@ -0,0 +1,4 @@ + +form + + diff --git a/public/bundles/ibexaadminui/img/icons/future-publication.svg b/public/bundles/ibexaadminui/img/icons/future-publication.svg new file mode 100755 index 000000000..787233bfa --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/future-publication.svg @@ -0,0 +1,4 @@ + +future-publication + + diff --git a/public/bundles/ibexaadminui/img/icons/gallery.svg b/public/bundles/ibexaadminui/img/icons/gallery.svg new file mode 100755 index 000000000..a02e8b6a2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/gallery.svg @@ -0,0 +1,4 @@ + +gallery + + diff --git a/public/bundles/ibexaadminui/img/icons/go-right.svg b/public/bundles/ibexaadminui/img/icons/go-right.svg new file mode 100644 index 000000000..434b13290 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/go-right.svg @@ -0,0 +1,7 @@ + + + +icon/+oss/go-up + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/go-to-root.svg b/public/bundles/ibexaadminui/img/icons/go-to-root.svg new file mode 100755 index 000000000..ecc5972d4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/go-to-root.svg @@ -0,0 +1,4 @@ + +go-to-root + + diff --git a/public/bundles/ibexaadminui/img/icons/go-up.svg b/public/bundles/ibexaadminui/img/icons/go-up.svg new file mode 100755 index 000000000..f7355ffb2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/go-up.svg @@ -0,0 +1,4 @@ + +go-up + + diff --git a/public/bundles/ibexaadminui/img/icons/h1.svg b/public/bundles/ibexaadminui/img/icons/h1.svg new file mode 100755 index 000000000..5b60df857 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/h1.svg @@ -0,0 +1,4 @@ + +h1 + + diff --git a/public/bundles/ibexaadminui/img/icons/h2.svg b/public/bundles/ibexaadminui/img/icons/h2.svg new file mode 100755 index 000000000..4d4796049 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/h2.svg @@ -0,0 +1,4 @@ + +h2 + + diff --git a/public/bundles/ibexaadminui/img/icons/h3.svg b/public/bundles/ibexaadminui/img/icons/h3.svg new file mode 100755 index 000000000..233913309 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/h3.svg @@ -0,0 +1,4 @@ + +h3 + + diff --git a/public/bundles/ibexaadminui/img/icons/h4.svg b/public/bundles/ibexaadminui/img/icons/h4.svg new file mode 100755 index 000000000..4c48771cd --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/h4.svg @@ -0,0 +1,4 @@ + +h4 + + diff --git a/public/bundles/ibexaadminui/img/icons/h5.svg b/public/bundles/ibexaadminui/img/icons/h5.svg new file mode 100755 index 000000000..33883d8bb --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/h5.svg @@ -0,0 +1,4 @@ + +h5 + + diff --git a/public/bundles/ibexaadminui/img/icons/h6.svg b/public/bundles/ibexaadminui/img/icons/h6.svg new file mode 100755 index 000000000..764cf2552 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/h6.svg @@ -0,0 +1,4 @@ + +h6 + + diff --git a/public/bundles/ibexaadminui/img/icons/hide.svg b/public/bundles/ibexaadminui/img/icons/hide.svg new file mode 100644 index 000000000..20826df32 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/hide.svg @@ -0,0 +1,4 @@ + +hide + + diff --git a/public/bundles/ibexaadminui/img/icons/hierarchy.svg b/public/bundles/ibexaadminui/img/icons/hierarchy.svg new file mode 100644 index 000000000..b32e4de5d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/hierarchy.svg @@ -0,0 +1,6 @@ + + +icon/+oss/relations + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/history-file.svg b/public/bundles/ibexaadminui/img/icons/history-file.svg new file mode 100644 index 000000000..8a7b4105d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/history-file.svg @@ -0,0 +1,4 @@ + +history-file + + diff --git a/public/bundles/ibexaadminui/img/icons/history.svg b/public/bundles/ibexaadminui/img/icons/history.svg new file mode 100755 index 000000000..d722d4300 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/history.svg @@ -0,0 +1,4 @@ + +history + + diff --git a/public/bundles/ibexaadminui/img/icons/home-page.svg b/public/bundles/ibexaadminui/img/icons/home-page.svg new file mode 100755 index 000000000..beb273c9d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/home-page.svg @@ -0,0 +1,4 @@ + +home-page + + diff --git a/public/bundles/ibexaadminui/img/icons/image-center.svg b/public/bundles/ibexaadminui/img/icons/image-center.svg new file mode 100755 index 000000000..ec7cd865e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/image-center.svg @@ -0,0 +1,4 @@ + +image-center + + diff --git a/public/bundles/ibexaadminui/img/icons/image-left.svg b/public/bundles/ibexaadminui/img/icons/image-left.svg new file mode 100755 index 000000000..8633c824b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/image-left.svg @@ -0,0 +1,4 @@ + +image-left + + diff --git a/public/bundles/ibexaadminui/img/icons/image-right.svg b/public/bundles/ibexaadminui/img/icons/image-right.svg new file mode 100755 index 000000000..a00412397 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/image-right.svg @@ -0,0 +1,4 @@ + +image-right + + diff --git a/public/bundles/ibexaadminui/img/icons/image.svg b/public/bundles/ibexaadminui/img/icons/image.svg new file mode 100755 index 000000000..6cc974136 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/image.svg @@ -0,0 +1,4 @@ + +image + + diff --git a/public/bundles/ibexaadminui/img/icons/imported-items.svg b/public/bundles/ibexaadminui/img/icons/imported-items.svg new file mode 100644 index 000000000..05486caef --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/imported-items.svg @@ -0,0 +1,4 @@ + +imported-items + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/information.svg b/public/bundles/ibexaadminui/img/icons/information.svg new file mode 100755 index 000000000..720f0899c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/information.svg @@ -0,0 +1,4 @@ + +information + + diff --git a/public/bundles/ibexaadminui/img/icons/input-hidden.svg b/public/bundles/ibexaadminui/img/icons/input-hidden.svg new file mode 100755 index 000000000..397ab6e6b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/input-hidden.svg @@ -0,0 +1,4 @@ + +input-hidden + + diff --git a/public/bundles/ibexaadminui/img/icons/input-line-multiple.svg b/public/bundles/ibexaadminui/img/icons/input-line-multiple.svg new file mode 100755 index 000000000..a8e7faa20 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/input-line-multiple.svg @@ -0,0 +1,4 @@ + +input-line-multiple + + diff --git a/public/bundles/ibexaadminui/img/icons/input-line.svg b/public/bundles/ibexaadminui/img/icons/input-line.svg new file mode 100755 index 000000000..06a76d65b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/input-line.svg @@ -0,0 +1,4 @@ + +input-line + + diff --git a/public/bundles/ibexaadminui/img/icons/input-number.svg b/public/bundles/ibexaadminui/img/icons/input-number.svg new file mode 100755 index 000000000..7bfdb46e4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/input-number.svg @@ -0,0 +1,4 @@ + +input-number + + diff --git a/public/bundles/ibexaadminui/img/icons/interface-block.svg b/public/bundles/ibexaadminui/img/icons/interface-block.svg new file mode 100644 index 000000000..68e9268f3 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/interface-block.svg @@ -0,0 +1,9 @@ + + + +icon/+Streamline/light/interface-block + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/italic.svg b/public/bundles/ibexaadminui/img/icons/italic.svg new file mode 100755 index 000000000..d8d20ae49 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/italic.svg @@ -0,0 +1,4 @@ + +italic + + diff --git a/public/bundles/ibexaadminui/img/icons/keyword.svg b/public/bundles/ibexaadminui/img/icons/keyword.svg new file mode 100755 index 000000000..98851cec4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/keyword.svg @@ -0,0 +1,4 @@ + +keywords + + diff --git a/public/bundles/ibexaadminui/img/icons/landing_page.svg b/public/bundles/ibexaadminui/img/icons/landing_page.svg new file mode 100755 index 000000000..28c3f2b3e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/landing_page.svg @@ -0,0 +1,4 @@ + +landing_page + + diff --git a/public/bundles/ibexaadminui/img/icons/landingpage-add.svg b/public/bundles/ibexaadminui/img/icons/landingpage-add.svg new file mode 100755 index 000000000..3b12dfd1d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/landingpage-add.svg @@ -0,0 +1,4 @@ + +landingpage-add + + diff --git a/public/bundles/ibexaadminui/img/icons/landingpage-preview.svg b/public/bundles/ibexaadminui/img/icons/landingpage-preview.svg new file mode 100644 index 000000000..54e73767b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/landingpage-preview.svg @@ -0,0 +1,4 @@ + +landingpage-preview + + diff --git a/public/bundles/ibexaadminui/img/icons/languages-add.svg b/public/bundles/ibexaadminui/img/icons/languages-add.svg new file mode 100755 index 000000000..6b2d07fdf --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/languages-add.svg @@ -0,0 +1,4 @@ + +languages-add + + diff --git a/public/bundles/ibexaadminui/img/icons/languages.svg b/public/bundles/ibexaadminui/img/icons/languages.svg new file mode 100755 index 000000000..b5f91891d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/languages.svg @@ -0,0 +1,4 @@ + +languages + + diff --git a/public/bundles/ibexaadminui/img/icons/last-purchased.svg b/public/bundles/ibexaadminui/img/icons/last-purchased.svg new file mode 100644 index 000000000..2fcf6fadc --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/last-purchased.svg @@ -0,0 +1,4 @@ + +last-purchased + + diff --git a/public/bundles/ibexaadminui/img/icons/last-viewed.svg b/public/bundles/ibexaadminui/img/icons/last-viewed.svg new file mode 100644 index 000000000..74cad0534 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/last-viewed.svg @@ -0,0 +1,4 @@ + +last-viewed + + diff --git a/public/bundles/ibexaadminui/img/icons/layout-switch.svg b/public/bundles/ibexaadminui/img/icons/layout-switch.svg new file mode 100755 index 000000000..5faa1c1a3 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/layout-switch.svg @@ -0,0 +1,4 @@ + +layout-switch + + diff --git a/public/bundles/ibexaadminui/img/icons/link-anchor.svg b/public/bundles/ibexaadminui/img/icons/link-anchor.svg new file mode 100644 index 000000000..9835958ae --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/link-anchor.svg @@ -0,0 +1,4 @@ + +link-anchor + + diff --git a/public/bundles/ibexaadminui/img/icons/link-content.svg b/public/bundles/ibexaadminui/img/icons/link-content.svg new file mode 100755 index 000000000..62a21be4e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/link-content.svg @@ -0,0 +1,4 @@ + +link-content + + diff --git a/public/bundles/ibexaadminui/img/icons/link-remove.svg b/public/bundles/ibexaadminui/img/icons/link-remove.svg new file mode 100755 index 000000000..a54751eef --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/link-remove.svg @@ -0,0 +1,4 @@ + +link-remove + + diff --git a/public/bundles/ibexaadminui/img/icons/link.svg b/public/bundles/ibexaadminui/img/icons/link.svg new file mode 100755 index 000000000..8745c4f92 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/link.svg @@ -0,0 +1,4 @@ + +link + + diff --git a/public/bundles/ibexaadminui/img/icons/list-numbered.svg b/public/bundles/ibexaadminui/img/icons/list-numbered.svg new file mode 100755 index 000000000..b3da7b029 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/list-numbered.svg @@ -0,0 +1,4 @@ + +list-numbered + + diff --git a/public/bundles/ibexaadminui/img/icons/list.svg b/public/bundles/ibexaadminui/img/icons/list.svg new file mode 100755 index 000000000..4b1007d0b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/list.svg @@ -0,0 +1,4 @@ + +list + + diff --git a/public/bundles/ibexaadminui/img/icons/localize.svg b/public/bundles/ibexaadminui/img/icons/localize.svg new file mode 100644 index 000000000..3b603623b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/localize.svg @@ -0,0 +1,9 @@ + + + Combined-Shape + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/location-add-new.svg b/public/bundles/ibexaadminui/img/icons/location-add-new.svg new file mode 100755 index 000000000..1ed592821 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/location-add-new.svg @@ -0,0 +1,4 @@ + +location-add-new + + diff --git a/public/bundles/ibexaadminui/img/icons/lock-unlock.svg b/public/bundles/ibexaadminui/img/icons/lock-unlock.svg new file mode 100755 index 000000000..8645bf377 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/lock-unlock.svg @@ -0,0 +1,4 @@ + +lock-unlock + + diff --git a/public/bundles/ibexaadminui/img/icons/lock.svg b/public/bundles/ibexaadminui/img/icons/lock.svg new file mode 100755 index 000000000..c79afea46 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/lock.svg @@ -0,0 +1,4 @@ + +lock + + diff --git a/public/bundles/ibexaadminui/img/icons/logout.svg b/public/bundles/ibexaadminui/img/icons/logout.svg new file mode 100755 index 000000000..ac339a59c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/logout.svg @@ -0,0 +1,4 @@ + +logout + + diff --git a/public/bundles/ibexaadminui/img/icons/maform.svg b/public/bundles/ibexaadminui/img/icons/maform.svg new file mode 100755 index 000000000..36228f267 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/maform.svg @@ -0,0 +1,4 @@ + +maform + + diff --git a/public/bundles/ibexaadminui/img/icons/mail.svg b/public/bundles/ibexaadminui/img/icons/mail.svg new file mode 100755 index 000000000..e8b8ca6d9 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/mail.svg @@ -0,0 +1,4 @@ + +mail + + diff --git a/public/bundles/ibexaadminui/img/icons/markup.svg b/public/bundles/ibexaadminui/img/icons/markup.svg new file mode 100755 index 000000000..a1cae77da --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/markup.svg @@ -0,0 +1,4 @@ + +markup + + diff --git a/public/bundles/ibexaadminui/img/icons/media.svg b/public/bundles/ibexaadminui/img/icons/media.svg new file mode 100755 index 000000000..d7325da05 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/media.svg @@ -0,0 +1,4 @@ + +media + + diff --git a/public/bundles/ibexaadminui/img/icons/menu.svg b/public/bundles/ibexaadminui/img/icons/menu.svg new file mode 100644 index 000000000..2aef95bcd --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/menu.svg @@ -0,0 +1,6 @@ + + +icon/+oss/submenu + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/merge.svg b/public/bundles/ibexaadminui/img/icons/merge.svg new file mode 100755 index 000000000..8c462346d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/merge.svg @@ -0,0 +1,4 @@ + +merge + + diff --git a/public/bundles/ibexaadminui/img/icons/move.svg b/public/bundles/ibexaadminui/img/icons/move.svg new file mode 100755 index 000000000..82c403694 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/move.svg @@ -0,0 +1,4 @@ + +move + + diff --git a/public/bundles/ibexaadminui/img/icons/news.svg b/public/bundles/ibexaadminui/img/icons/news.svg new file mode 100755 index 000000000..32a7e8234 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/news.svg @@ -0,0 +1,4 @@ + +news + + diff --git a/public/bundles/ibexaadminui/img/icons/newsletter.svg b/public/bundles/ibexaadminui/img/icons/newsletter.svg new file mode 100755 index 000000000..cc64b0d49 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/newsletter.svg @@ -0,0 +1,4 @@ + +newsletter + + diff --git a/public/bundles/ibexaadminui/img/icons/notice.svg b/public/bundles/ibexaadminui/img/icons/notice.svg new file mode 100755 index 000000000..a1446a813 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/notice.svg @@ -0,0 +1,4 @@ + +notice + + diff --git a/public/bundles/ibexaadminui/img/icons/object-state.svg b/public/bundles/ibexaadminui/img/icons/object-state.svg new file mode 100644 index 000000000..f6b1e02f5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/object-state.svg @@ -0,0 +1,4 @@ + +object-state + + diff --git a/public/bundles/ibexaadminui/img/icons/open-newtab.svg b/public/bundles/ibexaadminui/img/icons/open-newtab.svg new file mode 100755 index 000000000..7139d5dfa --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/open-newtab.svg @@ -0,0 +1,4 @@ + +open-newtab + + diff --git a/public/bundles/ibexaadminui/img/icons/open-sametab.svg b/public/bundles/ibexaadminui/img/icons/open-sametab.svg new file mode 100755 index 000000000..773dfe411 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/open-sametab.svg @@ -0,0 +1,4 @@ + +open-sametab + + diff --git a/public/bundles/ibexaadminui/img/icons/options.svg b/public/bundles/ibexaadminui/img/icons/options.svg new file mode 100755 index 000000000..68121b04b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/options.svg @@ -0,0 +1,4 @@ + +options + + diff --git a/public/bundles/ibexaadminui/img/icons/order-management.svg b/public/bundles/ibexaadminui/img/icons/order-management.svg new file mode 100755 index 000000000..b1a3524fa --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/order-management.svg @@ -0,0 +1,4 @@ + +order-management + + diff --git a/public/bundles/ibexaadminui/img/icons/panels.svg b/public/bundles/ibexaadminui/img/icons/panels.svg new file mode 100644 index 000000000..73cf57c75 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/panels.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/paragraph-add.svg b/public/bundles/ibexaadminui/img/icons/paragraph-add.svg new file mode 100755 index 000000000..78b02682f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/paragraph-add.svg @@ -0,0 +1,4 @@ + +paragraph-add + + diff --git a/public/bundles/ibexaadminui/img/icons/paragraph.svg b/public/bundles/ibexaadminui/img/icons/paragraph.svg new file mode 100755 index 000000000..f803147b9 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/paragraph.svg @@ -0,0 +1,4 @@ + +paragraph + + diff --git a/public/bundles/ibexaadminui/img/icons/pdf-file.svg b/public/bundles/ibexaadminui/img/icons/pdf-file.svg new file mode 100755 index 000000000..d4fb874a7 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/pdf-file.svg @@ -0,0 +1,4 @@ + +pdf-file + + diff --git a/public/bundles/ibexaadminui/img/icons/personalize-block.svg b/public/bundles/ibexaadminui/img/icons/personalize-block.svg new file mode 100755 index 000000000..50c832ffe --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/personalize-block.svg @@ -0,0 +1,4 @@ + +personalize-block + + diff --git a/public/bundles/ibexaadminui/img/icons/personalize-content.svg b/public/bundles/ibexaadminui/img/icons/personalize-content.svg new file mode 100755 index 000000000..f8361dc31 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/personalize-content.svg @@ -0,0 +1,4 @@ + +personalize-content + + diff --git a/public/bundles/ibexaadminui/img/icons/personalize.svg b/public/bundles/ibexaadminui/img/icons/personalize.svg new file mode 100755 index 000000000..9411d2d6a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/personalize.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/bundles/ibexaadminui/img/icons/pin-unpin.svg b/public/bundles/ibexaadminui/img/icons/pin-unpin.svg new file mode 100755 index 000000000..de3c365b1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/pin-unpin.svg @@ -0,0 +1,4 @@ + +pin-unpin + + diff --git a/public/bundles/ibexaadminui/img/icons/pin.svg b/public/bundles/ibexaadminui/img/icons/pin.svg new file mode 100755 index 000000000..e78fac889 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/pin.svg @@ -0,0 +1,4 @@ + +pin + + diff --git a/public/bundles/ibexaadminui/img/icons/place.svg b/public/bundles/ibexaadminui/img/icons/place.svg new file mode 100755 index 000000000..893819301 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/place.svg @@ -0,0 +1,4 @@ + +place + + diff --git a/public/bundles/ibexaadminui/img/icons/places.svg b/public/bundles/ibexaadminui/img/icons/places.svg new file mode 100755 index 000000000..8aad0fa7b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/places.svg @@ -0,0 +1,4 @@ + +place_list + + diff --git a/public/bundles/ibexaadminui/img/icons/portfolio.svg b/public/bundles/ibexaadminui/img/icons/portfolio.svg new file mode 100755 index 000000000..bffccec07 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/portfolio.svg @@ -0,0 +1,4 @@ + +portfolio + + diff --git a/public/bundles/ibexaadminui/img/icons/previewed.svg b/public/bundles/ibexaadminui/img/icons/previewed.svg new file mode 100644 index 000000000..40ccf6b34 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/previewed.svg @@ -0,0 +1,4 @@ + +previewed + + diff --git a/public/bundles/ibexaadminui/img/icons/price.svg b/public/bundles/ibexaadminui/img/icons/price.svg new file mode 100644 index 000000000..2c2d2e0ae --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/price.svg @@ -0,0 +1,4 @@ + +price + + diff --git a/public/bundles/ibexaadminui/img/icons/product-catalog.svg b/public/bundles/ibexaadminui/img/icons/product-catalog.svg new file mode 100644 index 000000000..995f72340 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/product-catalog.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/product.svg b/public/bundles/ibexaadminui/img/icons/product.svg new file mode 100755 index 000000000..002656d22 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/product.svg @@ -0,0 +1,4 @@ + +product + + diff --git a/public/bundles/ibexaadminui/img/icons/product_list.svg b/public/bundles/ibexaadminui/img/icons/product_list.svg new file mode 100755 index 000000000..9156f2b64 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/product_list.svg @@ -0,0 +1,4 @@ + +product_list + + diff --git a/public/bundles/ibexaadminui/img/icons/profile.svg b/public/bundles/ibexaadminui/img/icons/profile.svg new file mode 100755 index 000000000..09b5cbbe6 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/profile.svg @@ -0,0 +1,4 @@ + +profile + + diff --git a/public/bundles/ibexaadminui/img/icons/publish-later-cancel.svg b/public/bundles/ibexaadminui/img/icons/publish-later-cancel.svg new file mode 100755 index 000000000..b6b57062b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/publish-later-cancel.svg @@ -0,0 +1,4 @@ + +publish-later-cancel + + diff --git a/public/bundles/ibexaadminui/img/icons/publish-later.svg b/public/bundles/ibexaadminui/img/icons/publish-later.svg new file mode 100755 index 000000000..5fee7b6b6 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/publish-later.svg @@ -0,0 +1,4 @@ + +publish-later + + diff --git a/public/bundles/ibexaadminui/img/icons/publish.svg b/public/bundles/ibexaadminui/img/icons/publish.svg new file mode 100755 index 000000000..dcf27edf5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/publish.svg @@ -0,0 +1,4 @@ + +publish + + diff --git a/public/bundles/ibexaadminui/img/icons/quote.svg b/public/bundles/ibexaadminui/img/icons/quote.svg new file mode 100755 index 000000000..e087fee7d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/quote.svg @@ -0,0 +1,4 @@ + +quote + + diff --git a/public/bundles/ibexaadminui/img/icons/radio-button-multiple.svg b/public/bundles/ibexaadminui/img/icons/radio-button-multiple.svg new file mode 100755 index 000000000..5e070100b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/radio-button-multiple.svg @@ -0,0 +1,4 @@ + +radio-button-multiple + + diff --git a/public/bundles/ibexaadminui/img/icons/radio-button.svg b/public/bundles/ibexaadminui/img/icons/radio-button.svg new file mode 100755 index 000000000..4cbc517dd --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/radio-button.svg @@ -0,0 +1,4 @@ + +radio-button + + diff --git a/public/bundles/ibexaadminui/img/icons/rate-review.svg b/public/bundles/ibexaadminui/img/icons/rate-review.svg new file mode 100755 index 000000000..d819de10a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/rate-review.svg @@ -0,0 +1,4 @@ + +rate-review + + diff --git a/public/bundles/ibexaadminui/img/icons/rate.svg b/public/bundles/ibexaadminui/img/icons/rate.svg new file mode 100755 index 000000000..2518c7e34 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/rate.svg @@ -0,0 +1,4 @@ + +rate + + diff --git a/public/bundles/ibexaadminui/img/icons/recently-added.svg b/public/bundles/ibexaadminui/img/icons/recently-added.svg new file mode 100644 index 000000000..ef3a86ba8 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/recently-added.svg @@ -0,0 +1,4 @@ + +recently-added + + diff --git a/public/bundles/ibexaadminui/img/icons/recommendation-calls.svg b/public/bundles/ibexaadminui/img/icons/recommendation-calls.svg new file mode 100644 index 000000000..03ba104f1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/recommendation-calls.svg @@ -0,0 +1,4 @@ + +recommendation-calls + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/redo.svg b/public/bundles/ibexaadminui/img/icons/redo.svg new file mode 100644 index 000000000..91e1c09da --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/redo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/refresh.svg b/public/bundles/ibexaadminui/img/icons/refresh.svg new file mode 100755 index 000000000..893844a72 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/refresh.svg @@ -0,0 +1,4 @@ + +refresh + + diff --git a/public/bundles/ibexaadminui/img/icons/rejected.svg b/public/bundles/ibexaadminui/img/icons/rejected.svg new file mode 100644 index 000000000..f31b7614b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/rejected.svg @@ -0,0 +1,4 @@ + + rejected + + diff --git a/public/bundles/ibexaadminui/img/icons/relations.svg b/public/bundles/ibexaadminui/img/icons/relations.svg new file mode 100755 index 000000000..52cda18ab --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/relations.svg @@ -0,0 +1,4 @@ + +relations + + diff --git a/public/bundles/ibexaadminui/img/icons/restore-parent.svg b/public/bundles/ibexaadminui/img/icons/restore-parent.svg new file mode 100755 index 000000000..d19156445 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/restore-parent.svg @@ -0,0 +1,4 @@ + +restore-parent + + diff --git a/public/bundles/ibexaadminui/img/icons/restore.svg b/public/bundles/ibexaadminui/img/icons/restore.svg new file mode 100755 index 000000000..57508b3cf --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/restore.svg @@ -0,0 +1,4 @@ + +restore + + diff --git a/public/bundles/ibexaadminui/img/icons/reveal.svg b/public/bundles/ibexaadminui/img/icons/reveal.svg new file mode 100644 index 000000000..14257215c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/reveal.svg @@ -0,0 +1,5 @@ + +reveal + + + diff --git a/public/bundles/ibexaadminui/img/icons/review.svg b/public/bundles/ibexaadminui/img/icons/review.svg new file mode 100755 index 000000000..0397007bd --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/review.svg @@ -0,0 +1,4 @@ + +review + + diff --git a/public/bundles/ibexaadminui/img/icons/roles.svg b/public/bundles/ibexaadminui/img/icons/roles.svg new file mode 100755 index 000000000..adb58314b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/roles.svg @@ -0,0 +1,4 @@ + +roles + + diff --git a/public/bundles/ibexaadminui/img/icons/rss.svg b/public/bundles/ibexaadminui/img/icons/rss.svg new file mode 100755 index 000000000..71911ab31 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/rss.svg @@ -0,0 +1,4 @@ + +rss + + diff --git a/public/bundles/ibexaadminui/img/icons/save.svg b/public/bundles/ibexaadminui/img/icons/save.svg new file mode 100755 index 000000000..102eac957 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/save.svg @@ -0,0 +1,4 @@ + +save + + diff --git a/public/bundles/ibexaadminui/img/icons/schedule.svg b/public/bundles/ibexaadminui/img/icons/schedule.svg new file mode 100755 index 000000000..ca5e2fbe1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/schedule.svg @@ -0,0 +1,4 @@ + +schedule + + diff --git a/public/bundles/ibexaadminui/img/icons/search.svg b/public/bundles/ibexaadminui/img/icons/search.svg new file mode 100755 index 000000000..089b37ab5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/search.svg @@ -0,0 +1,4 @@ + +search + + diff --git a/public/bundles/ibexaadminui/img/icons/sections.svg b/public/bundles/ibexaadminui/img/icons/sections.svg new file mode 100755 index 000000000..039e942c5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/sections.svg @@ -0,0 +1,4 @@ + +sections + + diff --git a/public/bundles/ibexaadminui/img/icons/send-mail.svg b/public/bundles/ibexaadminui/img/icons/send-mail.svg new file mode 100644 index 000000000..b7f1772c5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/send-mail.svg @@ -0,0 +1,4 @@ + +send-mail + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/send-review.svg b/public/bundles/ibexaadminui/img/icons/send-review.svg new file mode 100755 index 000000000..3f11cd9c7 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/send-review.svg @@ -0,0 +1,4 @@ + +send-review-new-C1 + + diff --git a/public/bundles/ibexaadminui/img/icons/server.svg b/public/bundles/ibexaadminui/img/icons/server.svg new file mode 100755 index 000000000..3d503a657 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/server.svg @@ -0,0 +1,4 @@ + +server + + diff --git a/public/bundles/ibexaadminui/img/icons/settings-block.svg b/public/bundles/ibexaadminui/img/icons/settings-block.svg new file mode 100755 index 000000000..c4a05c3c8 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/settings-block.svg @@ -0,0 +1,4 @@ + +settings-block + + diff --git a/public/bundles/ibexaadminui/img/icons/settings-config.svg b/public/bundles/ibexaadminui/img/icons/settings-config.svg new file mode 100755 index 000000000..15b73569f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/settings-config.svg @@ -0,0 +1,4 @@ + +settings-config + + diff --git a/public/bundles/ibexaadminui/img/icons/sites-all.svg b/public/bundles/ibexaadminui/img/icons/sites-all.svg new file mode 100755 index 000000000..b42d0f823 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/sites-all.svg @@ -0,0 +1,4 @@ + +sites-all + + diff --git a/public/bundles/ibexaadminui/img/icons/sites.svg b/public/bundles/ibexaadminui/img/icons/sites.svg new file mode 100644 index 000000000..18b2aab7c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/sites.svg @@ -0,0 +1,6 @@ + + +icon/+oss/sites-all + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/slider-lastviewed.svg b/public/bundles/ibexaadminui/img/icons/slider-lastviewed.svg new file mode 100755 index 000000000..7b22b0f4e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/slider-lastviewed.svg @@ -0,0 +1,4 @@ + +slider-lastviewed + + diff --git a/public/bundles/ibexaadminui/img/icons/slider.svg b/public/bundles/ibexaadminui/img/icons/slider.svg new file mode 100755 index 000000000..3cb315665 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/slider.svg @@ -0,0 +1,4 @@ + +slider + + diff --git a/public/bundles/ibexaadminui/img/icons/spinner.svg b/public/bundles/ibexaadminui/img/icons/spinner.svg new file mode 100755 index 000000000..75037c841 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/spinner.svg @@ -0,0 +1,4 @@ + +spinner + + diff --git a/public/bundles/ibexaadminui/img/icons/square.svg b/public/bundles/ibexaadminui/img/icons/square.svg new file mode 100755 index 000000000..42ab0dd4a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/square.svg @@ -0,0 +1,4 @@ + +square + + diff --git a/public/bundles/ibexaadminui/img/icons/stats.svg b/public/bundles/ibexaadminui/img/icons/stats.svg new file mode 100755 index 000000000..00b3e9a02 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/stats.svg @@ -0,0 +1,4 @@ + +stats + + diff --git a/public/bundles/ibexaadminui/img/icons/strikethrough.svg b/public/bundles/ibexaadminui/img/icons/strikethrough.svg new file mode 100755 index 000000000..adde3482a --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/strikethrough.svg @@ -0,0 +1,4 @@ + +strikethrough + + diff --git a/public/bundles/ibexaadminui/img/icons/subscriber.svg b/public/bundles/ibexaadminui/img/icons/subscriber.svg new file mode 100755 index 000000000..e41d2ecfd --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/subscriber.svg @@ -0,0 +1,4 @@ + +subscriber + + diff --git a/public/bundles/ibexaadminui/img/icons/subscript.svg b/public/bundles/ibexaadminui/img/icons/subscript.svg new file mode 100755 index 000000000..963dbdb43 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/subscript.svg @@ -0,0 +1,4 @@ + +subscript + + diff --git a/public/bundles/ibexaadminui/img/icons/superscript.svg b/public/bundles/ibexaadminui/img/icons/superscript.svg new file mode 100755 index 000000000..c1b6a2bad --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/superscript.svg @@ -0,0 +1,4 @@ + +superscript + + diff --git a/public/bundles/ibexaadminui/img/icons/swap.svg b/public/bundles/ibexaadminui/img/icons/swap.svg new file mode 100755 index 000000000..045f13900 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/swap.svg @@ -0,0 +1,4 @@ + +swap + + diff --git a/public/bundles/ibexaadminui/img/icons/system-information.svg b/public/bundles/ibexaadminui/img/icons/system-information.svg new file mode 100755 index 000000000..0580b6d7c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/system-information.svg @@ -0,0 +1,4 @@ + +system-information + + diff --git a/public/bundles/ibexaadminui/img/icons/table-add.svg b/public/bundles/ibexaadminui/img/icons/table-add.svg new file mode 100755 index 000000000..ee3af4a1b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/table-add.svg @@ -0,0 +1,4 @@ + +table-add + + diff --git a/public/bundles/ibexaadminui/img/icons/table-cell.svg b/public/bundles/ibexaadminui/img/icons/table-cell.svg new file mode 100755 index 000000000..475d9fd69 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/table-cell.svg @@ -0,0 +1,4 @@ + +table-cell + + diff --git a/public/bundles/ibexaadminui/img/icons/table-column.svg b/public/bundles/ibexaadminui/img/icons/table-column.svg new file mode 100755 index 000000000..ede258763 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/table-column.svg @@ -0,0 +1,4 @@ + +table-column + + diff --git a/public/bundles/ibexaadminui/img/icons/table-row.svg b/public/bundles/ibexaadminui/img/icons/table-row.svg new file mode 100755 index 000000000..994d104ee --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/table-row.svg @@ -0,0 +1,4 @@ + +table-row + + diff --git a/public/bundles/ibexaadminui/img/icons/tag.svg b/public/bundles/ibexaadminui/img/icons/tag.svg new file mode 100755 index 000000000..2300112e5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/tag.svg @@ -0,0 +1,4 @@ + +tag + + diff --git a/public/bundles/ibexaadminui/img/icons/tags.svg b/public/bundles/ibexaadminui/img/icons/tags.svg new file mode 100755 index 000000000..a945da69d --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/tags.svg @@ -0,0 +1,4 @@ + +tags + + diff --git a/public/bundles/ibexaadminui/img/icons/telephone.svg b/public/bundles/ibexaadminui/img/icons/telephone.svg new file mode 100644 index 000000000..b52e8550c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/telephone.svg @@ -0,0 +1,4 @@ + +telephone + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/timeline.svg b/public/bundles/ibexaadminui/img/icons/timeline.svg new file mode 100755 index 000000000..099d85c8b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/timeline.svg @@ -0,0 +1,4 @@ + +timeline + + diff --git a/public/bundles/ibexaadminui/img/icons/trash-empty.svg b/public/bundles/ibexaadminui/img/icons/trash-empty.svg new file mode 100755 index 000000000..a8970332c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/trash-empty.svg @@ -0,0 +1,4 @@ + +trash-empty + + diff --git a/public/bundles/ibexaadminui/img/icons/trash-notrashed.svg b/public/bundles/ibexaadminui/img/icons/trash-notrashed.svg new file mode 100755 index 000000000..3693a1b80 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/trash-notrashed.svg @@ -0,0 +1,4 @@ + +trash-notrashed + + diff --git a/public/bundles/ibexaadminui/img/icons/trash-send.svg b/public/bundles/ibexaadminui/img/icons/trash-send.svg new file mode 100755 index 000000000..6b5be4789 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/trash-send.svg @@ -0,0 +1,4 @@ + +trash-send + + diff --git a/public/bundles/ibexaadminui/img/icons/trash.svg b/public/bundles/ibexaadminui/img/icons/trash.svg new file mode 100755 index 000000000..d6f25ddfc --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/trash.svg @@ -0,0 +1,4 @@ + +trash + + diff --git a/public/bundles/ibexaadminui/img/icons/twitter.svg b/public/bundles/ibexaadminui/img/icons/twitter.svg new file mode 100755 index 000000000..586ea1905 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/twitter.svg @@ -0,0 +1,4 @@ + +twitter + + diff --git a/public/bundles/ibexaadminui/img/icons/unarchive.svg b/public/bundles/ibexaadminui/img/icons/unarchive.svg new file mode 100755 index 000000000..92a6747ea --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/unarchive.svg @@ -0,0 +1,4 @@ + +unarchive + + diff --git a/public/bundles/ibexaadminui/img/icons/underscore.svg b/public/bundles/ibexaadminui/img/icons/underscore.svg new file mode 100755 index 000000000..f24834f1f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/underscore.svg @@ -0,0 +1,4 @@ + +underscore + + diff --git a/public/bundles/ibexaadminui/img/icons/undo.svg b/public/bundles/ibexaadminui/img/icons/undo.svg new file mode 100644 index 000000000..91e1c09da --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/undo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/upload-image.svg b/public/bundles/ibexaadminui/img/icons/upload-image.svg new file mode 100644 index 000000000..840e7a2f8 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/upload-image.svg @@ -0,0 +1,9 @@ + + + +icon/+Oss/upload + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/upload.svg b/public/bundles/ibexaadminui/img/icons/upload.svg new file mode 100755 index 000000000..ade71ee96 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/upload.svg @@ -0,0 +1,4 @@ + +upload + + diff --git a/public/bundles/ibexaadminui/img/icons/user-add.svg b/public/bundles/ibexaadminui/img/icons/user-add.svg new file mode 100644 index 000000000..eb80a77b2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/user-add.svg @@ -0,0 +1,4 @@ + +user-add + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/user-blocked.svg b/public/bundles/ibexaadminui/img/icons/user-blocked.svg new file mode 100644 index 000000000..da59df173 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/user-blocked.svg @@ -0,0 +1,4 @@ + +user-blocked + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/user-recycle.svg b/public/bundles/ibexaadminui/img/icons/user-recycle.svg new file mode 100644 index 000000000..125c82dfd --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/user-recycle.svg @@ -0,0 +1,4 @@ + +user-recycle + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/user-tick.svg b/public/bundles/ibexaadminui/img/icons/user-tick.svg new file mode 100644 index 000000000..6de327f1e --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/user-tick.svg @@ -0,0 +1,4 @@ + +user-tick + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/user.svg b/public/bundles/ibexaadminui/img/icons/user.svg new file mode 100755 index 000000000..a4f5010d4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/user.svg @@ -0,0 +1,4 @@ + +user + + diff --git a/public/bundles/ibexaadminui/img/icons/user_group.svg b/public/bundles/ibexaadminui/img/icons/user_group.svg new file mode 100755 index 000000000..48fbd8a2f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/user_group.svg @@ -0,0 +1,4 @@ + +user_group + + diff --git a/public/bundles/ibexaadminui/img/icons/users-personalization.svg b/public/bundles/ibexaadminui/img/icons/users-personalization.svg new file mode 100644 index 000000000..370e6083c --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/users-personalization.svg @@ -0,0 +1,4 @@ + +users-personalization + + diff --git a/public/bundles/ibexaadminui/img/icons/users-select.svg b/public/bundles/ibexaadminui/img/icons/users-select.svg new file mode 100644 index 000000000..9dc3c2be5 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/users-select.svg @@ -0,0 +1,4 @@ + +users-select + + diff --git a/public/bundles/ibexaadminui/img/icons/versions.svg b/public/bundles/ibexaadminui/img/icons/versions.svg new file mode 100755 index 000000000..8515291d1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/versions.svg @@ -0,0 +1,4 @@ + +versions + + diff --git a/public/bundles/ibexaadminui/img/icons/vertical-left-right.svg b/public/bundles/ibexaadminui/img/icons/vertical-left-right.svg new file mode 100644 index 000000000..2fd59c3fa --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/vertical-left-right.svg @@ -0,0 +1,6 @@ + + +icon/+oss/slider + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/video.svg b/public/bundles/ibexaadminui/img/icons/video.svg new file mode 100755 index 000000000..29bda383b --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/video.svg @@ -0,0 +1,4 @@ + +video + + diff --git a/public/bundles/ibexaadminui/img/icons/view-custom.svg b/public/bundles/ibexaadminui/img/icons/view-custom.svg new file mode 100755 index 000000000..b9bff7cc9 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-custom.svg @@ -0,0 +1,4 @@ + +view-custom + + diff --git a/public/bundles/ibexaadminui/img/icons/view-desktop.svg b/public/bundles/ibexaadminui/img/icons/view-desktop.svg new file mode 100755 index 000000000..d21c76996 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-desktop.svg @@ -0,0 +1,4 @@ + +view-desktop + + diff --git a/public/bundles/ibexaadminui/img/icons/view-grid.svg b/public/bundles/ibexaadminui/img/icons/view-grid.svg new file mode 100755 index 000000000..4dd4179f6 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-grid.svg @@ -0,0 +1,4 @@ + +view-grid + + diff --git a/public/bundles/ibexaadminui/img/icons/view-hide.svg b/public/bundles/ibexaadminui/img/icons/view-hide.svg new file mode 100755 index 000000000..55999c1a0 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-hide.svg @@ -0,0 +1,4 @@ + +view-hide + + diff --git a/public/bundles/ibexaadminui/img/icons/view-list.svg b/public/bundles/ibexaadminui/img/icons/view-list.svg new file mode 100755 index 000000000..2b2b0feb1 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-list.svg @@ -0,0 +1,4 @@ + +view-list + + diff --git a/public/bundles/ibexaadminui/img/icons/view-mobile.svg b/public/bundles/ibexaadminui/img/icons/view-mobile.svg new file mode 100755 index 000000000..2ec6d3ac9 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-mobile.svg @@ -0,0 +1,4 @@ + +view-mobile + + diff --git a/public/bundles/ibexaadminui/img/icons/view-tablet.svg b/public/bundles/ibexaadminui/img/icons/view-tablet.svg new file mode 100755 index 000000000..d82732c66 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view-tablet.svg @@ -0,0 +1,4 @@ + +view-tablet + + diff --git a/public/bundles/ibexaadminui/img/icons/view.svg b/public/bundles/ibexaadminui/img/icons/view.svg new file mode 100755 index 000000000..756055e25 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/view.svg @@ -0,0 +1,4 @@ + +view + + diff --git a/public/bundles/ibexaadminui/img/icons/wand.svg b/public/bundles/ibexaadminui/img/icons/wand.svg new file mode 100755 index 000000000..872382d80 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/wand.svg @@ -0,0 +1,4 @@ + +wand + + diff --git a/public/bundles/ibexaadminui/img/icons/warning-triangle.svg b/public/bundles/ibexaadminui/img/icons/warning-triangle.svg new file mode 100644 index 000000000..20647dde2 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/warning-triangle.svg @@ -0,0 +1,4 @@ + +warning-triangle + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/icons/warning.svg b/public/bundles/ibexaadminui/img/icons/warning.svg new file mode 100755 index 000000000..b158990b4 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/warning.svg @@ -0,0 +1,4 @@ + +warning + + diff --git a/public/bundles/ibexaadminui/img/icons/wiki-file.svg b/public/bundles/ibexaadminui/img/icons/wiki-file.svg new file mode 100755 index 000000000..f7d3abf76 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/wiki-file.svg @@ -0,0 +1,4 @@ + +wiki-file + + diff --git a/public/bundles/ibexaadminui/img/icons/wiki.svg b/public/bundles/ibexaadminui/img/icons/wiki.svg new file mode 100755 index 000000000..c62c05928 --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/wiki.svg @@ -0,0 +1,4 @@ + +wiki + + diff --git a/public/bundles/ibexaadminui/img/icons/workflow.svg b/public/bundles/ibexaadminui/img/icons/workflow.svg new file mode 100644 index 000000000..4e65f6e9f --- /dev/null +++ b/public/bundles/ibexaadminui/img/icons/workflow.svg @@ -0,0 +1,4 @@ + +workflow + + diff --git a/public/bundles/ibexaadminui/img/login-background.jpg b/public/bundles/ibexaadminui/img/login-background.jpg new file mode 100644 index 000000000..3062df44a Binary files /dev/null and b/public/bundles/ibexaadminui/img/login-background.jpg differ diff --git a/public/bundles/ibexaadminui/img/no-gallery-items.svg b/public/bundles/ibexaadminui/img/no-gallery-items.svg new file mode 100644 index 000000000..df65680e3 --- /dev/null +++ b/public/bundles/ibexaadminui/img/no-gallery-items.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/no-results.svg b/public/bundles/ibexaadminui/img/no-results.svg new file mode 100644 index 000000000..e80e62dae --- /dev/null +++ b/public/bundles/ibexaadminui/img/no-results.svg @@ -0,0 +1,39 @@ + + + Group + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/no-search-items.svg b/public/bundles/ibexaadminui/img/no-search-items.svg new file mode 100644 index 000000000..735873e62 --- /dev/null +++ b/public/bundles/ibexaadminui/img/no-search-items.svg @@ -0,0 +1,42 @@ + + + Group 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/bundles/ibexaadminui/img/preview-mobile.png b/public/bundles/ibexaadminui/img/preview-mobile.png new file mode 100755 index 000000000..848d6d5b5 Binary files /dev/null and b/public/bundles/ibexaadminui/img/preview-mobile.png differ diff --git a/public/bundles/ibexaadminui/img/preview-tablet.png b/public/bundles/ibexaadminui/img/preview-tablet.png new file mode 100755 index 000000000..673734d0c Binary files /dev/null and b/public/bundles/ibexaadminui/img/preview-tablet.png differ diff --git a/public/bundles/ibexaadminui/js/scripts/adaptive.filters.js b/public/bundles/ibexaadminui/js/scripts/adaptive.filters.js new file mode 100644 index 000000000..e711aeffc --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/adaptive.filters.js @@ -0,0 +1,57 @@ +(function (global, doc, ibexa, bootstrap) { + const adaptiveFilters = doc.querySelectorAll('.ibexa-adaptive-filters'); + const initializeAdaptiveFilters = (adaptiveFilter) => { + const adaptiveItemsContainer = adaptiveFilter.querySelector('.ibexa-adaptive-filters__items'); + const adaptiveItemsCollapsibleContainer = adaptiveFilter.querySelector('.ibexa-adaptive-filters__collapsible'); + const adaptiveItemsCollapsibleContentContainer = adaptiveFilter.querySelector('.ibexa-adaptive-filters__collapsible-content'); + const actionsContainer = adaptiveFilter.querySelector('.ibexa-adaptive-filters__actions'); + const toggleBtn = adaptiveFilter.querySelector('.ibexa-adaptive-filters__toggler'); + const { expandedInfoCookieName } = adaptiveFilter.dataset; + const setExpandedInfoCookie = (isExpanded) => { + const cookieValue = isExpanded ? 'true' : 'false'; + + if (expandedInfoCookieName) { + ibexa.helpers.cookies.setBackOfficeCookie(expandedInfoCookieName, cookieValue); + } + }; + const collapse = bootstrap.Collapse.getOrCreateInstance(adaptiveItemsCollapsibleContainer, { + toggle: false, + }); + const adaptiveItems = new ibexa.core.AdaptiveItems({ + itemHiddenClass: 'ibexa-adaptive-filters__item--hidden', + container: adaptiveItemsContainer, + getActiveItem: () => null, + prepareItemsBeforeAdapt: () => { + [...adaptiveItemsCollapsibleContentContainer.children].forEach((child) => + adaptiveItemsContainer.insertBefore(child, actionsContainer), + ); + }, + onAdapted: (visibleItems, hiddenItems) => { + if (hiddenItems.size === 0) { + collapse.hide(); + } + + hiddenItems.forEach((hiddenItem) => adaptiveItemsCollapsibleContentContainer.append(hiddenItem)); + + adaptiveFilter.classList.add('ibexa-adaptive-filters--initialized'); + }, + }); + adaptiveItemsCollapsibleContainer.addEventListener('hide.bs.collapse', () => { + toggleBtn.classList.add('ibexa-adaptive-filters__toggler--collapsed'); + adaptiveItemsCollapsibleContainer.classList.add('ibexa-adaptive-filters__collapsible--collapsed'); + adaptiveItemsCollapsibleContentContainer.classList.add('ibexa-adaptive-filters__collapsible-content--collapsed'); + + setExpandedInfoCookie(false); + }); + adaptiveItemsCollapsibleContainer.addEventListener('show.bs.collapse', () => { + toggleBtn.classList.remove('ibexa-adaptive-filters__toggler--collapsed'); + adaptiveItemsCollapsibleContainer.classList.remove('ibexa-adaptive-filters__collapsible--collapsed'); + adaptiveItemsCollapsibleContentContainer.classList.remove('ibexa-adaptive-filters__collapsible-content--collapsed'); + + setExpandedInfoCookie(true); + }); + adaptiveItems.init(); + }; + + adaptiveFilters.forEach(initializeAdaptiveFilters); +})(window, window.document, window.ibexa, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.anchor.navigation.js b/public/bundles/ibexaadminui/js/scripts/admin.anchor.navigation.js new file mode 100644 index 000000000..aa8226c84 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.anchor.navigation.js @@ -0,0 +1,248 @@ +(function (global, doc, ibexa) { + const navigationMenu = doc.querySelector('.ibexa-anchor-navigation-menu'); + + if (!navigationMenu) { + return; + } + + const header = doc.querySelector('.ibexa-edit-header'); + const headerContainer = header?.querySelector('.ibexa-edit-header__container'); + const SECTION_ADJUST_MARGIN_TOP = 20; + const formContainerNode = doc.querySelector('.ibexa-edit-content'); + const lastSectionObserver = new ResizeObserver(() => { + fitSections(); + }); + const getSectionGroupActiveItems = () => { + const sectionGroupNode = formContainerNode.querySelector('.ibexa-anchor-navigation__section-group') ?? formContainerNode; + const sections = sectionGroupNode.querySelectorAll('.ibexa-anchor-navigation__section'); + + return [...sections]; + }; + let currentlyVisibleSections = getSectionGroupActiveItems(); + const attachSectionGroupsMenuListEvents = () => { + const items = doc.querySelectorAll( + '.ibexa-anchor-navigation-menu__section-groups--list .ibexa-anchor-navigation-menu__section-groups-item', + ); + + items.forEach((item) => item.addEventListener('click', onSelectSectionGroupsMenuList, false)); + }; + const attachSectionGroupsMenuDropdownEvents = () => { + const sourceSelect = doc.querySelector( + '.ibexa-anchor-navigation-menu__section-groups--dropdown .ibexa-dropdown__source .ibexa-input', + ); + + if (!sourceSelect) { + return; + } + + sourceSelect.addEventListener('change', onSelectSectionGroupsMenuDropdown, false); + }; + const onSelectSectionGroupsMenuList = (event) => { + const { targetId } = event.currentTarget.dataset; + const sectionsMenuNode = doc.querySelector(`.ibexa-anchor-navigation-menu__sections[data-id="${targetId}"]`); + const sectionGroupsMenuItems = doc.querySelectorAll( + '.ibexa-anchor-navigation-menu__section-groups--list .ibexa-anchor-navigation-menu__section-groups-item', + ); + + sectionGroupsMenuItems.forEach((item) => { + item.classList.toggle('ibexa-anchor-navigation-menu__section-groups-item--active', item.isSameNode(event.currentTarget)); + }); + showSectionGroup(targetId); + showSectionsMenu(sectionsMenuNode); + }; + const onSelectSectionGroupsMenuDropdown = (event) => { + const targetId = event.currentTarget.value; + const sectionsMenuNode = doc.querySelector(`.ibexa-anchor-navigation-menu__sections[data-id="${targetId}"]`); + + showSectionGroup(targetId); + showSectionsMenu(sectionsMenuNode); + }; + const showSectionsMenu = (node) => { + const items = doc.querySelectorAll('.ibexa-anchor-navigation-menu__sections'); + + items.forEach((item) => item.classList.toggle('ibexa-anchor-navigation-menu__sections--active', item.isSameNode(node))); + }; + const showSectionGroup = (id) => { + const sectionGroupItems = formContainerNode.querySelectorAll('.ibexa-anchor-navigation__section-group'); + + sectionGroupItems.forEach((item) => { + item.classList.toggle('ibexa-anchor-navigation__section-group--active', item.dataset.id === id); + }); + + currentlyVisibleSections = getSectionGroupActiveItems(); + + initFitSection(); + }; + const attachSectionsMenuEvents = () => { + const items = doc.querySelectorAll('.ibexa-anchor-navigation-menu .ibexa-anchor-navigation-menu__sections-item-btn'); + + items.forEach((item) => item.addEventListener('click', onSelectSectionsMenu, false)); + }; + const onSelectSectionsMenu = (event) => { + const { targetId } = event.currentTarget.dataset; + + navigateTo(targetId); + }; + const navigateTo = (targetId) => { + const sectionNode = formContainerNode.querySelector(`.ibexa-anchor-navigation__section[data-id="${targetId}"]`); + + formContainerNode.scrollTo({ + top: sectionNode.offsetTop, + behavior: 'smooth', + }); + }; + const getFirstSection = (sectionGroup) => { + return sectionGroup.querySelector('.ibexa-anchor-navigation__section'); + }; + const getLastSection = (sectionGroup) => { + const sections = [...sectionGroup.querySelectorAll('.ibexa-anchor-navigation__section')]; + + return sections[sections.length - 1]; + }; + const initFitSection = () => { + const sectionGroup = + formContainerNode.querySelector('.ibexa-anchor-navigation__section-group--active') ?? + formContainerNode.querySelector('.ibexa-anchor-navigation-sections'); + + if (!sectionGroup) { + return; + } + + const lastSection = getLastSection(sectionGroup); + + if (!lastSection) { + return; + } + + const contentContainer = lastSection.closest('.ibexa-edit-content__container'); + + if (!contentContainer) { + return; + } + + fitSections(); + + lastSectionObserver.unobserve(contentContainer); + lastSectionObserver.observe(contentContainer); + }; + const fitSections = () => { + const sectionGroup = + formContainerNode.querySelector('.ibexa-anchor-navigation__section-group--active') ?? + formContainerNode.querySelector('.ibexa-anchor-navigation-sections'); + const contentColumn = doc.querySelector('.ibexa-main-container__content-column'); + const firstSection = getFirstSection(sectionGroup); + const lastSection = getLastSection(sectionGroup); + const contentContainer = lastSection.closest('.ibexa-edit-content__container'); + + if (!firstSection.isSameNode(lastSection) && lastSection.offsetHeight) { + const lastSectionHeight = lastSection.offsetHeight; + const headerHeight = headerContainer?.offsetHeight; + const contentColumnHeight = contentColumn.offsetHeight; + const additionalContentHeight = Math.max(contentContainer.offsetHeight - sectionGroup.offsetHeight, 0); + const valueToCorrectHeightDiff = headerHeight + additionalContentHeight; + const lastSectionHeightDiff = contentColumnHeight - lastSectionHeight - valueToCorrectHeightDiff; + + if (lastSectionHeightDiff > 0) { + contentContainer.style.paddingBottom = `${lastSectionHeightDiff}px`; + } + } + }; + const attachScrollContainerEvents = () => { + const allSections = [...formContainerNode.querySelectorAll('.ibexa-anchor-navigation__section')]; + let previousFirstVisibleSection = null; + + if (formContainerNode && allSections.length) { + formContainerNode.addEventListener('scroll', () => { + let firstVisibleSection = currentlyVisibleSections.find((section) => { + const { top, height } = section.getBoundingClientRect(); + const headerBottomContainerHeight = header.offsetHeight - headerContainer?.offsetHeight; + + return top + height >= headerContainer?.offsetHeight + headerBottomContainerHeight + SECTION_ADJUST_MARGIN_TOP; + }); + + if (!firstVisibleSection) { + firstVisibleSection = currentlyVisibleSections.at(-1); + } + + if (previousFirstVisibleSection === firstVisibleSection) { + return; + } + + previousFirstVisibleSection = firstVisibleSection; + + const targetId = firstVisibleSection.dataset.id; + const secondaryMenuNode = doc.querySelector( + `.ibexa-anchor-navigation-menu__sections--active .ibexa-anchor-navigation-menu__sections-item-btn[data-target-id="${targetId}"]`, + ); + + setActiveSecondaryMenu(secondaryMenuNode); + }); + } + }; + const setActiveSecondaryMenu = (node) => { + const secondaryMenuItems = doc.querySelectorAll( + '.ibexa-anchor-navigation-menu__sections--active .ibexa-anchor-navigation-menu__sections-item-btn', + ); + + secondaryMenuItems.forEach((item) => { + item.classList.toggle('ibexa-anchor-navigation-menu__sections-item-btn--active', item.isSameNode(node)); + }); + }; + const attachListenForIsInvalidClass = () => { + const classChangedCallback = (mutationList) => { + mutationList.forEach((mutation) => { + const { oldValue, target } = mutation; + const hadIsInvalidClass = oldValue?.includes('.is-invalid') ?? false; + const hasIsInvalidClass = target.classList.contains('is-invalid'); + + if (hadIsInvalidClass !== hasIsInvalidClass) { + const sectionGroup = target.closest('.ibexa-anchor-navigation__section-group'); + + if (!sectionGroup) { + return; + } + + const { id } = sectionGroup.dataset; + const hasGroupError = !!sectionGroup.querySelector('.is-invalid'); + const correspondingMenuItem = + doc.querySelector(`.ibexa-anchor-navigation-menu__section-groups-item[data-target-id="${id}"]`) ?? + doc.querySelector(`.ibexa-anchor-navigation-menu .ibexa-dropdown__item[data-value="${id}"]`); + + if (!correspondingMenuItem) { + return; + } + + const errorIconNode = correspondingMenuItem.querySelector('.ibexa-anchor-navigation-menu__item-error'); + const dropdownWidget = doc.querySelector('.ibexa-anchor-navigation-menu .ibexa-dropdown'); + + errorIconNode.classList.toggle('ibexa-anchor-navigation-menu__item-error--hidden', !hasGroupError); + + if (dropdownWidget) { + const hasError = !!dropdownWidget.querySelector( + '.ibexa-anchor-navigation-menu__item-error:not(ibexa-anchor-navigation-menu__item-error--hidden)', + ); + const errorDropdownContainer = doc.querySelector('.ibexa-anchor-navigation-menu__error'); + + errorDropdownContainer.classList.toggle('ibexa-anchor-navigation-menu__error--hidden', !hasError); + } + } + }); + }; + const observer = new MutationObserver(classChangedCallback); + + observer.observe(formContainerNode, { + subtree: true, + attributes: true, + attributeFilter: ['class'], + attributeOldValue: true, + }); + }; + + attachSectionGroupsMenuListEvents(); + attachSectionGroupsMenuDropdownEvents(); + attachSectionsMenuEvents(); + attachScrollContainerEvents(); + attachListenForIsInvalidClass(); + initFitSection(); + ibexa.helpers.tooltips.parse(navigationMenu); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.anchor.sections.navigation.js b/public/bundles/ibexaadminui/js/scripts/admin.anchor.sections.navigation.js new file mode 100644 index 000000000..7a939ed7d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.anchor.sections.navigation.js @@ -0,0 +1,5 @@ +(function () { + // depraacted, will be removed in 5.0 + // code that was in this file was mostly moved and unified with admin.anchor.navigation.js + console.warn('admin.anchor.sections.navigation.js has been depracted in favor for admin.anchor.navigation.js'); +})(); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.back.to.top.js b/public/bundles/ibexaadminui/js/scripts/admin.back.to.top.js new file mode 100644 index 000000000..6aec1a432 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.back.to.top.js @@ -0,0 +1,42 @@ +(function (global, doc) { + const backToTopBtn = doc.querySelector('.ibexa-back-to-top__btn'); + const backToTopAnchor = doc.querySelector('.ibexa-back-to-top-anchor'); + const backToTopScrollContainer = doc.querySelector('.ibexa-back-to-top-scroll-container'); + + if (!backToTopBtn || !backToTopAnchor || !backToTopScrollContainer) { + return; + } + + const backToTopBtnTitle = backToTopBtn.querySelector('.ibexa-back-to-top__title'); + let currentBackToTopAnchorHeight = backToTopAnchor.offsetHeight; + const setBackToTopBtnTextVisibility = (container) => { + const isTitleVisible = Math.abs(container.scrollHeight - container.scrollTop - container.clientHeight) <= 2; + + backToTopBtn.classList.toggle('ibexa-back-to-top__btn--visible', container.scrollTop !== 0); + backToTopBtn.classList.toggle('ibexa-btn--no-text', !isTitleVisible); + backToTopBtnTitle.classList.toggle('ibexa-back-to-top__title--visible', isTitleVisible); + }; + + backToTopScrollContainer.addEventListener('scroll', (event) => { + const container = event.target; + + setBackToTopBtnTextVisibility(container); + }); + backToTopBtn.addEventListener('click', () => { + backToTopAnchor.scrollIntoView({ + behavior: 'smooth', + }); + }); + + const resizeObserver = new ResizeObserver((entries) => { + if (currentBackToTopAnchorHeight === entries[0].target.clientHeight) { + return; + } + + currentBackToTopAnchorHeight = entries[0].target.clientHeight; + + setBackToTopBtnTextVisibility(backToTopScrollContainer); + }); + + resizeObserver.observe(backToTopAnchor); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.card.toggle.group.js b/public/bundles/ibexaadminui/js/scripts/admin.card.toggle.group.js new file mode 100644 index 000000000..7d4953769 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.card.toggle.group.js @@ -0,0 +1,13 @@ +(function (global, doc) { + const togglers = doc.querySelectorAll('.ibexa-card__body-display-toggler'); + const toggleFieldTypeView = (event) => { + event.preventDefault(); + + event.currentTarget.closest('.ibexa-card--toggle-group').classList.toggle('ibexa-card--collapsed'); + }; + const attachToggleField = (btn) => btn.addEventListener('click', toggleFieldTypeView); + + togglers.forEach((btn) => attachToggleField(btn)); + + doc.body.addEventListener('ibexa-initialize-card-toggle-group', (event) => attachToggleField(event.detail.button)); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.content.edit.js b/public/bundles/ibexaadminui/js/scripts/admin.content.edit.js new file mode 100644 index 000000000..620c59b6d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.content.edit.js @@ -0,0 +1,207 @@ +(function (global, doc, ibexa, Translator, moment) { + const ENTER_KEY_CODE = 13; + const STATUS_ERROR = 'error'; + const STATUS_OFF = 'off'; + const STATUS_ON = 'on'; + const STATUS_SAVED = 'saved'; + const STATUS_SAVING = 'saving'; + const inputTypeToPreventSubmit = [ + 'checkbox', + 'color', + 'date', + 'datetime-local', + 'email', + 'file', + 'image', + 'month', + 'number', + 'radio', + 'range', + 'reset', + 'search', + 'select-one', + 'select-multiple', + 'tel', + 'text', + 'time', + 'url', + ]; + const form = doc.querySelector('.ibexa-form-validate'); + const submitBtns = form.querySelectorAll('[type="submit"]:not([formnovalidate])'); + const menuButtonsToValidate = doc.querySelectorAll('button[data-validate]'); + const fields = doc.querySelectorAll('.ibexa-field-edit'); + const getValidationResults = (validator) => { + const isValid = validator.isValid(); + const validatorName = validator.constructor.name; + const result = { isValid, validatorName }; + + return result; + }; + const getInvalidSections = (validator) => { + return validator.fieldsToValidate.reduce((invalidSections, field) => { + const section = field.item.closest('.ibexa-anchor-navigation-sections__section'); + + if (section && field.item.classList.contains('is-invalid')) { + invalidSections.add(section.dataset.anchorSectionId); + } + + return invalidSections; + }, new Set()); + }; + const focusOnFirstError = () => { + const invalidFields = doc.querySelectorAll('.ibexa-field-edit.is-invalid'); + + if (!invalidFields.length) { + return; + } + + const invalidSection = invalidFields[0].closest('.ibexa-anchor-navigation-sections__section'); + + fields.forEach((field) => field.removeAttribute('tabindex')); + invalidFields.forEach((field) => field.setAttribute('tabindex', '-1')); + + if (invalidSection) { + const { anchorSectionId } = invalidSection.dataset; + const invalidButton = doc.querySelector(`[data-anchor-target-section-id="${anchorSectionId}"`); + + invalidButton.click(); + } + + invalidFields[0].focus(); + }; + const clickHandler = (event) => { + const btn = event.currentTarget; + + if (parseInt(btn.dataset.isFormValid, 10)) { + return; + } + + event.preventDefault(); + + if (isFormValid(btn)) { + // for some reason trying to fire click event inside the event handler flow is impossible + // the following line breaks the flow so it's possible to fire click event on a button again. + global.setTimeout(() => btn.click(), 0); + } + }; + const validateHandler = (event) => { + event.preventDefault(); + + const btn = event.currentTarget; + + btn.dataset.isFormValid = 0; + + isFormValid(btn); + }; + const isFormValid = (btn) => { + const validators = ibexa.fieldTypeValidators; + const validationResults = validators.map(getValidationResults); + const isValid = validationResults.every((result) => result.isValid); + const invalidSections = validators.map(getInvalidSections); + + if (isValid) { + btn.dataset.isFormValid = 1; + + return true; + } + + const allValidatorsWithErrors = validationResults.filter((result) => !result.isValid).map((result) => result.validatorName); + + btn.dataset.validatorsWithErrors = [...new Set(allValidatorsWithErrors)].join(); + fields.forEach((field) => field.removeAttribute('id')); + + doc.querySelectorAll('.ibexa-anchor-navigation-menu__btn').forEach((anchorBtn) => { + anchorBtn.classList.remove('ibexa-anchor-navigation-menu__btn--invalid'); + }); + + invalidSections.forEach((sections) => { + sections.forEach((invalidSectionId) => { + doc.querySelector(`[data-anchor-target-section-id='${invalidSectionId}']`).classList.add( + 'ibexa-anchor-navigation-menu__btn--invalid', + ); + }); + }); + + focusOnFirstError(); + + return false; + }; + const isAutosaveEnabled = () => { + return ibexa.adminUiConfig.autosave.enabled && form.querySelector('[name="ezplatform_content_forms_content_edit[autosave]"]'); + }; + + if (isAutosaveEnabled()) { + const AUTOSAVE_SUBMIT_BUTTON_NAME = 'ezplatform_content_forms_content_edit[autosave]'; + const autosave = doc.querySelector('.ibexa-autosave'); + const autosaveStatusSavedNode = autosave.querySelector('.ibexa-autosave__status-saved'); + let currentAutosaveStatus = autosave.classList.contains('ibexa-autosave--on') ? STATUS_ON : STATUS_OFF; + const generateCssStatusClass = (status) => `ibexa-autosave--${status}`; + const setAutosaveStatus = (newStatus) => { + if (!autosave) { + return; + } + + const oldCssStatusClass = generateCssStatusClass(currentAutosaveStatus); + const newCssStatusClass = generateCssStatusClass(newStatus); + + autosave.classList.remove(oldCssStatusClass); + autosave.classList.remove('ibexa-autosave--saved'); + autosave.classList.add(newCssStatusClass); + + currentAutosaveStatus = newStatus; + }; + const setDraftSavedMessage = () => { + if (!autosave) { + return; + } + + const userPreferredTimezone = ibexa.adminUiConfig.timezone; + const saveDate = ibexa.helpers.timezone.convertDateToTimezone(new Date(), userPreferredTimezone); + const saveTime = moment(saveDate).formatICU('HH:mm'); + const saveMessage = Translator.trans( + /*@Desc("Draft saved %time%")*/ 'content_edit.autosave.status_saved.message.full', + { time: saveTime }, + 'content', + ); + + autosaveStatusSavedNode.innerHTML = saveMessage; + autosave.classList.add('ibexa-autosave--saved'); + }; + + setInterval(() => { + const formData = new FormData(form); + + formData.set(AUTOSAVE_SUBMIT_BUTTON_NAME, true); + setAutosaveStatus(STATUS_SAVING); + + fetch(form.target || window.location.href, { method: 'POST', body: formData }) + .then(ibexa.helpers.request.getStatusFromResponse) + .then(() => { + setAutosaveStatus(STATUS_SAVED); + setDraftSavedMessage(); + }) + .catch(() => { + setAutosaveStatus(STATUS_ERROR); + }); + }, ibexa.adminUiConfig.autosave.interval); + } + + form.setAttribute('novalidate', true); + form.onkeypress = (event) => { + const keyCode = event.charCode || event.keyCode || 0; + const activeElementType = typeof doc.activeElement.type !== 'undefined' ? doc.activeElement.type.toLowerCase() : ''; + + if (keyCode === ENTER_KEY_CODE && inputTypeToPreventSubmit.includes(activeElementType)) { + event.preventDefault(); + } + }; + + submitBtns.forEach((btn) => { + btn.dataset.isFormValid = 0; + btn.addEventListener('click', clickHandler, false); + }); + + menuButtonsToValidate.forEach((btn) => { + btn.addEventListener('click', validateHandler, false); + }); +})(window, window.document, window.ibexa, window.Translator, window.moment); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.content.tree.js b/public/bundles/ibexaadminui/js/scripts/admin.content.tree.js new file mode 100644 index 000000000..758f80be3 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.content.tree.js @@ -0,0 +1,36 @@ +(function (global, doc, React, ReactDOM, ibexa) { + const contentTreeContainer = doc.querySelector('.ibexa-content-tree-container'); + + if (!contentTreeContainer) { + return; + } + + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const contentTreeRootElement = doc.querySelector('.ibexa-content-tree-container__root'); + const { currentLocationPath, treeRootLocationId } = contentTreeContainer.dataset; + const userId = window.ibexa.helpers.user.getId(); + const removeContentTreeContainerWidth = (event) => { + if (event.detail.id !== 'ibexa-content-tree') { + return; + } + + contentTreeContainer.style.width = null; + }; + const renderTree = () => { + const contentTreeRoot = ReactDOM.createRoot(contentTreeRootElement); + + contentTreeRoot.render( + React.createElement(ibexa.modules.ContentTree, { + userId, + currentLocationPath, + rootLocationId: parseInt(treeRootLocationId, 10), + restInfo: { token, siteaccess }, + }), + ); + }; + + doc.body.addEventListener('ibexa-tb-rendered', removeContentTreeContainerWidth); + + renderTree(); +})(window, window.document, window.React, window.ReactDOM, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.contenttype.copy.js b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.copy.js new file mode 100644 index 000000000..af8a99514 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.copy.js @@ -0,0 +1,16 @@ +(function (global, doc, ibexa, Routing) { + const copyButtons = doc.querySelectorAll('.ibexa-btn--copy-content-type'); + const copyContentType = ({ currentTarget }) => { + const contentTypeCopyForm = doc.querySelector('form[name="content_type_copy"]'); + const contentTypeIdentifierInput = contentTypeCopyForm.querySelector('#content_type_copy_content_type'); + const { contentTypeId, contentTypeIdentifier, contentTypeGroupId } = currentTarget.dataset; + const formAction = Routing.generate('ibexa.content_type.copy', { contentTypeId, contentTypeGroupId }); + + contentTypeIdentifierInput.value = contentTypeIdentifier; + contentTypeCopyForm.action = formAction; + + contentTypeCopyForm.submit(); + }; + + copyButtons.forEach((copyButton) => copyButton.addEventListener('click', copyContentType, false)); +})(window, window.document, window.ibexa, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.contenttype.edit.js b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.edit.js new file mode 100644 index 000000000..46038d8e4 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.edit.js @@ -0,0 +1,652 @@ +(function (global, doc, ibexa, Routing, Translator, bootstrap) { + const SELECTOR_INPUTS_TO_VALIDATE = '.ibexa-input[required]:not([disabled]):not([hidden])'; + const SELETOR_FIELD_INPUTS = + '.ibexa-input-text-wrapper:not(.ibexa-input-text-wrapper--search) > input.ibexa-input--text:not([hidden]):not(ibexa-input-text-wrapper--search)'; + const TIMEOUT_REMOVE_HIGHLIGHT = 3000; + let sourceContainer = null; + let currentDraggedItem = null; + let isEditFormValid = false; + const editForm = doc.querySelector('.ibexa-content-type-edit-form'); + let inputsToValidate = editForm.querySelectorAll(SELECTOR_INPUTS_TO_VALIDATE); + const draggableGroups = []; + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const sectionsNode = doc.querySelector('.ibexa-content-type-edit__sections'); + const filterFieldInput = doc.querySelector('.ibexa-available-field-types__sidebar-filter'); + const popupMenuElement = sectionsNode.querySelector('.ibexa-popup-menu'); + const addGroupTriggerBtn = sectionsNode.querySelector('.ibexa-content-type-edit__add-field-definitions-group-btn'); + const fieldDefinitionsGroups = doc.querySelectorAll('.ibexa-collapse--field-definitions-group'); + const noFieldsAddedError = Translator.trans( + /*@Desc("You have to add at least one field definition")*/ 'content_type.edit.error.no_added_fields_definition', + {}, + 'content_type', + ); + const endpoints = { + add: { + actionName: 'add_field_definition', + method: 'POST', + contentType: 'application/vnd.ibexa.api.ContentTypFieldDefinitionCreate+json', + }, + remove: { + actionName: 'remove_field_definition', + method: 'DELETE', + contentType: 'application/vnd.ibexa.api.ContentTypeFieldDefinitionDelete+json', + }, + reorder: { + actionName: 'reorder_field_definitions', + method: 'PUT', + contentType: 'application/vnd.ibexa.api.ContentTypeFieldDefinitionReorder+json', + }, + }; + new ibexa.core.PopupMenu({ + popupMenuElement, + triggerElement: addGroupTriggerBtn, + onItemClick: (event) => { + const { relatedCollapseSelector } = event.currentTarget.dataset; + + doc.querySelector(relatedCollapseSelector).classList.remove('ibexa-collapse--hidden'); + afterChangeGroup(); + toggleAddGroupTriggerBtnState(); + }, + }); + const toggleAddGroupTriggerBtnState = () => { + const addGroupBtns = doc.querySelectorAll('.ibexa-content-type-edit__add-field-definitions-group [data-related-collapse-selector]'); + const areAllAddGroupBtnsDisabled = [...addGroupBtns].every((btn) => + btn.classList.contains('ibexa-popup-menu__item-content--disabled'), + ); + const isAddGroupTriggerBtnDisabled = addGroupTriggerBtn.dataset.isDisabled == 'true'; + + addGroupTriggerBtn.disabled = isAddGroupTriggerBtnDisabled || areAllAddGroupBtnsDisabled; + }; + const searchField = (event) => { + const fieldFilterQueryLowerCase = event.currentTarget.value.toLowerCase(); + const fields = doc.querySelectorAll('.ibexa-available-field-types__list .ibexa-available-field-type'); + + fields.forEach((field) => { + const fieldNameNode = field.querySelector('.ibexa-available-field-type__label'); + const fieldNameLowerCase = fieldNameNode.innerText.toLowerCase(); + const isFieldHidden = !fieldNameLowerCase.includes(fieldFilterQueryLowerCase); + + field.classList.toggle('ibexa-available-field-type--hidden', isFieldHidden); + }); + }; + const removeDragPlaceholders = () => { + const placeholderNodes = doc.querySelectorAll('.ibexa-field-definitions-placeholder'); + + placeholderNodes.forEach((placeholderNode) => placeholderNode.remove()); + }; + const createFieldDefinitionNode = (fieldNode, { targetContainer, draggedItemPosition }) => { + let targetPlace = ''; + const items = targetContainer.querySelectorAll('.ibexa-collapse'); + + if (typeof fieldNode === 'string') { + const container = doc.createElement('div'); + + container.insertAdjacentHTML('beforeend', fieldNode); + fieldNode = container.querySelector('.ibexa-collapse'); + } + + if (draggedItemPosition === -1) { + targetPlace = targetContainer.lastChild; + } else if (draggedItemPosition === 0) { + targetPlace = targetContainer.firstChild; + } else { + targetPlace = [...items].find((item, index) => index === draggedItemPosition); + } + + fieldNode.classList.add('ibexa-collapse--field-definition-highlighted'); + targetContainer.insertBefore(fieldNode, targetPlace); + + return fieldNode; + }; + const attachFieldDefinitionNodeEvents = (fieldNode, { targetContainer }) => { + const fieldGroupInput = fieldNode.querySelector('.ibexa-input--field-group'); + const fieldDefinitionsInputs = fieldNode.querySelectorAll(SELETOR_FIELD_INPUTS); + const removeFieldBtns = fieldNode.querySelectorAll('.ibexa-collapse__extra-action-button--remove-field-definitions'); + const fieldInputsToValidate = fieldNode.querySelectorAll(SELECTOR_INPUTS_TO_VALIDATE); + const groupCollapseNode = targetContainer.closest('.ibexa-collapse--field-definitions-group'); + const { fieldsGroupId } = groupCollapseNode.dataset; + + fieldInputsToValidate.forEach(attachValidateEvents); + fieldGroupInput.value = fieldsGroupId; + removeFieldBtns.forEach((removeFieldBtn) => { + removeFieldBtn.addEventListener('click', removeField, false); + }); + + if (navigator.userAgent.includes('Firefox')) { + fieldDefinitionsInputs.forEach((fieldDefinitionsInput) => { + fieldDefinitionsInput.addEventListener('mouseenter', mouseEnterInputHandlerForFirefox, false); + fieldDefinitionsInput.addEventListener('mouseleave', mouseLeaveInputHandlerForFirefox, false); + }); + } + + const dropdowns = fieldNode.querySelectorAll('.ibexa-dropdown'); + + dropdowns.forEach((dropdownContainer) => { + const dropdownAlreadyInitialized = !!ibexa.helpers.objectInstances.getInstance(dropdownContainer); + + if (dropdownAlreadyInitialized) { + return; + } + + const dropdown = new ibexa.core.Dropdown({ + container: dropdownContainer, + }); + + dropdown.init(); + }); + + draggableGroups.forEach((group) => { + group.reinit(); + }); + }; + const dispatchInsertFieldDefinitionNode = (fieldNode) => { + doc.body.dispatchEvent(new CustomEvent('ibexa-inputs:added')); + doc.body.dispatchEvent( + new CustomEvent('ibexa-drop-field-definition', { + detail: { nodes: [fieldNode] }, + }), + ); + }; + const insertFieldDefinitionNode = (fieldNode, { targetContainer, draggedItemPosition }) => { + const fieldDefinitionNode = createFieldDefinitionNode(fieldNode, { targetContainer, draggedItemPosition }); + + removeDragPlaceholders(); + attachFieldDefinitionNodeEvents(fieldDefinitionNode, { targetContainer }); + dispatchInsertFieldDefinitionNode(fieldDefinitionNode); + + return fieldDefinitionNode; + }; + const generateRequest = (action, bodyData, languageCode) => { + const { actionName, method, contentType } = endpoints[action]; + const { contentTypeGroupId, contentTypeId } = sectionsNode.dataset; + let endpointURL = `/api/ibexa/v2/contenttypegroup/${contentTypeGroupId}/contenttype/${contentTypeId}/${actionName}`; + + if (languageCode) { + endpointURL += `/${languageCode}`; + } + + return new Request(endpointURL, { + method, + mode: 'same-origin', + credentials: 'same-origin', + headers: { + Accept: 'application/html', + 'Content-Type': contentType, + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + body: JSON.stringify(bodyData), + }); + }; + const afterChangeGroup = () => { + const groups = doc.querySelectorAll('.ibexa-collapse--field-definitions-group'); + const itemsAction = doc.querySelectorAll('.ibexa-content-type-edit__add-field-definitions-group .ibexa-popup-menu__item-content'); + + groups.forEach((group) => { + const groupFieldsDefinitionCount = group.querySelectorAll('.ibexa-collapse--field-definition').length; + const emptyGroupPlaceholder = group.querySelector('.ibexa-field-definitions-empty-group'); + const removeBtn = group.querySelector('.ibexa-collapse__extra-action-button--remove-field-definitions-group'); + + emptyGroupPlaceholder.classList.toggle('ibexa-field-definitions-empty-group--hidden', groupFieldsDefinitionCount !== 0); + removeBtn.disabled = groupFieldsDefinitionCount > 0; + }); + + itemsAction.forEach((itemAction) => { + const { relatedCollapseSelector } = itemAction.dataset; + const isGroupHidden = doc.querySelector(relatedCollapseSelector).classList.contains('ibexa-collapse--hidden'); + + itemAction.classList.toggle('ibexa-popup-menu__item-content--disabled', !isGroupHidden); + }); + + doc.querySelectorAll('.ibexa-collapse--field-definition').forEach((fieldDefinition, index) => { + const positionInput = fieldDefinition.querySelector('.ibexa-input--position'); + + if (positionInput) { + fieldDefinition.querySelector('.ibexa-input--position').value = index; + } + }); + }; + const addField = ({ targetContainer, draggedItemPosition, fieldRendered }) => { + if (!sourceContainer.classList.contains('ibexa-available-field-types__list')) { + const insertedField = insertFieldDefinitionNode(currentDraggedItem, { targetContainer, draggedItemPosition }); + + insertedField.classList.add('ibexa-collapse--field-definition-loading'); + + afterChangeGroup(); + + global.setTimeout(() => { + insertedField.classList.remove('ibexa-collapse--field-definition-loading'); + + removeHighlight(insertedField); + }, TIMEOUT_REMOVE_HIGHLIGHT); + + return; + } + + const { languageCode } = sectionsNode.dataset; + const { itemIdentifier } = currentDraggedItem.dataset; + const { fieldsGroupId } = targetContainer.closest('.ibexa-collapse--field-definitions-group').dataset; + const loadingField = createFieldDefinitionNode(fieldRendered, { targetContainer, draggedItemPosition }); + let addedField = loadingField; + + const bodyData = { + FieldDefinitionCreate: { + fieldTypeIdentifier: itemIdentifier, + fieldGroupIdentifier: fieldsGroupId, + }, + }; + + if (draggedItemPosition !== -1) { + bodyData.FieldDefinitionCreate.position = draggedItemPosition; + } + + global.setTimeout(() => { + removeHighlight(addedField); + }, TIMEOUT_REMOVE_HIGHLIGHT); + + fetch(generateRequest('add', bodyData, languageCode)) + .then(ibexa.helpers.request.getTextFromResponse) + .then((response) => { + const shouldRemoveHighlight = loadingField.classList.contains( + 'ibexa-collapse--field-definition-highlight-marked-to-remove', + ); + const insertedField = insertFieldDefinitionNode(response, { targetContainer, draggedItemPosition }); + + addedField = insertedField; + + if (shouldRemoveHighlight) { + insertedField.classList.remove('ibexa-collapse--field-definition-highlighted'); + } + + loadingField?.remove(); + afterChangeGroup(); + }) + .catch(ibexa.helpers.notification.showErrorNotification); + }; + const reorderFields = ({ targetContainer, draggedItemPosition }) => { + const reorderedField = createFieldDefinitionNode(currentDraggedItem, { targetContainer, draggedItemPosition }); + removeDragPlaceholders(); + + reorderedField.classList.add('ibexa-collapse--field-definition-highlighted'); + reorderedField.classList.add('ibexa-collapse--field-definition-loading'); + + const fieldsOrder = [...doc.querySelectorAll('.ibexa-collapse--field-definition')].map( + (fieldDefinition) => fieldDefinition.dataset.fieldDefinitionIdentifier, + ); + const bodyData = { + FieldDefinitionReorder: { + fieldDefinitionIdentifiers: fieldsOrder, + }, + }; + const request = generateRequest('reorder', bodyData); + + global.setTimeout(() => { + removeHighlight(reorderedField); + }, TIMEOUT_REMOVE_HIGHLIGHT); + + fetch(request) + .then(ibexa.helpers.request.getTextFromResponse) + .then(() => { + reorderedField.classList.remove('ibexa-collapse--field-definition-loading'); + afterChangeGroup(); + }) + .catch(ibexa.helpers.notification.showErrorNotification); + }; + const removeFieldsGroup = (event) => { + if (event.currentTarget.hasAttribute('disabled')) { + return; + } + + const collapseNode = event.currentTarget.closest('.ibexa-collapse'); + const fieldsToDelete = [...collapseNode.querySelectorAll('.ibexa-collapse--field-definition')].map( + (fieldDefinition) => fieldDefinition.dataset.fieldDefinitionIdentifier, + ); + const bodyData = { + FieldDefinitionDelete: { + fieldDefinitionIdentifiers: fieldsToDelete, + }, + }; + + fetch(generateRequest('remove', bodyData)) + .then(ibexa.helpers.request.getTextFromResponse) + .then(() => { + collapseNode.classList.add('ibexa-collapse--hidden'); + collapseNode.querySelectorAll('.ibexa-collapse--field-definition').forEach((fieldDefinition) => { + fieldDefinition.remove(); + }); + afterChangeGroup(); + toggleAddGroupTriggerBtnState(); + }) + .catch(ibexa.helpers.notification.showErrorNotification); + }; + const removeField = (event) => { + const collapseNode = event.currentTarget.closest('.ibexa-collapse'); + const itemToDeleteIdentifiers = collapseNode.dataset.fieldDefinitionIdentifier; + const bodyData = { + FieldDefinitionDelete: { + fieldDefinitionIdentifiers: [itemToDeleteIdentifiers], + }, + }; + + collapseNode.classList.add('ibexa-collapse--field-definition-removing'); + bootstrap.Collapse.getOrCreateInstance(collapseNode.querySelector('.ibexa-collapse__body'), { + toggle: false, + }).hide(); + event.currentTarget.blur(); + + fetch(generateRequest('remove', bodyData)) + .then(ibexa.helpers.request.getTextFromResponse) + .then(() => { + collapseNode.classList.add('ibexa-collapse--field-definition-remove-animation'); + + collapseNode.addEventListener('animationend', () => { + collapseNode.remove(); + afterChangeGroup(); + }); + }) + .catch(ibexa.helpers.notification.showErrorNotification); + }; + const toggleDraggableForFirefox = (input, isMouseEnterEvent) => { + const fieldDefinitionNode = input.closest('.ibexa-collapse--field-definition'); + const collapseBodyNode = fieldDefinitionNode.querySelector('.ibexa-collapse__body'); + + fieldDefinitionNode.setAttribute('draggable', !isMouseEnterEvent); + collapseBodyNode.setAttribute('draggable', !isMouseEnterEvent); + }; + const mouseEnterInputHandlerForFirefox = ({ currentTarget, type }) => { + toggleDraggableForFirefox(currentTarget, type === 'mouseenter'); + }; + const mouseLeaveInputHandlerForFirefox = ({ currentTarget, type }) => { + toggleDraggableForFirefox(currentTarget, type === 'mouseenter'); + }; + const validateInput = (input) => { + const isInputEmpty = !input.value; + const field = input.closest('.form-group'); + const labelNode = field.querySelector('.ibexa-label'); + const errorNode = field.querySelector('.ibexa-form-error'); + + input.classList.toggle('is-invalid', isInputEmpty); + + if (errorNode) { + errorNode.innerHTML = ''; + + if (isInputEmpty) { + const fieldName = labelNode.innerHTML; + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', fieldName); + const formattedError = ibexa.helpers.formValidation.formatErrorLine(errorMessage); + + errorNode.append(formattedError); + } + } + + isEditFormValid = isEditFormValid && !isInputEmpty; + }; + const validateForm = () => { + const fieldDefinitionsStatuses = {}; + + isEditFormValid = true; + inputsToValidate = editForm.querySelectorAll(SELECTOR_INPUTS_TO_VALIDATE); + + inputsToValidate.forEach((input) => { + const fieldDefinition = input.closest('.ibexa-collapse--field-definition'); + + if (fieldDefinition) { + const { fieldDefinitionIdentifier } = fieldDefinition.dataset; + const isInputEmpty = !input.value; + + if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) { + fieldDefinitionsStatuses[fieldDefinitionIdentifier] = []; + } + + fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(isInputEmpty); + } + + validateInput(input); + }); + + Object.entries(fieldDefinitionsStatuses).forEach(([fieldDefinitionIdentifier, inputsStatus]) => { + const isFieldDefinitionValid = inputsStatus.every((hasError) => !hasError); + const fieldDefinitionNode = doc.querySelector(`[data-field-definition-identifier="${fieldDefinitionIdentifier}"]`); + + fieldDefinitionNode.classList.toggle('is-invalid', !isFieldDefinitionValid); + }); + }; + const attachValidateEvents = (input) => { + input.addEventListener('change', validateForm, false); + input.addEventListener('blur', validateForm, false); + input.addEventListener('input', validateForm, false); + }; + const scrollToInvalidInput = () => { + const firstInvalidInput = editForm.querySelector('.ibexa-input.is-invalid'); + const fieldDefinition = firstInvalidInput.closest('.ibexa-collapse--field-definition'); + const scrollToNode = fieldDefinition ?? firstInvalidInput; + + scrollToNode.scrollIntoView({ behavior: 'smooth' }); + }; + const setActiveGroup = (group) => { + const currentActiveGroup = doc.querySelector( + '.ibexa-collapse--field-definitions-group.ibexa-collapse--active-field-definitions-group', + ); + + currentActiveGroup?.classList.remove('ibexa-collapse--active-field-definitions-group'); + group.classList.add('ibexa-collapse--active-field-definitions-group'); + }; + const removeHighlight = (field) => { + const fieldIsStillLoading = field.classList.contains('ibexa-collapse--field-definition-loading'); + + if (fieldIsStillLoading) { + field.classList.add('ibexa-collapse--field-definition-highlight-marked-to-remove'); + } else { + field.classList.remove('ibexa-collapse--field-definition-highlighted'); + } + }; + class FieldDefinitionDraggable extends ibexa.core.Draggable { + constructor(config) { + super(config); + + this.emptyContainer = this.itemsContainer.querySelector('.ibexa-field-definitions-empty-group'); + + this.getPlaceholderNode = this.getPlaceholderNode.bind(this); + this.getPlaceholderPositionTop = this.getPlaceholderPositionTop.bind(this); + } + + onDrop(event) { + const targetContainer = event.currentTarget; + const dragContainerItems = targetContainer.querySelectorAll( + '.ibexa-collapse--field-definition, .ibexa-field-definitions-placeholder', + ); + const targetContainerGroup = targetContainer.closest('.ibexa-collapse--field-definitions-group'); + const targetContainerList = targetContainerGroup.closest('.ibexa-content-type-edit__field-definitions-group-list'); + const fieldTemplate = targetContainerList.dataset.template; + const fieldRendered = fieldTemplate.replace('{{ type }}', currentDraggedItem.dataset.itemIdentifier); + let draggedItemPosition = [...dragContainerItems].findIndex((item, index, array) => { + return item.classList.contains('ibexa-field-definitions-placeholder') && index < array.length - 1; + }); + + if (draggedItemPosition === -1) { + draggedItemPosition = targetContainer.querySelectorAll('.ibexa-collapse--field-definition').length; + } + + if (sourceContainer.isEqualNode(targetContainer)) { + reorderFields({ targetContainer, draggedItemPosition }); + } else { + addField({ targetContainer, draggedItemPosition, fieldRendered }); + } + + setActiveGroup(targetContainerGroup); + removeDragPlaceholders(); + } + + getPlaceholderNode(event) { + const draggableItem = super.getPlaceholderNode(event); + + if (draggableItem) { + return draggableItem; + } + + if (this.emptyContainer.contains(event.target)) { + return this.emptyContainer; + } + + return null; + } + + onDragStart(event) { + super.onDragStart(event); + + currentDraggedItem = event.currentTarget; + sourceContainer = currentDraggedItem.parentNode; + } + + onDragOver(event) { + const isDragSuccessful = super.onDragOver(event); + + if (!isDragSuccessful) { + return false; + } + + const item = this.getPlaceholderNode(event); + + if (item.isSameNode(this.emptyContainer)) { + this.emptyContainer.classList.toggle('ibexa-field-definitions-empty-group--hidden'); + } + + return true; + } + + onDragEnd() { + currentDraggedItem.style.removeProperty('display'); + } + + init() { + super.init(); + + doc.body.addEventListener('dragover', (event) => { + if (!this.itemsContainer.contains(event.target)) { + const groupFieldsDefinitionCount = this.itemsContainer.querySelectorAll('.ibexa-collapse--field-definition').length; + + this.emptyContainer.classList.toggle('ibexa-field-definitions-empty-group--hidden', groupFieldsDefinitionCount !== 0); + } else { + event.preventDefault(); + } + }); + } + } + + filterFieldInput.addEventListener('keyup', searchField, false); + filterFieldInput.addEventListener('input', searchField, false); + + const firstFieldDefinitionsGroupContent = doc.querySelector('.ibexa-content-type-edit__section .ibexa-field-definitions-group-content'); + + if (firstFieldDefinitionsGroupContent) { + firstFieldDefinitionsGroupContent.classList.add('ibexa-collapse--active-field-definitions-group'); + } + + if (navigator.userAgent.includes('Firefox')) { + doc.querySelectorAll(`.ibexa-collapse--field-definition ${SELETOR_FIELD_INPUTS}`).forEach((inputField) => { + inputField.addEventListener('mouseenter', mouseEnterInputHandlerForFirefox, false); + inputField.addEventListener('mouseleave', mouseLeaveInputHandlerForFirefox, false); + }); + } + + doc.querySelectorAll('.ibexa-collapse__extra-action-button--remove-field-definitions').forEach((removeFieldDefinitionsBtn) => { + removeFieldDefinitionsBtn.addEventListener('click', removeField, false); + }); + doc.querySelectorAll('.ibexa-collapse__extra-action-button--remove-field-definitions-group').forEach( + (removeFieldDefinitionsGroupBtn) => { + const groupFieldsDefinitionCount = removeFieldDefinitionsGroupBtn + .closest('.ibexa-collapse--field-definitions-group') + .querySelectorAll('.ibexa-collapse--field-definition').length; + + removeFieldDefinitionsGroupBtn.toggleAttribute('disabled', groupFieldsDefinitionCount > 0); + removeFieldDefinitionsGroupBtn.addEventListener('click', removeFieldsGroup, false); + }, + ); + + doc.querySelectorAll('.ibexa-available-field-types__list .ibexa-available-field-type').forEach((availableField) => { + availableField.addEventListener( + 'dragstart', + (event) => { + currentDraggedItem = event.currentTarget; + sourceContainer = currentDraggedItem.parentNode; + currentDraggedItem.classList.add('ibexa-available-field-type--is-dragging-out'); + }, + false, + ); + availableField.addEventListener( + 'dragend', + () => { + currentDraggedItem.classList.remove('ibexa-available-field-type--is-dragging-out'); + }, + false, + ); + availableField.addEventListener( + 'click', + (event) => { + const targetContainer = doc.querySelector( + '.ibexa-collapse--field-definitions-group.ibexa-collapse--active-field-definitions-group .ibexa-content-type-edit__field-definition-drop-zone', + ); + + if (!targetContainer) { + return; + } + + currentDraggedItem = event.currentTarget; + sourceContainer = currentDraggedItem.parentNode; + + const draggedItemPosition = targetContainer.querySelectorAll('.ibexa-collapse--field-definition').length; + const targetContainerGroup = targetContainer.closest('.ibexa-collapse--field-definitions-group'); + const targetContainerList = targetContainerGroup.closest('.ibexa-content-type-edit__field-definitions-group-list'); + const fieldTemplate = targetContainerList.dataset.template; + const fieldRendered = fieldTemplate.replace('{{ type }}', currentDraggedItem.dataset.itemIdentifier); + + targetContainer + .querySelector('.ibexa-field-definitions-empty-group') + .classList.add('ibexa-field-definitions-empty-group--hidden'); + addField({ targetContainer, draggedItemPosition, fieldRendered }); + }, + false, + ); + }); + doc.querySelectorAll('.ibexa-content-type-edit__field-definition-drop-zone').forEach((collapseContentNode) => { + const draggable = new FieldDefinitionDraggable({ + itemsContainer: collapseContentNode, + selectorItem: '.ibexa-collapse--field-definition', + selectorPlaceholder: '.ibexa-field-definitions-placeholder', + selectorPreventDrag: '.ibexa-collapse__body', + }); + + draggable.init(); + draggableGroups.push(draggable); + }); + + fieldDefinitionsGroups.forEach((group) => group.addEventListener('click', () => setActiveGroup(group), false)); + inputsToValidate.forEach(attachValidateEvents); + + editForm.addEventListener( + 'submit', + (event) => { + const { submitter } = event; + + if (!submitter?.hasAttribute('formnovalidate')) { + const fieldDefinitionsCount = doc.querySelectorAll('.ibexa-collapse--field-definition').length; + + validateForm(); + + if (isEditFormValid) { + if (!fieldDefinitionsCount) { + event.preventDefault(); + ibexa.helpers.notification.showErrorNotification(noFieldsAddedError); + } + } else { + event.preventDefault(); + scrollToInvalidInput(); + } + } + }, + false, + ); + + toggleAddGroupTriggerBtnState(); +})(window, window.document, window.ibexa, window.Routing, window.Translator, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.contenttype.relation.default.location.js b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.relation.default.location.js new file mode 100644 index 000000000..48aad659d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.relation.default.location.js @@ -0,0 +1,104 @@ +(function (global, doc, ibexa, React, ReactDOM) { + const SELECTOR_RESET_STARTING_LOCATION_BTN = '.ibexa-tag__remove-btn'; + const defaultLocationContainers = doc.querySelectorAll('.ibexa-default-location'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const renderTagItem = (container, [item]) => { + const template = container.dataset.template.replaceAll('{{ content }}', item.name); + + container.innerHTML = template; + + const deleteBtn = container.querySelector(SELECTOR_RESET_STARTING_LOCATION_BTN); + + ibexa.helpers.ellipsis.middle.parseAll(); + + deleteBtn.addEventListener('click', resetStartingLocation, false); + }; + const onConfirm = (btn, items) => { + closeUDW(); + + const locationId = items[0].id; + const container = btn.closest('.ibexa-default-location'); + const pathSelector = container.querySelector('.ibexa-default-location__path-selector'); + + container.querySelector(btn.dataset.relationRootInputSelector).value = locationId; + + pathSelector.classList.add('ibexa-default-location__path-selector--filled'); + + ibexa.helpers.tagViewSelect.buildItemsFromUDWResponse( + items, + (item) => item.pathString, + renderTagItem.bind(null, container.querySelector('.ibexa-default-location__selected-path')), + ); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: onConfirm.bind(null, event.currentTarget), + onCancel, + title: event.currentTarget.dataset.universaldiscoveryTitle, + multiple: false, + ...config, + }), + ); + }; + const resetStartingLocation = ({ currentTarget }) => { + const container = currentTarget.closest('.ibexa-default-location'); + const udwBtn = container.querySelector('.ibexa-btn--udw-relation-default-location'); + const pathSelector = container.querySelector('.ibexa-default-location__path-selector'); + const { relationRootInputSelector } = udwBtn.dataset; + + container.querySelector(relationRootInputSelector).value = ''; + container.querySelector('.ibexa-default-location__selected-path').innerHTML = ''; + pathSelector.classList.remove('ibexa-default-location__path-selector--filled'); + }; + const attachEvents = (container) => { + const udwBtn = container.querySelector('.ibexa-btn--udw-relation-default-location'); + const deleteBtn = container.querySelector(SELECTOR_RESET_STARTING_LOCATION_BTN); + const choices = container.querySelectorAll('input[type="radio"]'); + + udwBtn.addEventListener('click', openUDW, false); + deleteBtn?.addEventListener('click', resetStartingLocation, false); + choices.forEach((choice) => choice.addEventListener('change', toggleDisabledState.bind(null, container), false)); + }; + const toggleDisabledState = (container) => { + const locationBtn = container.querySelector('.ibexa-btn--udw-relation-default-location'); + const deleteBtn = container.querySelector(SELECTOR_RESET_STARTING_LOCATION_BTN); + const isDisabled = !container.querySelector('input[value="1"]').checked; + + locationBtn.classList.toggle('disabled', isDisabled); + deleteBtn?.classList.toggle('disabled', isDisabled); + }; + + doc.body.addEventListener( + 'ibexa-drop-field-definition', + (event) => { + const { nodes } = event.detail; + + nodes.forEach((node) => { + const defaultLocationContainer = node.querySelector('.ibexa-default-location'); + + if (!defaultLocationContainer) { + return; + } + + attachEvents(defaultLocationContainer); + toggleDisabledState(defaultLocationContainer); + }); + }, + false, + ); + + defaultLocationContainers.forEach((defaultLocationContainer) => { + attachEvents(defaultLocationContainer); + toggleDisabledState(defaultLocationContainer); + ibexa.helpers.ellipsis.middle.parseAll(); + }); +})(window, window.document, window.ibexa, window.React, window.ReactDOM); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.contenttype.selection.js b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.selection.js new file mode 100644 index 000000000..11ef22928 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.contenttype.selection.js @@ -0,0 +1,50 @@ +(function (global, doc) { + const SELECTOR_TEMPLATE = '.ezselection-settings-option-value-prototype'; + const SELECTOR_OPTION = '.ezselection-settings-option-value'; + const SELECTOR_OPTIONS_LIST = '.ezselection-settings-option-list'; + const SELECTOR_BTN_REMOVE = '.ezselection-settings-option-remove'; + const SELECTOR_BTN_ADD = '.ezselection-settings-option-add'; + const NUMBER_PLACEHOLDER = /__number__/g; + const initField = (container) => { + const findCheckedOptions = () => container.querySelectorAll('.ezselection-settings-option-checkbox:checked'); + const toggleDisableState = () => { + const disabledState = !!findCheckedOptions().length; + const methodName = disabledState ? 'removeAttribute' : 'setAttribute'; + + container.querySelector(SELECTOR_BTN_REMOVE)[methodName]('disabled', disabledState); + }; + const addOption = () => { + const template = container.querySelector(SELECTOR_TEMPLATE).innerHTML; + const optionsList = container.querySelector(SELECTOR_OPTIONS_LIST); + const nextId = parseInt(optionsList.dataset.nextOptionId, 10); + + optionsList.dataset.nextOptionId = nextId + 1; + optionsList.insertAdjacentHTML('beforeend', template.replace(NUMBER_PLACEHOLDER, nextId)); + }; + const removeOptions = () => { + findCheckedOptions().forEach((element) => element.closest(SELECTOR_OPTION).remove()); + toggleDisableState(); + }; + + container.querySelector(SELECTOR_OPTIONS_LIST).addEventListener('click', toggleDisableState, false); + container.querySelector(SELECTOR_BTN_ADD).addEventListener('click', addOption, false); + container.querySelector(SELECTOR_BTN_REMOVE).addEventListener('click', removeOptions, false); + }; + + doc.querySelectorAll('.ezselection-settings.options').forEach(initField); + doc.body.addEventListener( + 'ibexa-drop-field-definition', + (event) => { + const { nodes } = event.detail; + + nodes.forEach((node) => { + const isSelectionFieldType = node.querySelector(SELECTOR_OPTIONS_LIST); + + if (isSelectionFieldType) { + initField(node); + } + }); + }, + false, + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.context.menu.js b/public/bundles/ibexaadminui/js/scripts/admin.context.menu.js new file mode 100644 index 000000000..5b59920fb --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.context.menu.js @@ -0,0 +1,61 @@ +(function (global, doc, ibexa) { + const adapatItemsContainer = doc.querySelector('.ibexa-context-menu'); + + if (!adapatItemsContainer) { + return; + } + + const menuButtons = [...adapatItemsContainer.querySelectorAll('.ibexa-context-menu__item > .ibexa-btn:not(.ibexa-btn--more)')]; + const popupMenuElement = adapatItemsContainer.querySelector('.ibexa-popup-menu'); + const showPopupButton = adapatItemsContainer.querySelector('.ibexa-btn--more'); + + if (!showPopupButton) { + return; + } + + const adaptiveItems = new ibexa.core.AdaptiveItems({ + itemHiddenClass: 'ibexa-context-menu__item--hidden', + container: adapatItemsContainer, + getActiveItem: () => { + return adapatItemsContainer.querySelector('.ibexa-context-menu__item'); + }, + onAdapted: (visibleItems, hiddenItems) => { + const hiddenButtonsIds = [...hiddenItems].map((item) => item.querySelector('.ibexa-btn').id); + + popupMenu.toggleItems((popupMenuItem) => !hiddenButtonsIds.includes(popupMenuItem.dataset.relatedButtonId)); + }, + }); + const popupMenu = new ibexa.core.PopupMenu({ + popupMenuElement, + triggerElement: showPopupButton, + onItemClick: (event) => { + const { relatedButtonId } = event.currentTarget.dataset; + const button = doc.getElementById(relatedButtonId); + + button.click(); + }, + }); + const popupItemsToGenerate = [...menuButtons].map((button) => { + const relatedButtonId = button.id; + const label = button.querySelector('.ibexa-btn__label').textContent; + + return { + label, + relatedButtonId, + disabled: button.disabled, + }; + }); + + popupMenu.generateItems(popupItemsToGenerate, (itemElement, item) => { + const itemContentElement = itemElement.querySelector('.ibexa-popup-menu__item-content'); + + itemElement.dataset.relatedButtonId = item.relatedButtonId; + + if (item.disabled) { + itemContentElement.classList.add('ibexa-popup-menu__item-content--disabled'); + } + }); + + adaptiveItems.init(); + adapatItemsContainer.classList.remove('ibexa-context-menu--before-adaptive-items-init'); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.dropdown.js b/public/bundles/ibexaadminui/js/scripts/admin.dropdown.js new file mode 100644 index 000000000..c9e2d5c58 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.dropdown.js @@ -0,0 +1,11 @@ +(function (global, doc, ibexa) { + const dropdowns = doc.querySelectorAll('.ibexa-dropdown:not(.ibexa-dropdown--custom-init)'); + + dropdowns.forEach((dropdownContainer) => { + const dropdown = new ibexa.core.Dropdown({ + container: dropdownContainer, + }); + + dropdown.init(); + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.error.page.js b/public/bundles/ibexaadminui/js/scripts/admin.error.page.js new file mode 100644 index 000000000..32ef0fc1b --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.error.page.js @@ -0,0 +1,42 @@ +(function (global, doc, iconPaths) { + const notificationsContainer = doc.querySelector('.ibexa-notifications-container'); + const notifications = JSON.parse(notificationsContainer.dataset.notifications); + const { template } = notificationsContainer.dataset; + const iconsMap = { + info: 'system-information', + error: 'circle-close', + warning: 'warning-triangle', + success: 'checkmark', + }; + const escapeHTML = (string) => { + const stringTempNode = doc.createElement('div'); + + stringTempNode.appendChild(doc.createTextNode(string)); + + return stringTempNode.innerHTML; + }; + const addNotification = ({ detail }) => { + const { label, message } = detail; + const container = doc.createElement('div'); + const iconSetPath = iconPaths.iconSets[iconPaths.defaultIconSet]; + const iconPath = `${iconSetPath}#${iconsMap[label]}`; + const finalMessage = escapeHTML(message); + + const notification = template + .replace('{{ label }}', label) + .replace('{{ message }}', finalMessage) + .replace('{{ icon_path }}', iconPath); + + container.insertAdjacentHTML('beforeend', notification); + + const notificationNode = container.querySelector('.alert'); + + notificationsContainer.append(notificationNode); + }; + + Object.entries(notifications).forEach(([label, messages]) => { + messages.forEach((message) => addNotification({ detail: { label, message } })); + }); + + doc.body.addEventListener('ibexa-notify', addNotification, false); +})(window, window.document, window.ibexa.iconPaths); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.form.autosubmit.js b/public/bundles/ibexaadminui/js/scripts/admin.form.autosubmit.js new file mode 100644 index 000000000..3282340d7 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.form.autosubmit.js @@ -0,0 +1,10 @@ +(function (global, doc) { + const autosubmit = (event) => { + const form = event.target.closest('form'); + + form.submit(); + }; + const items = doc.querySelectorAll('.ibexa-form-autosubmit'); + + items.forEach((item) => item.addEventListener('change', autosubmit, false)); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.form.error.js b/public/bundles/ibexaadminui/js/scripts/admin.form.error.js new file mode 100644 index 000000000..6af0eb6d1 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.form.error.js @@ -0,0 +1,32 @@ +(function (global, doc) { + const formErrorNodes = doc.querySelectorAll('.ibexa-form-error'); + const observersList = []; + const observerConfig = { + childList: true, + subtree: true, + }; + const toggleHelperNode = (errorNode) => { + const helperNode = errorNode.parentElement.querySelector('.ibexa-form-help'); + + if (!helperNode) { + return; + } + + const isErrorVisible = !!errorNode.innerText; + + helperNode.hidden = isErrorVisible; + }; + const errorNodeChanged = (mutationList) => { + toggleHelperNode(mutationList[0].target); + }; + const init = (nodesToObserver) => { + nodesToObserver.forEach((node) => { + const observer = new MutationObserver(errorNodeChanged); + + observer.observe(node, observerConfig); + observersList.push(observer); + }); + }; + + init(formErrorNodes); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.format.date.js b/public/bundles/ibexaadminui/js/scripts/admin.format.date.js new file mode 100644 index 000000000..612125e28 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.format.date.js @@ -0,0 +1,87 @@ +(function (moment, ibexa) { + const { backOfficeLanguage } = ibexa.adminUiConfig; + + moment.locale(backOfficeLanguage); + + /* + ([yqLdDeEcaZ])\1* -> find any pattern of one or repeated one of these characters + or + \'([^\']|(\'\'))*\' -> find any string in ' ' quotes + */ + const formatICUEx = /([yqLdDeEcaZ])\1*|'([^']|(''))*'/g; + /* + Allowed formats: + y, yy, yyyy, Y, YY, YYYY, + q, Q, + M, MM, MMM, MMMM, L, LL, LLL, LLLL, + w, WW, + d, dd, + D, DDD, + E, EE, EEE, EEEE, EEEEEE, e, ee, eee, eeee, eeeeee, c, cc, ccc, cccc, cccccc, + a, + h, hh, H, HH, k, kk, + m, mm, + s, ss, S..., + Z, ZZ, ZZZ, ZZZZZ + */ + const formatICUMap = { + y: 'Y', + yy: 'YY', + yyyy: 'YYYY', + q: 'Q', + L: 'M', + LL: 'MM', + LLL: 'MMM', + LLLL: 'MMMM', + dd: 'DD', + d: 'D', + D: 'DDD', + DDD: 'DDDD', + eeeeee: 'dd', + eeee: 'dddd', + eee: 'ddd', + ee: 'E', + e: 'E', + EEEEEE: 'dd', + EEEE: 'dddd', + EEE: 'ddd', + EE: 'ddd', + E: 'ddd', + cccccc: 'dd', + cccc: 'dddd', + ccc: 'ddd', + cc: 'E', + c: 'E', + a: 'A', + Z: 'ZZ', + ZZ: 'ZZ', + ZZZ: 'ZZ', + ZZZZ: 'Z', + }; + + const formatEscapedString = function (icuStr) { + // eslint-disable-next-line quotes + if (icuStr === "''") { + return "[']"; // eslint-disable-line quotes + } + + return icuStr.replace(/'(.*)'/g, '[$1]').replace(/''/g, "'"); // eslint-disable-line quotes + }; + + moment.fn.formatICU = function (format) { + const form = format.replace(formatICUEx, (icuStr) => { + // eslint-disable-next-line quotes + if (icuStr[0] === "'") { + return formatEscapedString(icuStr); + } + + if (formatICUMap[icuStr] === undefined) { + return icuStr; + } + + return typeof formatICUMap[icuStr] === 'function' ? formatICUMap[icuStr].call(this) : formatICUMap[icuStr]; + }); + + return this.format(form); + }; +})(window.moment, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.input.text.js b/public/bundles/ibexaadminui/js/scripts/admin.input.text.js new file mode 100644 index 000000000..826c29485 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.input.text.js @@ -0,0 +1,79 @@ +(function (global, doc) { + const togglePasswordVisibility = (event) => { + const passwordTogglerBtn = event.currentTarget; + const passwordShowIcon = passwordTogglerBtn.querySelector('.ibexa-input-text-wrapper__password-show'); + const passwordHideIcon = passwordTogglerBtn.querySelector('.ibexa-input-text-wrapper__password-hide'); + const inputTextWrapper = passwordTogglerBtn.closest('.ibexa-input-text-wrapper'); + const input = inputTextWrapper.querySelector('.ibexa-input--text'); + + if (input) { + const inputTypeToSet = input.type === 'password' ? 'text' : 'password'; + + input.type = inputTypeToSet; + passwordShowIcon.classList.toggle('d-none'); + passwordHideIcon.classList.toggle('d-none'); + } + }; + const clearText = ({ currentTarget }) => { + const inputWrapper = currentTarget.closest('.ibexa-input-text-wrapper'); + const input = inputWrapper.querySelector('.ibexa-input--text, .ibexa-input--date'); + + input.value = ''; + input.dispatchEvent(new Event('input')); + + if (!input.readOnly) { + input.select(); + } + + if (currentTarget.hasAttribute('data-send-form-after-clearing')) { + currentTarget.closest('form').submit(); + } + }; + const attachListenersToAllInputs = () => { + const inputClearBtns = doc.querySelectorAll(` + .ibexa-input--text + .ibexa-input-text-wrapper__actions .ibexa-input-text-wrapper__action-btn--clear, + .ibexa-input--date + .ibexa-input-text-wrapper__actions .ibexa-input-text-wrapper__action-btn--clear + `); + const passwordTogglerBtns = doc.querySelectorAll('.ibexa-input-text-wrapper__action-btn--password-toggler'); + + inputClearBtns.forEach((clearBtn) => clearBtn.addEventListener('click', clearText, false)); + passwordTogglerBtns.forEach((passwordTogglerBtn) => passwordTogglerBtn.addEventListener('click', togglePasswordVisibility, false)); + recalculateStyling(); + }; + const handleInputChange = ({ target: { value } }, btn) => { + btn.disabled = value.trim() === ''; + }; + const recalculateStyling = () => { + const extraBtns = doc.querySelectorAll('.ibexa-input-text-wrapper__action-btn--extra-btn'); + + extraBtns.forEach((btn) => { + const input = btn.closest('.ibexa-input-text-wrapper').querySelector('input'); + const clearButton = btn.previousElementSibling?.classList.contains('ibexa-input-text-wrapper__action-btn--clear') + ? btn.previousElementSibling + : null; + + if (!input) { + return; + } + + btn.disabled = !input.value; + input.addEventListener('input', (inputEvent) => handleInputChange(inputEvent, btn), false); + + if (!clearButton) { + return; + } + + const clearButtonStyles = global.getComputedStyle(clearButton); + const clearButtonMarginRight = parseInt(clearButtonStyles.getPropertyValue('margin-right'), 10); + const clearButtonWidth = parseInt(clearButtonStyles.getPropertyValue('width'), 10); + const paddingRight = `${btn.offsetWidth + clearButtonMarginRight + clearButtonWidth}px`; + + input.style.paddingRight = paddingRight; + }); + }; + + doc.body.addEventListener('ibexa-inputs:added', attachListenersToAllInputs, false); + doc.body.addEventListener('ibexa-inputs:recalculate-styling', recalculateStyling, false); + + attachListenersToAllInputs(); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.limitation.pick.js b/public/bundles/ibexaadminui/js/scripts/admin.limitation.pick.js new file mode 100644 index 000000000..8912cf831 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.limitation.pick.js @@ -0,0 +1,196 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const SELECTOR_LOCATION_LIMITATION_BTN = '.ibexa-pick-location-limitation-button'; + const SELECTOR_IBEXA_TAG = '.ibexa-tag'; + const IDS_SEPARATOR = ','; + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const udwContainer = doc.getElementById('react-udw'); + const limitationBtns = doc.querySelectorAll(SELECTOR_LOCATION_LIMITATION_BTN); + let udwRoot = null; + const findLocationsByIdList = (pathArraysWithoutRoot, callback) => { + const bulkOperations = getBulkOperations(pathArraysWithoutRoot); + const request = new Request('/api/ibexa/v2/bulk', { + method: 'POST', + headers: { + Accept: 'application/vnd.ibexa.api.BulkOperationResponse+json', + 'Content-Type': 'application/vnd.ibexa.api.BulkOperation+json', + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + body: JSON.stringify({ + bulkOperations: { + operations: bulkOperations, + }, + }), + mode: 'same-origin', + credentials: 'same-origin', + }); + const errorMessage = Translator.trans( + /*@Desc("Could not fetch content names")*/ 'limitation.pick.error', + {}, + 'universal_discovery_widget', + ); + + fetch(request) + .then(ibexa.helpers.request.getJsonFromResponse) + .then(callback) + .catch(() => ibexa.helpers.notification.showErrorNotification(errorMessage)); + }; + const getBulkOperations = (pathArraysWithoutRoot) => + pathArraysWithoutRoot.reduce((operations, pathArray) => { + const locationId = pathArray[pathArray.length - 1]; + + operations[locationId] = { + uri: '/api/ibexa/v2/views', + method: 'POST', + headers: { + Accept: 'application/vnd.ibexa.api.View+json; version=1.1', + 'Content-Type': 'application/vnd.ibexa.api.ViewInput+json; version=1.1', + 'X-Requested-With': 'XMLHttpRequest', + }, + content: JSON.stringify({ + ViewInput: { + identifier: `udw-locations-by-path-string-${pathArray.join('-')}`, + public: false, + LocationQuery: { + FacetBuilders: {}, + SortClauses: { SectionIdentifier: 'ascending' }, + Filter: { LocationIdCriterion: pathArray.join(IDS_SEPARATOR) }, + limit: 50, + offset: 0, + }, + }, + }), + }; + + return operations; + }, {}); + const removeRootLocation = (pathArray) => pathArray.slice(1); + const pathStringToPathArray = (pathString) => pathString.split('/').filter((el) => el); + const buildContentBreadcrumbs = (viewData) => { + const searchHitList = viewData.View.Result.searchHits.searchHit; + + return searchHitList.map((searchHit) => searchHit.value.Location.ContentInfo.Content.TranslatedName).join(' / '); + }; + const addLocationsToInput = (limitationBtn, selectedItems) => { + const input = doc.querySelector(limitationBtn.dataset.locationInputSelector); + const selectedLocationsIds = selectedItems.map((item) => item.id).join(IDS_SEPARATOR); + + input.value = selectedLocationsIds; + }; + const removeLocationFromInput = (locationInputSelector, removedLocationId) => { + const input = doc.querySelector(locationInputSelector); + const locationsIdsWithoutRemoved = input.value.split(IDS_SEPARATOR).filter((locationId) => locationId !== removedLocationId); + + input.value = locationsIdsWithoutRemoved.join(IDS_SEPARATOR); + }; + const addLocationsTags = (limitationBtn, selectedItems) => { + const tagsList = doc.querySelector(limitationBtn.dataset.selectedLocationListSelector); + const tagTemplate = limitationBtn.dataset.valueTemplate; + const fragment = doc.createDocumentFragment(); + + selectedItems.forEach((location) => { + const locationId = location.id; + const container = doc.createElement('ul'); + + container.insertAdjacentHTML('beforeend', tagTemplate); + + const tagTemplateUnescaped = container.innerHTML; + const renderedItem = tagTemplateUnescaped.replace('{{ location_id }}', locationId); + + container.innerHTML = ''; + container.insertAdjacentHTML('beforeend', renderedItem); + + const listItemNode = container.querySelector('li'); + const tagNode = listItemNode.querySelector(SELECTOR_IBEXA_TAG); + + attachTagEventHandlers(limitationBtn, tagNode); + fragment.append(listItemNode); + }); + + tagsList.innerHTML = ''; + tagsList.append(fragment); + + setTagsBreadcrumbs(tagsList, selectedItems); + }; + const setTagsBreadcrumbs = (tagsList, selectedItems) => { + const pathArraysWithoutRoot = selectedItems.map(getLocationPathArray); + + findLocationsByIdList(pathArraysWithoutRoot, (response) => { + const { operations } = response.BulkOperationResponse; + + Object.entries(operations).forEach(([locationId, { content }]) => { + const viewData = JSON.parse(content); + const tag = tagsList.querySelector(`[data-location-id="${locationId}"]`); + const tagContent = tag.querySelector('.ibexa-tag__content'); + const tagSpinner = tag.querySelector('.ibexa-tag__spinner'); + + tagContent.innerText = buildContentBreadcrumbs(viewData); + + tagSpinner.hidden = true; + tagContent.hidden = false; + }); + }); + }; + const getLocationPathArray = ({ pathString }) => { + const pathArray = pathStringToPathArray(pathString); + const pathArrayWithoutRoot = removeRootLocation(pathArray); + + return pathArrayWithoutRoot; + }; + const handleTagRemove = (limitationBtn, tag) => { + const removedLocationId = tag.dataset.locationId; + const { locationInputSelector } = limitationBtn.dataset; + + removeLocationFromInput(locationInputSelector, removedLocationId); + tag.remove(); + }; + const attachTagEventHandlers = (limitationBtn, tag) => { + const removeTagBtn = tag.querySelector('.ibexa-tag__remove-btn'); + + if (removeTagBtn !== null) { + removeTagBtn.addEventListener('click', () => handleTagRemove(limitationBtn, tag), false); + } + }; + const closeUDW = () => udwRoot.unmount(); + const handleUdwConfirm = (limitationBtn, selectedItems) => { + if (selectedItems.length) { + addLocationsToInput(limitationBtn, selectedItems); + addLocationsTags(limitationBtn, selectedItems); + } + + closeUDW(); + }; + const openUDW = (event) => { + event.preventDefault(); + + const limitationBtn = event.currentTarget; + const input = doc.querySelector(limitationBtn.dataset.locationInputSelector); + const selectedLocationsIds = input.value + .split(IDS_SEPARATOR) + .filter((idString) => !!idString) + .map((idString) => parseInt(idString, 10)); + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Choose Locations")*/ 'subtree_limitation.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: handleUdwConfirm.bind(this, event.target), + onCancel: closeUDW, + title, + multiple: true, + selectedLocations: selectedLocationsIds, + ...config, + }), + ); + }; + + limitationBtns.forEach((limitationBtn) => { + const tagsList = doc.querySelector(limitationBtn.dataset.selectedLocationListSelector); + const tags = tagsList.querySelectorAll(SELECTOR_IBEXA_TAG); + + tags.forEach(attachTagEventHandlers.bind(null, limitationBtn)); + limitationBtn.addEventListener('click', openUDW, false); + }); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.linkmanager.list.js b/public/bundles/ibexaadminui/js/scripts/admin.linkmanager.list.js new file mode 100644 index 000000000..6ce79d64c --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.linkmanager.list.js @@ -0,0 +1,7 @@ +(function (doc) { + const statusField = doc.getElementById('search_data_status'); + + statusField.addEventListener('change', function () { + this.form.submit(); + }); +})(document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.adaptive.tabs.js b/public/bundles/ibexaadminui/js/scripts/admin.location.adaptive.tabs.js new file mode 100644 index 000000000..e4467fa5d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.adaptive.tabs.js @@ -0,0 +1,95 @@ +(function (global, doc, ibexa, bootstrap) { + const TABS_SELECTOR = '.ibexa-tabs'; + const SELECTOR_TABS_LIST = '.ibexa-tabs__list'; + const SELECTOR_TAB_MORE = '.ibexa-tabs__tab--more'; + const toggleContainer = (event) => { + const toggler = event.target; + const header = toggler.closest('.ibexa-header'); + const headerContainer = header.parentElement; + const tabContent = headerContainer.querySelector('.ibexa-tab-content'); + + toggler.classList.toggle('ibexa-tabs__toggler--rolled-up'); + tabContent.classList.toggle('ibexa-tab-content--rolled-up'); + }; + + doc.querySelectorAll('.ibexa-tabs__toggler').forEach((toggler) => { + toggler.addEventListener('click', toggleContainer, false); + }); + + doc.querySelectorAll(TABS_SELECTOR).forEach((tabsContainer) => { + const tabsList = tabsContainer.querySelector(SELECTOR_TABS_LIST); + const tabMore = tabsList.querySelector(SELECTOR_TAB_MORE); + + if (tabMore) { + const tabs = [...tabsList.querySelectorAll(':scope > .ibexa-tabs__tab:not(.ibexa-tabs__tab--more)')]; + const tabsLinks = [...tabsList.querySelectorAll('.ibexa-tabs__link:not(.ibexa-tabs__tab--more)')]; + const popupMenuElement = tabsContainer.querySelector('.ibexa-popup-menu'); + + const popupMenu = new ibexa.core.PopupMenu({ + popupMenuElement, + triggerElement: tabMore, + onItemClick: (event) => { + const itemElement = event.currentTarget; + const { tabLinkId } = itemElement.dataset; + const tabToShow = tabsList.querySelector(`.ibexa-tabs__link#${tabLinkId}`); + + bootstrap.Tab.getOrCreateInstance(tabToShow).show(); + }, + position: () => { + const popupMenuLeftPosition = + tabMore.offsetLeft + tabsList.offsetLeft - popupMenuElement.offsetWidth + tabMore.offsetWidth + 20; + + popupMenuElement.style.left = `${popupMenuLeftPosition}px`; + }, + }); + + const popupItemsToGenerate = tabs.map((tab) => { + const tabLink = tab.querySelector('.ibexa-tabs__link'); + const tabLinkLabel = tabLink.textContent; + + return { + label: tabLinkLabel, + tabLinkId: tabLink.id, + }; + }); + popupMenu.generateItems(popupItemsToGenerate, (itemElement, item) => { + itemElement.dataset.tabLinkId = item.tabLinkId; + }); + + popupMenu.updatePosition(); + + const adaptiveItems = new ibexa.core.AdaptiveItems({ + itemHiddenClass: 'ibexa-tabs__tab--hidden', + container: tabsList, + getActiveItem: () => { + const activeTabLink = tabsLinks.find((tabLink) => tabLink.classList.contains('active')); + const activeTab = activeTabLink ? activeTabLink.closest('.ibexa-tabs__tab') : null; + + return activeTab; + }, + onAdapted: (visibleTabsWithoutSelector, hiddenTabsWithoutSelector) => { + const hiddenTabsLinksIds = [...hiddenTabsWithoutSelector].map((tab) => tab.querySelector('.ibexa-tabs__link').id); + + popupMenu.toggleItems((popupMenuItem) => !hiddenTabsLinksIds.includes(popupMenuItem.dataset.tabLinkId)); + popupMenu.updatePosition(); + }, + }); + + adaptiveItems.init(); + + tabsLinks.forEach((tabLink) => { + tabLink.addEventListener('shown.bs.tab', () => { + adaptiveItems.adapt(); + }); + }); + } + }); + + doc.querySelectorAll('.ibexa-tabs__link').forEach((tabLink) => { + const tab = tabLink.parentElement; + + tabLink.addEventListener('focus', () => { + tab.focus(); + }); + }); +})(window, window.document, window.ibexa, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.add.custom_url.js b/public/bundles/ibexaadminui/js/scripts/admin.location.add.custom_url.js new file mode 100644 index 000000000..8668cff04 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.add.custom_url.js @@ -0,0 +1,30 @@ +(function (global, doc) { + const modal = doc.querySelector('#ibexa-modal--custom-url-alias'); + + if (modal) { + const discardBtns = modal.querySelectorAll('[data-bs-dismiss="modal"]'); + const submitBtn = modal.querySelector('#custom_url_add_add'); + const input = modal.querySelector('[required="required"]'); + const siteRootCheckbox = modal.querySelector('[name="custom_url_add[site_root]"]'); + const toggleButtonState = () => { + const hasValue = input.value.trim().length !== 0; + const methodName = hasValue ? 'removeAttribute' : 'setAttribute'; + + submitBtn[methodName]('disabled', true); + }; + const clearValues = () => { + input.value = ''; + toggleButtonState(); + }; + const toggleSiteAccessSelect = (event) => { + const isChecked = event.target.checked; + const siteAccessSelect = modal.querySelector('.ibexa-custom-url-from__item--siteacces .ibexa-dropdown'); + + siteAccessSelect.classList.toggle('ibexa-dropdown--is-disabled', isChecked); + }; + + input.addEventListener('input', toggleButtonState, false); + siteRootCheckbox.addEventListener('change', toggleSiteAccessSelect, false); + discardBtns.forEach((btn) => btn.addEventListener('click', clearValues, false)); + } +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.add.translation.js b/public/bundles/ibexaadminui/js/scripts/admin.location.add.translation.js new file mode 100644 index 000000000..683db9ef1 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.add.translation.js @@ -0,0 +1,17 @@ +(function (global, doc) { + const SELECTOR_MODAL = '.ibexa-modal'; + + doc.querySelectorAll('.ibexa-translation__language-wrapper--language').forEach((select) => { + select.addEventListener( + 'change', + (event) => { + const modal = event.target.closest(SELECTOR_MODAL); + const buttonCreate = modal.querySelector('.ibexa-btn--create-translation'); + const method = event.target.value ? 'removeAttribute' : 'setAttribute'; + + buttonCreate[method]('disabled', true); + }, + false, + ); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.bookmark.js b/public/bundles/ibexaadminui/js/scripts/admin.location.bookmark.js new file mode 100644 index 000000000..be7ca275b --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.bookmark.js @@ -0,0 +1,75 @@ +(function (global, doc, ibexa) { + const ENDPOINT_BOOKMARK = '/api/ibexa/v2/bookmark'; + const SELECTOR_BOOKMARK_WRAPPER = '.ibexa-add-to-bookmarks'; + const CLASS_BOOKMARK_CHECKED = 'ibexa-add-to-bookmarks--checked'; + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const bookmarkWrapper = doc.querySelector(SELECTOR_BOOKMARK_WRAPPER); + + if (!bookmarkWrapper) { + return; + } + + const currentLocationId = parseInt(bookmarkWrapper.getAttribute('data-location-id'), 10); + const handleUpdateError = ibexa.helpers.notification.showErrorNotification; + let isUpdatingBookmark = false; + const getResponseStatus = (response) => { + if (!response.ok) { + throw Error(response.statusText); + } + + return response.status; + }; + const onBookmarkUpdated = (isBookmarked) => { + ibexa.helpers.tooltips.hideAll(); + toggleBookmarkIconState(isBookmarked); + isUpdatingBookmark = false; + }; + const updateBookmark = (addBookmark) => { + if (isUpdatingBookmark) { + return; + } + + isUpdatingBookmark = true; + + const method = addBookmark ? 'POST' : 'DELETE'; + const request = new Request(`${ENDPOINT_BOOKMARK}/${currentLocationId}`, { + method, + headers: { + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + mode: 'same-origin', + credentials: 'same-origin', + }); + + fetch(request).then(getResponseStatus).then(onBookmarkUpdated.bind(null, addBookmark)).catch(handleUpdateError); + }; + const isCurrentLocation = (locationId) => { + return parseInt(locationId, 10) === currentLocationId; + }; + const toggleBookmarkIconState = (isBookmarked) => { + bookmarkWrapper.classList.toggle(CLASS_BOOKMARK_CHECKED, isBookmarked); + }; + const updateBookmarkIconState = ({ detail }) => { + const { bookmarked, locationId } = detail; + + if (isCurrentLocation(locationId)) { + toggleBookmarkIconState(bookmarked); + } + }; + const checkIsBookmarked = () => { + return bookmarkWrapper.classList.contains(CLASS_BOOKMARK_CHECKED); + }; + const onBookmarkChange = () => { + const addBookmark = !checkIsBookmarked(); + + updateBookmark(addBookmark); + }; + + doc.body.addEventListener('ibexa-bookmark-change', updateBookmarkIconState, false); + + if (bookmarkWrapper) { + bookmarkWrapper.addEventListener('click', onBookmarkChange, false); + } +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.change.language.js b/public/bundles/ibexaadminui/js/scripts/admin.location.change.language.js new file mode 100644 index 000000000..f54645923 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.change.language.js @@ -0,0 +1,10 @@ +(function (global, doc) { + const changeLocationLanguage = (event) => { + global.location = event.currentTarget.value; + }; + const locationLanguageSwitchers = doc.querySelectorAll('.ibexa-location-language-change'); + + locationLanguageSwitchers.forEach((locationLanguageSwitcher) => { + locationLanguageSwitcher.addEventListener('change', changeLocationLanguage, false); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.load.map.js b/public/bundles/ibexaadminui/js/scripts/admin.location.load.map.js new file mode 100644 index 000000000..5f4419adc --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.load.map.js @@ -0,0 +1,24 @@ +(function (global, doc, Leaflet) { + doc.querySelectorAll('.ibexa-gmaplocation__map').forEach((mapLocation) => { + const latitude = parseFloat(mapLocation.dataset.latitude); + const longitude = parseFloat(mapLocation.dataset.longitude); + const map = Leaflet.map(mapLocation, { + zoom: 15, + zoomControl: false, + scrollWheelZoom: false, + dragging: false, + tap: false, + center: [latitude, longitude], + }); + + Leaflet.marker([latitude, longitude], { + icon: new Leaflet.Icon.Default({ + imagePath: '/bundles/ibexaadminuiassets/vendors/leaflet/dist/images/', + }), + }).addTo(map); + + Leaflet.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors', + }).addTo(map); + }); +})(window, window.document, window.L); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.set.js b/public/bundles/ibexaadminui/js/scripts/admin.location.set.js new file mode 100644 index 000000000..5357f5578 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.set.js @@ -0,0 +1,8 @@ +(function (global, doc) { + const updateMainLocation = (event) => { + doc.querySelector('#content_location_set_main_location').value = event.target.value; + doc.querySelector('form[name="content_location_set_main"]').submit(); + }; + + doc.querySelectorAll('input[name="setMainLocation"]').forEach((input) => input.addEventListener('change', updateMainLocation, false)); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.tab.js b/public/bundles/ibexaadminui/js/scripts/admin.location.tab.js new file mode 100644 index 000000000..0f47b6d68 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.tab.js @@ -0,0 +1,43 @@ +(function (global, doc, bootstrap) { + const SELECTOR_TABS = '.ibexa-tabs'; + const SELECTOR_TAB = '.ibexa-tabs__tab'; + const SELECTOR_TAB_ACTIVE = '.ibexa-tabs__tab--active'; + const CLASS_TAB_ACTIVE = 'ibexa-tabs__tab--active'; + const switchActiveTabs = (currentTab, previousTab) => { + if (previousTab) { + previousTab.classList.remove(CLASS_TAB_ACTIVE); + } + + currentTab.classList.add(CLASS_TAB_ACTIVE); + }; + const changeHashForPageReload = (hash) => { + global.location.hash = `${hash}#tab`; + }; + const handleTabShown = (event) => { + const { target, relatedTarget } = event; + const currentTab = target.closest(SELECTOR_TAB); + const previousTab = relatedTarget.closest(SELECTOR_TAB); + + changeHashForPageReload(event.target.hash); + switchActiveTabs(currentTab, previousTab); + }; + const setActiveHashTab = () => { + const activeHashTabLink = doc.querySelector(`.ibexa-tabs a[href="#${global.location.hash.split('#')[1]}"]`); + + if (!activeHashTabLink) { + return; + } + + const activeHashTab = activeHashTabLink.closest(SELECTOR_TAB); + const parentTabs = activeHashTab.closest(SELECTOR_TABS); + const currentActiveTab = parentTabs.querySelector(SELECTOR_TAB_ACTIVE); + + bootstrap.Tab.getOrCreateInstance(activeHashTabLink).show(); + + switchActiveTabs(activeHashTab, currentActiveTab); + }; + + setActiveHashTab(); + + doc.querySelectorAll('.ibexa-tabs a').forEach((tab) => tab.addEventListener('shown.bs.tab', handleTabShown)); +})(window, window.document, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.tooglecontentpreview.js b/public/bundles/ibexaadminui/js/scripts/admin.location.tooglecontentpreview.js new file mode 100644 index 000000000..8314b6890 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.tooglecontentpreview.js @@ -0,0 +1,26 @@ +(function (global, doc, localStorage, bootstrap) { + const CONTENT_PREVIEW_COLLAPSE_SELECTOR = '.ibexa-content-preview-collapse'; + const DEFAULT_CONTENT_PREVIEW_TOGGLE_STATE_KEY = 'ibexa-content-preview-collapsed'; + const getStateKey = (collapseTarget) => { + return collapseTarget.dataset.collapseStateKey || DEFAULT_CONTENT_PREVIEW_TOGGLE_STATE_KEY; + }; + const getContentPreviewToggleState = (collapsable) => { + const stateKey = getStateKey(collapsable); + const value = localStorage.getItem(stateKey); + + return !!JSON.parse(value); + }; + const setContentPreviewToggleState = (event, value) => { + const stateKey = getStateKey(event.target); + localStorage.setItem(stateKey, value); + }; + + doc.querySelectorAll(CONTENT_PREVIEW_COLLAPSE_SELECTOR).forEach((collapsable) => { + new bootstrap.Collapse(collapsable, { + toggle: getContentPreviewToggleState(collapsable), + }); + + collapsable.addEventListener('hide.bs.collapse', (event) => setContentPreviewToggleState(event, true)); + collapsable.addEventListener('show.bs.collapse', (event) => setContentPreviewToggleState(event, false)); + }); +})(window, window.document, window.localStorage, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.update.js b/public/bundles/ibexaadminui/js/scripts/admin.location.update.js new file mode 100644 index 000000000..43ae59428 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.update.js @@ -0,0 +1,10 @@ +(function (global, doc) { + const updateMainLocation = (event) => { + doc.querySelector('#content_main_location_update_location').value = event.target.value; + doc.querySelector('form[name="content_main_location_update"]').submit(); + }; + + doc.querySelectorAll('input[name="updateMainLocation"]').forEach((input) => + input.addEventListener('change', updateMainLocation, false), + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.view.js b/public/bundles/ibexaadminui/js/scripts/admin.location.view.js new file mode 100644 index 000000000..c3c2a9e4f --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.view.js @@ -0,0 +1,203 @@ +(function (global, doc, localStorage, bootstrap, React, ReactDOM, ibexa, Routing, Translator) { + const SELECTOR_MODAL_BULK_ACTION_FAIL = '#bulk-action-failed-modal'; + const listContainers = doc.querySelectorAll('.ibexa-sil'); + const mfuContainer = doc.querySelector('#ibexa-mfu'); + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const sortContainer = doc.querySelector('[data-sort-field][data-sort-order]'); + const handleEditItem = (content, location) => { + const contentId = content._id; + const locationId = location._id; + const languageCode = content.mainLanguageCode; + const checkVersionDraftLink = Routing.generate('ibexa.version_draft.has_no_conflict', { contentId, languageCode, locationId }); + const submitVersionEditForm = () => { + doc.querySelector('#form_subitems_content_edit_content_info').value = contentId; + doc.querySelector(`#form_subitems_content_edit_language_${languageCode}`).checked = true; + doc.querySelector('#form_subitems_content_edit_create').click(); + }; + const addDraft = () => { + submitVersionEditForm(); + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#version-draft-conflict-modal')).hide(); + }; + const attachModalListeners = (wrapper) => { + const addDraftButton = wrapper.querySelector('.ibexa-btn--add-draft'); + const conflictModal = doc.querySelector('#version-draft-conflict-modal'); + + if (addDraftButton) { + addDraftButton.addEventListener('click', addDraft, false); + } + + wrapper + .querySelectorAll('.ibexa-btn--prevented') + .forEach((btn) => btn.addEventListener('click', (event) => event.preventDefault(), false)); + + if (conflictModal) { + bootstrap.Modal.getOrCreateInstance(conflictModal).show(); + conflictModal.addEventListener('shown.bs.modal', () => ibexa.helpers.tooltips.parse()); + } + }; + const showModal = (modalHtml) => { + const wrapper = doc.querySelector('.ibexa-modal-wrapper'); + + wrapper.innerHTML = modalHtml; + attachModalListeners(wrapper); + }; + const checkEditPermissionLink = Routing.generate('ibexa.content.check_edit_permission', { + contentId, + languageCode: content.mainLanguageCode, + }); + const errorMessage = Translator.trans( + /*@Desc("You don't have permission to edit this Content item")*/ 'content.edit.permission.error', + {}, + 'content', + ); + const handleCanEditCheck = (response) => { + if (response.canEdit) { + return fetch(checkVersionDraftLink, { mode: 'same-origin', credentials: 'same-origin' }); + } + + throw new Error(errorMessage); + }; + + fetch(checkEditPermissionLink, { mode: 'same-origin', credentials: 'same-origin' }) + .then(ibexa.helpers.request.getJsonFromResponse) + .then(handleCanEditCheck) + .then((response) => { + // Status 409 means that a draft conflict has occurred and the modal must be displayed. + // Otherwise we can go to Content Item edit page. + if (response.status === 409) { + response.text().then(showModal); + } else if (response.status === 200) { + submitVersionEditForm(); + } + }) + .catch(ibexa.helpers.notification.showErrorNotification); + }; + const generateLink = (locationId, contentId) => Routing.generate('ibexa.content.view', { contentId, locationId }); + const setModalTableTitle = (title) => { + const modalTableTitleNode = doc.querySelector(`${SELECTOR_MODAL_BULK_ACTION_FAIL} .ibexa-table-header__headline`); + + modalTableTitleNode.innerHTML = title; + modalTableTitleNode.setAttribute('title', title); + modalTableTitleNode.dataset.originalTitle = title; + }; + const setModalTableBody = (failedItemsData) => { + const modal = doc.querySelector(SELECTOR_MODAL_BULK_ACTION_FAIL); + const table = modal.querySelector('.ibexa-bulk-action-failed-modal__table'); + const tableBody = table.querySelector('.ibexa-bulk-action-failed-modal__table-body'); + const { rowTemplate } = table.dataset; + const fragment = doc.createDocumentFragment(); + + failedItemsData.forEach(({ contentName, contentTypeName }) => { + const container = doc.createElement('tbody'); + const renderedItem = rowTemplate.replace('{{ content_name }}', contentName).replace('{{ content_type_name }}', contentTypeName); + + container.insertAdjacentHTML('beforeend', renderedItem); + + const tableRowNode = container.querySelector('tr'); + + fragment.append(tableRowNode); + }); + + removeNodeChildren(tableBody); + tableBody.append(fragment); + }; + const removeNodeChildren = (node) => { + while (node.firstChild) { + node.removeChild(node.firstChild); + } + }; + const showBulkActionFailedModal = (tableTitle, failedItemsData) => { + setModalTableBody(failedItemsData); + setModalTableTitle(tableTitle); + + bootstrap.Modal.getOrCreateInstance(doc.querySelector(SELECTOR_MODAL_BULK_ACTION_FAIL)).show(); + }; + const getLocationActiveView = (parentLocationId) => { + const mediaLocationId = ibexa.adminUiConfig.locations.media; + const defaultActiveView = parentLocationId === mediaLocationId ? 'grid' : 'table'; + const activeView = localStorage.getItem(`ibexa-subitems-active-view-location-${parentLocationId}`); + + return activeView || defaultActiveView; + }; + + listContainers.forEach((container) => { + const sortField = sortContainer.getAttribute('data-sort-field'); + const sortOrder = sortContainer.getAttribute('data-sort-order'); + const subitemsRoot = ReactDOM.createRoot(container); + const parentLocationId = parseInt(container.dataset.location, 10); + const activeView = getLocationActiveView(parentLocationId); + const subItemsList = JSON.parse(container.dataset.items).SubitemsList; + const items = subItemsList.SubitemsRow.map((item) => ({ + content: item.Content, + location: item.Location, + })); + const contentTypes = JSON.parse(container.dataset.contentTypes).ContentTypeInfoList.ContentType; + const contentTypesMap = contentTypes.reduce((total, item) => { + total[item._href] = item; + + return total; + }, {}); + const udwConfigBulkMoveItems = JSON.parse(container.dataset.udwConfigBulkMoveItems); + const udwConfigBulkAddLocation = JSON.parse(container.dataset.udwConfigBulkAddLocation); + const mfuContentTypesMap = Object.values(ibexa.adminUiConfig.contentTypes).reduce((contentTypeDataMap, contentTypeGroup) => { + for (const contentTypeData of contentTypeGroup) { + contentTypeDataMap[contentTypeData.href] = contentTypeData; + } + + return contentTypeDataMap; + }, {}); + const mfuAttrs = { + adminUiConfig: { + ...ibexa.adminUiConfig, + token, + siteaccess, + }, + parentInfo: { + contentTypeIdentifier: mfuContainer.dataset.parentContentTypeIdentifier, + contentTypeId: parseInt(mfuContainer.dataset.parentContentTypeId, 10), + locationPath: mfuContainer.dataset.parentLocationPath, + language: mfuContainer.dataset.parentContentLanguage, + }, + currentLanguage: mfuContainer.dataset.currentLanguage, + }; + + subitemsRoot.render( + React.createElement(ibexa.modules.SubItems, { + handleEditItem, + generateLink, + activeView, + parentLocationId, + sortClauses: { [sortField]: sortOrder }, + restInfo: { token, siteaccess }, + extraActions: [ + { + component: ibexa.modules.MultiFileUpload, + attrs: { + ...mfuAttrs, + onPopupClose: (itemsUploaded) => itemsUploaded.length && global.location.reload(true), + contentCreatePermissionsConfig: JSON.parse(container.dataset.mfuCreatePermissionsConfig), + contentTypesMap: mfuContentTypesMap, + }, + }, + ], + items, + contentTypesMap, + totalCount: subItemsList.ChildrenCount, + udwConfigBulkMoveItems, + udwConfigBulkAddLocation, + showBulkActionFailedModal, + }), + ); + }); +})( + window, + window.document, + window.localStorage, + window.bootstrap, + window.React, + window.ReactDOM, + window.ibexa, + window.Routing, + window.Translator, +); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.location.visibility.js b/public/bundles/ibexaadminui/js/scripts/admin.location.visibility.js new file mode 100644 index 000000000..8ec4ebbf6 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.location.visibility.js @@ -0,0 +1,46 @@ +(function (global, doc, ibexa) { + const SELECTOR_VISIBILITY_CHECKBOXES = '#ibexa-tab-location-view-locations .ibexa-content-locations__visibility-checkbox'; + const SELECTOR_VISIBILITY_FORM = 'form[name="location_update_visibility_data"]'; + const form = doc.querySelector(SELECTOR_VISIBILITY_FORM); + const visibilityCheckboxes = doc.querySelectorAll(SELECTOR_VISIBILITY_CHECKBOXES); + const refreshContentTree = () => { + doc.body.dispatchEvent(new CustomEvent('ibexa-content-tree-refresh')); + }; + const onVisibilityUpdated = ({ target }) => { + const toggleLabel = target + .closest('.ibexa-content-locations__visibility-toggler') + .querySelector('.ibexa-content-locations__visibility-toggler-label'); + + toggleLabel.classList.toggle('ibexa-content-locations__visibility-toggler-label--hidden'); + }; + const handleUpdateError = ibexa.helpers.notification.showErrorNotification; + const handleUpdateSuccess = (event, { message }) => { + onVisibilityUpdated(event); + ibexa.helpers.notification.showSuccessNotification(message); + refreshContentTree(); + }; + const handleUpdateResponse = (response) => { + if (response.status !== 200) { + throw new Error(response.statusText); + } + + return response.json(); + }; + const updateVisibility = (event) => { + form.querySelector('#location_update_visibility_data_location').value = event.target.value; + form.querySelector('#location_update_visibility_data_hidden').checked = !event.target.checked; + + const request = new Request(form.action, { + method: 'POST', + body: new FormData(form), + mode: 'same-origin', + credentials: 'same-origin', + }); + + fetch(request).then(handleUpdateResponse).then(handleUpdateSuccess.bind(null, event)).catch(handleUpdateError); + }; + + visibilityCheckboxes.forEach((checkbox) => { + checkbox.addEventListener('change', updateVisibility, false); + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.main.translation.update.js b/public/bundles/ibexaadminui/js/scripts/admin.main.translation.update.js new file mode 100644 index 000000000..6c46ecc51 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.main.translation.update.js @@ -0,0 +1,9 @@ +(function (global, doc) { + const updateMainTranslation = (event) => { + doc.querySelector('#main_translation_update_language_code').value = event.target.value; + doc.querySelector('form[name="main_translation_update"]').submit(); + }; + const inputs = doc.querySelectorAll('input[name="main_translation_update"]'); + + inputs.forEach((input) => input.addEventListener('change', updateMainTranslation, false)); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.middle.ellipsis.js b/public/bundles/ibexaadminui/js/scripts/admin.middle.ellipsis.js new file mode 100644 index 000000000..a47e6bb76 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.middle.ellipsis.js @@ -0,0 +1,3 @@ +(function (global, doc, ibexa) { + ibexa.helpers.ellipsis.middle.parseAll(); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.notifications.js b/public/bundles/ibexaadminui/js/scripts/admin.notifications.js new file mode 100644 index 000000000..96ab73599 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.notifications.js @@ -0,0 +1,48 @@ +(function (global, doc, ibexa) { + const notificationsContainer = doc.querySelector('.ibexa-notifications-container'); + const notifications = JSON.parse(notificationsContainer.dataset.notifications); + const { template } = notificationsContainer.dataset; + const iconsMap = { + info: 'system-information', + error: 'circle-close', + warning: 'warning-triangle', + success: 'checkmark', + }; + const addNotification = ({ detail }) => { + const { onShow, label, message, customIconPath, rawPlaceholdersMap = {} } = detail; + const config = ibexa.adminUiConfig.notifications[label]; + const timeout = config ? config.timeout : 0; + const container = doc.createElement('div'); + const iconPath = customIconPath ?? ibexa.helpers.icon.getIconPath(iconsMap[label]); + let finalMessage = ibexa.helpers.text.escapeHTML(message); + + Object.entries(rawPlaceholdersMap).forEach(([placeholder, rawText]) => { + finalMessage = finalMessage.replace(`{{ ${placeholder} }}`, rawText); + }); + + const notification = template + .replace('{{ label }}', label) + .replace('{{ message }}', finalMessage) + .replace('{{ icon_path }}', iconPath); + + container.insertAdjacentHTML('beforeend', notification); + + const notificationNode = container.querySelector('.alert'); + + notificationsContainer.append(notificationNode); + + if (timeout) { + global.setTimeout(() => notificationNode.querySelector('.ibexa-alert__close-btn').click(), timeout); + } + + if (typeof onShow === 'function') { + onShow(notificationNode); + } + }; + + Object.entries(notifications).forEach(([label, messages]) => { + messages.forEach((message) => addNotification({ detail: { label, message } })); + }); + + doc.body.addEventListener('ibexa-notify', addNotification, false); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.notifications.modal.js b/public/bundles/ibexaadminui/js/scripts/admin.notifications.modal.js new file mode 100644 index 000000000..edf17b0bf --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.notifications.modal.js @@ -0,0 +1,179 @@ +(function (global, doc, ibexa, Translator) { + let currentPageLink = null; + let getNotificationsStatusErrorShowed = false; + let lastFailedCountFetchNotificationNode = null; + const SELECTOR_MODAL_ITEM = '.ibexa-notifications-modal__item'; + const SELECTOR_MODAL_RESULTS = '.ibexa-notifications-modal__results'; + const SELECTOR_MODAL_TITLE = '.modal-title'; + const SELECTOR_DESC_TEXT = '.description__text'; + const SELECTOR_TABLE = '.ibexa-table--notifications'; + const CLASS_ELLIPSIS = 'description__text--ellipsis'; + const CLASS_PAGINATION_LINK = 'page-link'; + const CLASS_MODAL_LOADING = 'ibexa-notifications-modal--loading'; + const INTERVAL = 30000; + const modal = doc.querySelector('.ibexa-notifications-modal'); + const { showErrorNotification, showWarningNotification } = ibexa.helpers.notification; + const { getJsonFromResponse, getTextFromResponse } = ibexa.helpers.request; + const markAsRead = (notification, response) => { + if (response.status === 'success') { + notification.classList.add('ibexa-notifications-modal__item--read'); + } + + if (response.redirect) { + global.location = response.redirect; + } + }; + const handleNotificationClick = (notification) => { + const notificationReadLink = notification.dataset.notificationRead; + const request = new Request(notificationReadLink, { + mode: 'cors', + credentials: 'same-origin', + }); + + fetch(request).then(getJsonFromResponse).then(markAsRead.bind(null, notification)).catch(showErrorNotification); + }; + const handleTableClick = (event) => { + if (event.target.classList.contains('description__read-more')) { + event.target.closest(SELECTOR_MODAL_ITEM).querySelector(SELECTOR_DESC_TEXT).classList.remove(CLASS_ELLIPSIS); + + return; + } + + const notification = event.target.closest(SELECTOR_MODAL_ITEM); + + if (!notification) { + return; + } + + handleNotificationClick(notification); + }; + const getNotificationsStatus = () => { + const notificationsTable = modal.querySelector(SELECTOR_TABLE); + const notificationsStatusLink = notificationsTable.dataset.notificationsCount; + const request = new Request(notificationsStatusLink, { + mode: 'cors', + credentials: 'same-origin', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + }, + }); + + return fetch(request) + .then(getJsonFromResponse) + .then((notificationsInfo) => { + setPendingNotificationCount(notificationsInfo); + updateModalTitleTotalInfo(notificationsInfo.total); + getNotificationsStatusErrorShowed = false; + }) + .catch(onGetNotificationsStatusFailure); + }; + + /** + * Handle a failure while getting notifications status + * + * @method onGetNotificationsStatusFailure + */ + const onGetNotificationsStatusFailure = (error) => { + if (lastFailedCountFetchNotificationNode && doc.contains(lastFailedCountFetchNotificationNode)) { + return; + } + + if (!getNotificationsStatusErrorShowed) { + const message = Translator.trans( + /* @Desc("Cannot update notifications") */ 'notifications.modal.message.error', + { error: error.message }, + 'notifications', + ); + + showWarningNotification(message, (notificationNode) => { + lastFailedCountFetchNotificationNode = notificationNode; + }); + } + + getNotificationsStatusErrorShowed = true; + }; + const updateModalTitleTotalInfo = (notificationsCount) => { + const modalTitle = modal.querySelector(SELECTOR_MODAL_TITLE); + + modalTitle.dataset.notificationsTotal = `(${notificationsCount})`; + }; + const updatePendingNotificationsView = (notificationsInfo) => { + const noticeDot = doc.querySelector('.ibexa-header-user-menu__notice-dot'); + + noticeDot.classList.toggle('ibexa-header-user-menu__notice-dot--no-notice', notificationsInfo.pending === 0); + }; + const setPendingNotificationCount = (notificationsInfo) => { + updatePendingNotificationsView(notificationsInfo); + + const notificationsTable = modal.querySelector(SELECTOR_TABLE); + const notificationsTotal = notificationsInfo.total; + const notificationsTotalOld = parseInt(notificationsTable.dataset.notificationsTotal, 10); + + if (notificationsTotal !== notificationsTotalOld) { + notificationsTable.dataset.notificationsTotal = notificationsTotal; + + fetchNotificationPage(currentPageLink); + } + }; + const showNotificationPage = (pageHtml) => { + const modalResults = modal.querySelector(SELECTOR_MODAL_RESULTS); + + modalResults.innerHTML = pageHtml; + toggleLoading(false); + }; + const toggleLoading = (show) => { + modal.classList.toggle(CLASS_MODAL_LOADING, show); + }; + const fetchNotificationPage = (link) => { + if (!link) { + return; + } + + const request = new Request(link, { + method: 'GET', + headers: { + Accept: 'text/html', + }, + credentials: 'same-origin', + mode: 'cors', + }); + + currentPageLink = link; + toggleLoading(true); + fetch(request).then(getTextFromResponse).then(showNotificationPage).catch(showErrorNotification); + }; + const handleModalResultsClick = (event) => { + const isPaginationBtn = event.target.classList.contains(CLASS_PAGINATION_LINK); + + if (isPaginationBtn) { + handleNotificationsPageChange(event); + return; + } + + handleTableClick(event); + }; + const handleNotificationsPageChange = (event) => { + event.preventDefault(); + + const notificationsPageLink = event.target.href; + + fetchNotificationPage(notificationsPageLink); + }; + + if (!modal) { + return; + } + + const notificationsTable = modal.querySelector(SELECTOR_TABLE); + currentPageLink = notificationsTable.dataset.notifications; + + modal.querySelectorAll(SELECTOR_MODAL_RESULTS).forEach((link) => link.addEventListener('click', handleModalResultsClick, false)); + + const getNotificationsStatusLoop = () => { + getNotificationsStatus().finally(() => { + global.setTimeout(getNotificationsStatusLoop, INTERVAL); + }); + }; + + getNotificationsStatusLoop(); +})(window, window.document, window.ibexa, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.picker.js b/public/bundles/ibexaadminui/js/scripts/admin.picker.js new file mode 100644 index 000000000..bc0fc6754 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.picker.js @@ -0,0 +1,49 @@ +(function (global, doc, ibexa) { + const SELECTOR_PICKER = '.ibexa-picker'; + const SELECTOR_PICKER_INPUT = '.ibexa-date-time-picker__input'; + const SELECTOR_FORM_INPUT = '.ibexa-picker__form-input'; + const pickers = doc.querySelectorAll(SELECTOR_PICKER); + const { formatShortDateTime, convertDateToTimezone, getBrowserTimezone } = ibexa.helpers.timezone; + const userTimezone = ibexa.adminUiConfig.timezone; + const pickerConfig = { + enableTime: true, + time_24hr: true, + formatDate: (date) => formatShortDateTime(date, null), + }; + const updateInputValue = (formInput, timestamp) => { + if (timestamp !== formInput.value) { + formInput.value = timestamp ?? ''; + + formInput.dispatchEvent(new Event('input')); + } + }; + const initFlatPickr = (field) => { + const formInput = field.querySelector(SELECTOR_FORM_INPUT); + const pickerInput = field.querySelector(SELECTOR_PICKER_INPUT); + const customConfig = JSON.parse(pickerInput.dataset.flatpickrConfig || '{}'); + let defaultDate; + + if (formInput.value) { + const date = new Date(formInput.value * 1000); + const dateWithUserTimezone = convertDateToTimezone(date, userTimezone); + const localTimezone = getBrowserTimezone(); + const convertedDate = convertDateToTimezone(dateWithUserTimezone, localTimezone, true).format(); + + defaultDate = convertedDate; + } + + const dateTimePickerWidget = new ibexa.core.DateTimePicker({ + container: field, + onChange: updateInputValue.bind(null, formInput), + flatpickrConfig: { + ...pickerConfig, + defaultDate, + ...customConfig, + }, + }); + + dateTimePickerWidget.init(); + }; + + pickers.forEach(initFlatPickr); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.prevent.click.js b/public/bundles/ibexaadminui/js/scripts/admin.prevent.click.js new file mode 100644 index 000000000..a2e91f758 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.prevent.click.js @@ -0,0 +1,13 @@ +(function (global, doc) { + global.onbeforeunload = () => { + doc.querySelector('body').classList.add('ibexa-prevent-click'); + + return null; + }; + + global.addEventListener('pageshow', (event) => { + if (event.persisted) { + doc.querySelector('body').classList.remove('ibexa-prevent-click'); + } + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.preview.js b/public/bundles/ibexaadminui/js/scripts/admin.preview.js new file mode 100644 index 000000000..3006bbe51 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.preview.js @@ -0,0 +1,27 @@ +(function (global, doc) { + const CLASS_BTN_SELECTED = 'ibexa-btn--selected'; + const SELECTOR_BTN_ACTION = '.ibexa-preview-header__action'; + const SELECTOR_PREVIEW_SITEACCESS_SELECT = '.ibexa-preview-header__item--siteaccess select'; + const removeSelectedState = () => doc.querySelectorAll(SELECTOR_BTN_ACTION).forEach((btn) => btn.classList.remove(CLASS_BTN_SELECTED)); + const changePreviewMode = (event) => { + const btn = event.target.closest(SELECTOR_BTN_ACTION); + const iframeWrapper = doc.querySelector('.ibexa-preview__iframe'); + + removeSelectedState(); + + btn.classList.add(CLASS_BTN_SELECTED); + + iframeWrapper.classList.remove('ibexa-preview__iframe--desktop', 'ibexa-preview__iframe--tablet', 'ibexa-preview__iframe--mobile'); + iframeWrapper.classList.add(`ibexa-preview__iframe--${btn.dataset.previewMode}`); + }; + const changePreviewSiteaccess = (event) => { + const iframeWrapper = doc.querySelector('.ibexa-preview__iframe iframe'); + const siteaccessPreviewUrl = event.target.value; + + iframeWrapper.setAttribute('src', siteaccessPreviewUrl); + }; + doc.querySelectorAll(SELECTOR_BTN_ACTION).forEach((btn) => btn.addEventListener('click', changePreviewMode, false)); + doc.querySelectorAll(SELECTOR_PREVIEW_SITEACCESS_SELECT).forEach((select) => + select.addEventListener('change', changePreviewSiteaccess, false), + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.role_assignment.add.js b/public/bundles/ibexaadminui/js/scripts/admin.role_assignment.add.js new file mode 100644 index 000000000..70f366b33 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.role_assignment.add.js @@ -0,0 +1,101 @@ +(function (global, doc, ibexa, React, ReactDOM) { + const udwContainer = doc.getElementById('react-udw'); + const limitationsRadio = doc.querySelectorAll('.ibexa-assign__limitations-item-radio'); + const selectSubtreeWidget = new ibexa.core.TagViewSelect({ + fieldContainer: doc.querySelector('.ibexa-assign__limitations-item-subtree'), + }); + const selectUsersWidget = new ibexa.core.TagViewSelect({ + fieldContainer: doc.querySelector('.ibexa-assign__users'), + }); + const selectGroupsWidget = new ibexa.core.TagViewSelect({ + fieldContainer: doc.querySelector('.ibexa-assign__groups'), + }); + const selectSubtreeBtn = doc.querySelector('.ibexa-assign__limitations-item-select-subtree'); + const selectUsersBtn = doc.querySelector('#role_assignment_create_users__btn'); + const selectGroupsBtn = doc.querySelector('#role_assignment_create_groups__btn'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const confirmSubtreeUDW = (data) => { + ibexa.helpers.tagViewSelect.buildItemsFromUDWResponse( + data, + (item) => item.id, + (items) => { + selectSubtreeWidget.addItems(items, true); + + closeUDW(); + }, + ); + }; + const openSubtreeUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const selectedLocations = selectSubtreeWidget.inputField.value; + const selectedLocationsIds = selectedLocations ? selectedLocations.split(',') : []; + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: confirmSubtreeUDW.bind(this), + onCancel: closeUDW, + multiple: true, + selectedLocations: selectedLocationsIds, + ...config, + }), + ); + }; + const confirmUsersAndGroupsUDW = (widget, selectedItems) => { + ibexa.helpers.tagViewSelect.buildItemsFromUDWResponse( + selectedItems, + (item) => item.ContentInfo.Content._id, + (items) => { + const itemsMap = selectedItems.reduce((output, item) => ({ ...output, [item.ContentInfo.Content._id]: item.id }), {}); + + widget.addItems(items, true); + widget.selectBtn.setAttribute('data-items-map', JSON.stringify(itemsMap)); + + closeUDW(); + }, + ); + }; + const openUsersAndGroupsUDW = (widget, event) => { + event.preventDefault(); + + const selectBtn = event.currentTarget; + const config = JSON.parse(selectBtn.dataset.udwConfig); + const itemsMap = JSON.parse(selectBtn.dataset.itemsMap); + const selectedContent = widget.inputField.value; + const selectedContentIds = selectedContent ? selectedContent.split(',') : []; + const selectedLocationsIds = selectedContentIds.map((contentId) => itemsMap[contentId]); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: confirmUsersAndGroupsUDW.bind(this, widget), + onCancel: () => udwRoot.unmount(), + title: selectBtn.dataset.universaldiscoveryTitle, + multiple: true, + selectedLocations: selectedLocationsIds, + ...config, + }), + ); + }; + const toggleDisabledState = () => { + limitationsRadio.forEach((radio) => { + const disableNode = radio.closest('.ibexa-assign__limitations-item').querySelector(radio.dataset.disableSelector); + + if (disableNode) { + if (radio.dataset.disableClass) { + disableNode.classList.toggle(radio.dataset.disableClass, !radio.checked); + } else { + disableNode.toggleAttribute('disabled', !radio.checked); + } + } + }); + }; + + selectSubtreeBtn.addEventListener('click', openSubtreeUDW, false); + selectUsersBtn.addEventListener('click', openUsersAndGroupsUDW.bind(null, selectUsersWidget), false); + selectGroupsBtn.addEventListener('click', openUsersAndGroupsUDW.bind(null, selectGroupsWidget), false); + limitationsRadio.forEach((radio) => radio.addEventListener('change', toggleDisabledState, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.search.filters.js b/public/bundles/ibexaadminui/js/scripts/admin.search.filters.js new file mode 100644 index 000000000..3b1be8c62 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.search.filters.js @@ -0,0 +1,368 @@ +(function (global, doc, ibexa, flatpickr, React, ReactDOM) { + let getUsersTimeout; + const CLASS_DATE_RANGE = 'ibexa-filters__range-wrapper'; + const CLASS_VISIBLE_DATE_RANGE = 'ibexa-filters__range-wrapper--visible'; + const SELECTOR_TAG = '.ibexa-tag'; + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const filters = doc.querySelector('.ibexa-filters'); + const clearBtn = filters.querySelector('.ibexa-btn--clear'); + const applyBtn = filters.querySelector('.ibexa-btn--apply'); + const dateFields = doc.querySelectorAll('.ibexa-filters__range-wrapper'); + const contentTypeSelect = doc.querySelector('.ibexa-filters__item--content-type .ibexa-filters__select'); + const sectionSelect = doc.querySelector('.ibexa-filters__item--section .ibexa-filters__select'); + const lastModifiedSelect = doc.querySelector('.ibexa-filters__item--modified .ibexa-filters__select'); + const lastModifiedDateRange = doc.querySelector('.ibexa-filters__item--modified .ibexa-filters__range-select'); + const lastCreatedSelect = doc.querySelector('.ibexa-filters__item--created .ibexa-filters__select'); + const lastCreatedDateRange = doc.querySelector('.ibexa-filters__item--created .ibexa-filters__range-select'); + const creatorInput = doc.querySelector('.ibexa-filters__item--creator .ibexa-input'); + const searchCreatorInput = doc.querySelector('#search_creator'); + const usersList = doc.querySelector('.ibexa-filters__item--creator .ibexa-filters__user-list'); + const contentTypeCheckboxes = doc.querySelectorAll('.ibexa-content-type-selector__item [type="checkbox"]'); + const selectSubtreeBtn = doc.querySelector('.ibexa-filters__item--subtree .ibexa-tag-view-select__btn-select-path'); + const subtreeInput = doc.querySelector('#search_subtree'); + const showMoreBtns = doc.querySelectorAll('.ibexa-content-type-selector__show-more'); + const dateConfig = { + mode: 'range', + locale: { + rangeSeparator: ' - ', + }, + formatDate: (date) => ibexa.helpers.timezone.formatShortDateTime(date, null, ibexa.adminUiConfig.dateFormat.shortDate), + }; + const clearFilters = (event) => { + event.preventDefault(); + + const option = contentTypeSelect.querySelector('option'); + const defaultText = option.dataset.default; + const lastModifiedDataRange = doc.querySelector(lastModifiedSelect.dataset.targetSelector); + const lastCreatedDataRange = doc.querySelector(lastCreatedSelect.dataset.targetSelector); + const lastModifiedPeriod = doc.querySelector(lastModifiedDataRange.dataset.periodSelector); + const lastModifiedEnd = doc.querySelector(lastModifiedDataRange.dataset.endSelector); + const lastCreatedPeriod = doc.querySelector(lastCreatedDataRange.dataset.periodSelector); + const lastCreatedEnd = doc.querySelector(lastCreatedDataRange.dataset.endSelector); + + option.innerHTML = defaultText; + contentTypeCheckboxes.forEach((checkbox) => { + checkbox.removeAttribute('checked'); + checkbox.checked = false; + }); + + if (sectionSelect) { + sectionSelect[0].selected = true; + } + + lastModifiedSelect[0].selected = true; + lastCreatedSelect[0].selected = true; + lastModifiedSelect.querySelector('option').selected = true; + lastModifiedPeriod.value = ''; + lastModifiedEnd.value = ''; + lastCreatedPeriod.value = ''; + lastCreatedEnd.value = ''; + subtreeInput.value = ''; + + handleResetUser(); + + event.target.closest('form').submit(); + }; + const toggleDisabledStateOnApplyBtn = () => { + const contentTypeOption = contentTypeSelect.querySelector('option'); + const isContentTypeSelected = contentTypeOption.innerHTML !== contentTypeOption.dataset.default; + const isSectionSelected = sectionSelect ? !!sectionSelect.value : false; + const isCreatorSelected = !!searchCreatorInput.value; + const isSubtreeSelected = !!subtreeInput.value.trim().length; + let isModifiedSelected = !!lastModifiedSelect.value; + let isCreatedSelected = !!lastCreatedSelect.value; + + if (lastModifiedSelect.value === 'custom_range') { + const lastModifiedWrapper = lastModifiedDateRange.closest(`.${CLASS_DATE_RANGE}`); + const { periodSelector, endSelector } = lastModifiedWrapper.dataset; + const lastModifiedPeriodValue = doc.querySelector(periodSelector).value; + const lastModifiedEndDate = doc.querySelector(endSelector).value; + + if (!lastModifiedPeriodValue || !lastModifiedEndDate) { + isModifiedSelected = false; + } + } + + if (lastCreatedSelect.value === 'custom_range') { + const lastCreatedWrapper = lastCreatedDateRange.closest(`.${CLASS_DATE_RANGE}`); + const { periodSelector, endSelector } = lastCreatedWrapper.dataset; + const lastCreatedPeriodValue = doc.querySelector(periodSelector).value; + const lastCreatedEndDate = doc.querySelector(endSelector).value; + + if (!lastCreatedPeriodValue || !lastCreatedEndDate) { + isCreatedSelected = false; + } + } + + const isEnabled = + isContentTypeSelected || isSectionSelected || isModifiedSelected || isCreatedSelected || isCreatorSelected || isSubtreeSelected; + const methodName = isEnabled ? 'removeAttribute' : 'setAttribute'; + + applyBtn[methodName]('disabled', !isEnabled); + }; + const toggleDatesSelectVisibility = (event) => { + const datesRangeNode = doc.querySelector(event.target.dataset.targetSelector); + + if (event.target.value !== 'custom_range') { + doc.querySelector(datesRangeNode.dataset.periodSelector).value = event.target.value; + doc.querySelector(datesRangeNode.dataset.endSelector).value = ''; + datesRangeNode.classList.remove(CLASS_VISIBLE_DATE_RANGE); + + toggleDisabledStateOnApplyBtn(); + + return; + } + + datesRangeNode.classList.add(CLASS_VISIBLE_DATE_RANGE); + }; + const filterByContentType = () => { + const selectedCheckboxes = [...contentTypeCheckboxes].filter((checkbox) => checkbox.checked); + const contentTypesText = selectedCheckboxes.map((checkbox) => checkbox.dataset.name).join(', '); + const [option] = contentTypeSelect; + const defaultText = option.dataset.default; + + option.innerHTML = contentTypesText || defaultText; + + toggleDisabledStateOnApplyBtn(); + }; + const setSelectedDateRange = (timestamps, { dates, inputField }) => { + const dateRange = inputField.closest('.ibexa-filters__range-wrapper'); + + if (dates.length === 2) { + const startDate = getUnixTimestampUTC(dates[0]); + const endDate = getUnixTimestampUTC(dates[1]); + const secondsInDay = 86400; + const days = (endDate - startDate) / secondsInDay; + + doc.querySelector(dateRange.dataset.periodSelector).value = `P0Y0M${days}D`; + doc.querySelector(dateRange.dataset.endSelector).value = endDate; + } else if (dates.length === 0) { + doc.querySelector(dateRange.dataset.periodSelector).value = ''; + doc.querySelector(dateRange.dataset.endSelector).value = ''; + } + + toggleDisabledStateOnApplyBtn(); + }; + const getUnixTimestampUTC = (dateObject) => { + let date = new Date(Date.UTC(dateObject.getFullYear(), dateObject.getMonth(), dateObject.getDate())); + + date = Math.floor(date.getTime() / 1000); + + return date; + }; + const getUsersList = (value) => { + const body = JSON.stringify({ + ViewInput: { + identifier: `find-user-by-name-${value}`, + public: false, + ContentQuery: { + FacetBuilders: {}, + SortClauses: {}, + Query: { + FullTextCriterion: `${value}*`, + ContentTypeIdentifierCriterion: creatorInput.dataset.contentTypeIdentifiers.split(','), + }, + limit: 50, + offset: 0, + }, + }, + }); + const request = new Request('/api/ibexa/v2/views', { + method: 'POST', + headers: { + Accept: 'application/vnd.ibexa.api.View+json; version=1.1', + 'Content-Type': 'application/vnd.ibexa.api.ViewInput+json; version=1.1', + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + body, + mode: 'same-origin', + credentials: 'same-origin', + }); + + fetch(request) + .then((response) => response.json()) + .then(showUsersList); + }; + const createUsersListItem = (user) => { + return `
  • ${user.TranslatedName}
  • `; + }; + const showUsersList = (data) => { + const hits = data.View.Result.searchHits.searchHit; + const users = hits.reduce((total, hit) => total + createUsersListItem(hit.value.Content), ''); + const methodName = users ? 'addEventListener' : 'removeEventListener'; + + usersList.innerHTML = users; + usersList.classList.remove('ibexa-filters__user-list--hidden'); + + doc.querySelector('body')[methodName]('click', handleClickOutsideUserList, false); + }; + const handleTyping = (event) => { + const value = event.target.value.trim(); + + window.clearTimeout(getUsersTimeout); + + if (value.length > 2) { + getUsersTimeout = window.setTimeout(getUsersList.bind(null, value), 200); + } else { + usersList.classList.add('ibexa-filters__user-list--hidden'); + doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false); + } + }; + const handleSelectUser = (event) => { + searchCreatorInput.value = event.target.dataset.id; + + usersList.classList.add('ibexa-filters__user-list--hidden'); + + creatorInput.value = event.target.dataset.name; + creatorInput.setAttribute('disabled', true); + + doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false); + + toggleDisabledStateOnApplyBtn(); + }; + const handleResetUser = () => { + searchCreatorInput.value = ''; + + creatorInput.value = ''; + creatorInput.removeAttribute('disabled'); + + toggleDisabledStateOnApplyBtn(); + }; + const handleClickOutsideUserList = (event) => { + if (event.target.closest('.ibexa-filters__item--creator')) { + return; + } + + creatorInput.value = ''; + usersList.classList.add('ibexa-filters__user-list--hidden'); + doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false); + }; + const initFlatPickr = (dateRangeField) => { + const { start, end } = dateRangeField.querySelector('.ibexa-filters__range-select').dataset; + const defaultDate = start && end ? [start, end] : []; + + const dateTimePickerWidget = new ibexa.core.DateTimePicker({ + container: dateRangeField, + onChange: setSelectedDateRange, + flatpickrConfig: { + ...dateConfig, + defaultDate, + }, + }); + + dateTimePickerWidget.init(); + }; + const removeSearchTag = (event) => { + const tag = event.currentTarget.closest(SELECTOR_TAG); + const form = event.currentTarget.closest('form'); + + ibexa.helpers.tooltips.hideAll(); + tag.remove(); + form.submit(); + }; + const clearContentType = (event) => { + const checkbox = doc.querySelector(event.currentTarget.dataset.targetSelector); + + checkbox.checked = false; + removeSearchTag(event); + }; + const clearSection = (event) => { + sectionSelect[0].selected = true; + removeSearchTag(event); + }; + const clearSubtree = (event) => { + subtreeInput.value = ''; + removeSearchTag(event); + }; + const clearDataRange = (event, selector) => { + const dataRange = doc.querySelector(selector); + const rangeSelect = dataRange.parentNode.querySelector('.ibexa-filters__select'); + const periodInput = doc.querySelector(dataRange.dataset.periodSelector); + const endDateInput = doc.querySelector(dataRange.dataset.endSelector); + + rangeSelect[0].selected = true; + periodInput.value = ''; + endDateInput.vaue = ''; + dataRange.classList.remove(CLASS_VISIBLE_DATE_RANGE); + removeSearchTag(event); + }; + const clearCreator = (event) => { + handleResetUser(); + removeSearchTag(event); + }; + const clearSearchTagBtnMethods = { + section: (event) => clearSection(event), + subtree: (event) => clearSubtree(event), + creator: (event) => clearCreator(event), + 'content-types': (event) => clearContentType(event), + 'last-modified': (event) => clearDataRange(event, lastModifiedSelect.dataset.targetSelector), + 'last-created': (event) => clearDataRange(event, lastCreatedSelect.dataset.targetSelector), + }; + const showMoreContentTypes = (event) => { + const btn = event.currentTarget; + const contentTypesList = btn + .closest('.ibexa-content-type-selector__list-wrapper') + .querySelector('.ibexa-content-type-selector__list[hidden]'); + + btn.setAttribute('hidden', true); + contentTypesList.removeAttribute('hidden'); + }; + const selectSubtreeWidget = new ibexa.core.TagViewSelect({ + fieldContainer: doc.querySelector('.ibexa-filters__item--subtree'), + }); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const confirmSubtreeUDW = (data) => { + ibexa.helpers.tagViewSelect.buildItemsFromUDWResponse( + data, + (item) => item.pathString, + (items) => { + selectSubtreeWidget.addItems(items, true); + + closeUDW(); + }, + ); + }; + const openSubtreeUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: confirmSubtreeUDW.bind(this), + onCancel: closeUDW, + multiple: true, + ...config, + }), + ); + }; + + dateFields.forEach(initFlatPickr); + filterByContentType(); + + clearBtn.addEventListener('click', clearFilters, false); + + if (sectionSelect) { + sectionSelect.addEventListener('change', toggleDisabledStateOnApplyBtn, false); + } + + for (const tagType in clearSearchTagBtnMethods) { + const tagBtns = doc.querySelectorAll(`.ibexa-tag__remove-btn--${tagType}`); + + tagBtns.forEach((btn) => btn.addEventListener('click', clearSearchTagBtnMethods[tagType], false)); + } + + subtreeInput.addEventListener('change', toggleDisabledStateOnApplyBtn, false); + lastModifiedSelect.addEventListener('change', toggleDatesSelectVisibility, false); + lastCreatedSelect.addEventListener('change', toggleDatesSelectVisibility, false); + creatorInput.addEventListener('keyup', handleTyping, false); + usersList.addEventListener('click', handleSelectUser, false); + contentTypeCheckboxes.forEach((checkbox) => checkbox.addEventListener('change', filterByContentType, false)); + showMoreBtns.forEach((showMoreBtn) => showMoreBtn.addEventListener('click', showMoreContentTypes, false)); + selectSubtreeBtn.addEventListener('click', openSubtreeUDW, false); +})(window, window.document, window.ibexa, window.flatpickr, window.React, window.ReactDOM); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.search.js b/public/bundles/ibexaadminui/js/scripts/admin.search.js new file mode 100644 index 000000000..a1acdeae2 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.search.js @@ -0,0 +1,21 @@ +(function (global, doc) { + const headerSearchInput = doc.querySelector('.ibexa-main-header__search'); + const headerSearchSubmitBtn = doc.querySelector('.ibexa-main-header .ibexa-input-text-wrapper__action-btn--search'); + const searchForm = doc.querySelector('.ibexa-search-form'); + const searchInput = doc.querySelector('.ibexa-search-form__search-input'); + const languageSelector = doc.querySelector('.ibexa-filters__item--language-selector .ibexa-filters__select'); + const submitForm = () => { + searchInput.value = headerSearchInput.value; + searchForm.submit(); + }; + const handleHeaderSearchBtnClick = (event) => { + event.preventDefault(); + + submitForm(); + }; + + headerSearchInput.value = searchInput.value; + + headerSearchSubmitBtn.addEventListener('click', handleHeaderSearchBtnClick, false); + languageSelector?.addEventListener('change', submitForm, false); +})(window, document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.section.list.js b/public/bundles/ibexaadminui/js/scripts/admin.section.list.js new file mode 100644 index 000000000..6d0332475 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.section.list.js @@ -0,0 +1,36 @@ +(function (global, doc, ibexa, React, ReactDOM) { + const btns = doc.querySelectorAll('.ibexa-btn--open-udw'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (form, content) => { + const field = form.querySelector(`#${form.getAttribute('name')}_locations_location`); + + field.value = content.map((item) => item.id).join(); + + closeUDW(); + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const form = doc.querySelector('form[name="section_content_assign"]'); + const btn = event.target.closest('a'); + const config = JSON.parse(btn.dataset.udwConfig); + + form.action = btn.dataset.formAction; + doc.querySelector('#section_content_assign_section').value = btn.dataset.sectionId; + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: onConfirm.bind(this, form), + onCancel, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.section.view.js b/public/bundles/ibexaadminui/js/scripts/admin.section.view.js new file mode 100644 index 000000000..8e7eda98b --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.section.view.js @@ -0,0 +1,32 @@ +(function (global, doc, ibexa, React, ReactDOM) { + const btns = doc.querySelectorAll('.ibexa-btn--open-udw'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (form, content) => { + const field = form.querySelector(`#${form.getAttribute('name')}_locations_location`); + + field.value = content.map((item) => item.id).join(); + + closeUDW(); + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const form = event.target.closest('form'); + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: onConfirm.bind(this, form), + onCancel, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.settings.datetimeformat.update.js b/public/bundles/ibexaadminui/js/scripts/admin.settings.datetimeformat.update.js new file mode 100644 index 000000000..34bbca80c --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.settings.datetimeformat.update.js @@ -0,0 +1,42 @@ +(function (global, doc, moment) { + const SELECTOR_SHORT_DATE_FORMAT = '#user_setting_update_short_datetime_format_value_date_format'; + const SELECTOR_SHORT_TIME_FORMAT = '#user_setting_update_short_datetime_format_value_time_format'; + const SELECTOR_FULL_DATE_FORMAT = '#user_setting_update_full_datetime_format_value_date_format'; + const SELECTOR_FULL_TIME_FORMAT = '#user_setting_update_full_datetime_format_value_time_format'; + const SELECTOR_VALUE_PREVIEW = '.ibexa-datetime-format-preview-value'; + const dateFormatSelect = doc.querySelector(SELECTOR_SHORT_DATE_FORMAT); + const timeFormatSelect = doc.querySelector(SELECTOR_SHORT_TIME_FORMAT); + const fullDateFormatSelect = doc.querySelector(SELECTOR_FULL_DATE_FORMAT); + const fullTimeFormatSelect = doc.querySelector(SELECTOR_FULL_TIME_FORMAT); + const updateDateTimeFormatPreview = (valuePreview, dateFormat, timeFormat) => { + valuePreview.innerHTML = moment().formatICU(`${dateFormat} ${timeFormat}`); + }; + + if (dateFormatSelect) { + const valuePreview = dateFormatSelect.closest('#user_setting_update_short_datetime_format').querySelector(SELECTOR_VALUE_PREVIEW); + + dateFormatSelect.addEventListener('change', () => { + updateDateTimeFormatPreview(valuePreview, dateFormatSelect.value, timeFormatSelect.value); + }); + timeFormatSelect.addEventListener('change', () => { + updateDateTimeFormatPreview(valuePreview, dateFormatSelect.value, timeFormatSelect.value); + }); + + updateDateTimeFormatPreview(valuePreview, dateFormatSelect.value, timeFormatSelect.value); + } + + if (fullDateFormatSelect) { + const valuePreview = fullDateFormatSelect + .closest('#user_setting_update_full_datetime_format') + .querySelector(SELECTOR_VALUE_PREVIEW); + + fullDateFormatSelect.addEventListener('change', () => { + updateDateTimeFormatPreview(valuePreview, fullDateFormatSelect.value, fullTimeFormatSelect.value); + }); + fullTimeFormatSelect.addEventListener('change', () => { + updateDateTimeFormatPreview(valuePreview, fullDateFormatSelect.value, fullTimeFormatSelect.value); + }); + + updateDateTimeFormatPreview(valuePreview, fullDateFormatSelect.value, fullTimeFormatSelect.value); + } +})(window, window.document, window.moment); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.table.js b/public/bundles/ibexaadminui/js/scripts/admin.table.js new file mode 100644 index 000000000..e60ac8ee0 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.table.js @@ -0,0 +1,149 @@ +(function (global, doc) { + const ibexaTables = doc.querySelectorAll('.ibexa-table'); + const setMainCheckboxState = (mainCheckbox, subCheckboxes, event) => { + const isFromJS = event?.detail?.isFromJS ?? false; + + if (isFromJS) { + return; + } + + const isTableEmpty = subCheckboxes.length === 0; + + if (isTableEmpty) { + mainCheckbox.checked = false; + mainCheckbox.disabled = true; + + return; + } + + const areAllSubCheckboxesDisabled = subCheckboxes.every((checkbox) => checkbox.disabled); + const subCheckboxesStatesConsidered = areAllSubCheckboxesDisabled + ? subCheckboxes + : subCheckboxes.filter((checkbox) => !checkbox.disabled); + const areAllSubCheckboxesChecked = subCheckboxesStatesConsidered.every((checkbox) => checkbox.checked); + const areAllSubCheckboxesUnchecked = subCheckboxesStatesConsidered.every((checkbox) => !checkbox.checked); + + mainCheckbox.disabled = areAllSubCheckboxesDisabled; + + if (areAllSubCheckboxesChecked) { + mainCheckbox.checked = true; + mainCheckbox.indeterminate = false; + } else if (areAllSubCheckboxesUnchecked) { + mainCheckbox.checked = false; + mainCheckbox.indeterminate = false; + } else { + mainCheckbox.checked = false; + mainCheckbox.indeterminate = true; + } + }; + const setSubCheckboxesStates = (mainCheckbox, subCheckboxes) => { + subCheckboxes.forEach((subCheckbox) => { + if (!subCheckbox.disabled) { + subCheckbox.checked = mainCheckbox.checked; + subCheckbox.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { isFromJS: true } })); + } + }); + }; + const tablesCheckboxesChangeListeners = new Map(); + const addTableCheckboxesListeners = (table) => { + const tableBody = table.querySelector('.ibexa-table__body'); + const headCells = table.querySelectorAll('.ibexa-table__header-cell'); + const headCellsWithCheckbox = table.querySelectorAll('.ibexa-table__header-cell--checkbox'); + + const checkboxesChangeListeners = new Map(); + headCellsWithCheckbox.forEach((headCellWithCheckbox) => { + const isCustomInit = !!headCellWithCheckbox.querySelector( + '.ibexa-table__header-cell-checkbox.ibexa-table__header-cell-checkbox--custom-init', + ); + + if (isCustomInit) { + return; + } + + const mainCheckboxIndex = [...headCells].indexOf(headCellWithCheckbox); + const mainCheckbox = headCellWithCheckbox.querySelector('.ibexa-input--checkbox'); + const subCheckboxes = tableBody.querySelectorAll( + `.ibexa-table__cell--has-checkbox:nth-child(${mainCheckboxIndex + 1}) .ibexa-input--checkbox`, + ); + + if (!mainCheckbox) { + return; + } + + setMainCheckboxState(mainCheckbox, [...subCheckboxes]); + + const hadleSubCheckboxesChange = setMainCheckboxState.bind(null, mainCheckbox, [...subCheckboxes]); + const hadleMainCheckboxChange = setSubCheckboxesStates.bind(null, mainCheckbox, subCheckboxes); + + subCheckboxes.forEach((subCheckbox) => { + subCheckbox.addEventListener('change', hadleSubCheckboxesChange, false); + checkboxesChangeListeners.set(subCheckbox, hadleSubCheckboxesChange); + }); + + mainCheckbox.addEventListener('change', hadleMainCheckboxChange, false); + checkboxesChangeListeners.set(mainCheckbox, hadleMainCheckboxChange); + + tablesCheckboxesChangeListeners.set(table, checkboxesChangeListeners); + }); + }; + const removeTableCheckboxesListeners = (table) => { + const checkboxesChangeListeners = tablesCheckboxesChangeListeners.get(table); + + checkboxesChangeListeners.forEach((changeListener, checkbox) => { + if (checkbox) { + checkbox.removeEventListener('change', changeListener, false); + } + }); + + tablesCheckboxesChangeListeners.delete(table); + }; + const toggleLastColumnShadow = (table, scroller) => { + const offsetRoudingCompensator = 0.5; + const shouldShowRightColumnShadow = + scroller.scrollLeft < scroller.scrollWidth - scroller.offsetWidth - 2 * offsetRoudingCompensator; + + table.classList.toggle('ibexa-table--last-column-shadow', shouldShowRightColumnShadow); + }; + const initStickyTables = () => { + const stickyTables = doc.querySelectorAll('.ibexa-table.ibexa-table--last-column-sticky'); + + stickyTables.forEach((table) => { + const scrollableWrapper = table.closest('.ibexa-scrollable-wrapper'); + + scrollableWrapper.addEventListener('scroll', (event) => toggleLastColumnShadow(table, event.currentTarget), false); + toggleLastColumnShadow(table, scrollableWrapper); + }); + }; + + const initTableCheckboxesListeners = (table) => { + const tableHasBulkCheckbox = !!table.querySelector( + '.ibexa-table__header-cell-checkbox:not(.ibexa-table__header-cell-checkbox--custom-init)', + ); + + if (!tableHasBulkCheckbox) { + return; + } + + addTableCheckboxesListeners(table); + + table.addEventListener( + 'ibexa-refresh-main-table-checkbox', + () => { + removeTableCheckboxesListeners(table); + addTableCheckboxesListeners(table); + }, + false, + ); + }; + + ibexaTables.forEach(initTableCheckboxesListeners); + initStickyTables(); + + doc.body.addEventListener( + 'ibexa-init-main-table-checkboxes-listeners', + (event) => { + initTableCheckboxesListeners(event.detail.table); + }, + false, + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.trash.container.js b/public/bundles/ibexaadminui/js/scripts/admin.trash.container.js new file mode 100644 index 000000000..68c6e01d4 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.trash.container.js @@ -0,0 +1,17 @@ +(function (global, doc, bootstrap) { + const toggleForm = doc.querySelector('form[name="location_trash_container"]'); + const { hasAsset, hasUniqueAsset } = toggleForm.dataset; + + const openTrashImageAssetModal = (event) => { + if (!hasAsset && !hasUniqueAsset) { + return; + } + + event.preventDefault(); + + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#trash-container-modal')).hide(); + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#trash-with-asset-modal')).show(); + }; + + toggleForm.addEventListener('submit', openTrashImageAssetModal, false); +})(window, window.document, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.trash.js b/public/bundles/ibexaadminui/js/scripts/admin.trash.js new file mode 100644 index 000000000..9718d15a5 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.trash.js @@ -0,0 +1,65 @@ +(function (global, doc, Translator) { + const form = doc.querySelector('form[name="location_trash"]'); + const submitButton = form.querySelector('button[type="submit"]'); + const allOptions = form.querySelectorAll('.ibexa-modal__trash-option'); + const confirmCheckbox = form.querySelector('input[name="location_trash[confirm][]"]'); + const enableButton = (button) => { + button.disabled = false; + button.classList.remove('disabled'); + }; + const disableButton = (button) => { + button.disabled = true; + button.classList.add('disabled'); + }; + const refreshTrashModal = (event) => { + const { numberOfSubitems } = event.detail; + const sendToTrashModal = document.querySelector('.ibexa-modal--trash-location'); + const modalBody = sendToTrashModal.querySelector('.modal-body'); + const modalSendToTrashButton = sendToTrashModal.querySelector('.modal-footer .ibexa-btn--confirm-send-to-trash'); + const { contentName } = sendToTrashModal.dataset; + + if (numberOfSubitems) { + const message = Translator.trans( + /*@Desc("Sending '%content_name%' and its %children_count% Content item(s) to Trash will also send the sub-items of this Location to Trash.")*/ 'trash_container.modal.message_main', + { + content_name: contentName, + children_count: numberOfSubitems, + }, + 'content', + ); + + modalBody.querySelector('.ibexa-modal__option-description').innerHTML = message; + } else { + const message = Translator.trans( + /*@Desc("Are you sure you want to send this Content item to Trash?")*/ 'trash.modal.message', + {}, + 'content', + ); + + modalBody.innerHTML = message; + modalSendToTrashButton.removeAttribute('disabled'); + modalSendToTrashButton.classList.remove('disabled'); + } + }; + + doc.body.addEventListener('ibexa-trash-modal-refresh', refreshTrashModal, false); + + if (!confirmCheckbox) { + enableButton(submitButton); + + return; + } + + const toggleSubmitButton = () => { + const areAllOptionsChecked = [...allOptions].every((option) => { + const inputs = [...option.querySelectorAll('input')]; + const isInputChecked = (input) => input.checked; + + return inputs.length === 0 || inputs.some(isInputChecked); + }); + + areAllOptionsChecked && confirmCheckbox.checked ? enableButton(submitButton) : disableButton(submitButton); + }; + + form.addEventListener('change', toggleSubmitButton, false); +})(window, window.document, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.trash.list.js b/public/bundles/ibexaadminui/js/scripts/admin.trash.list.js new file mode 100644 index 000000000..acf4e559f --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.trash.list.js @@ -0,0 +1,290 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + let getUsersTimeout; + const CLASS_SORTED_ASC = 'ibexa-table__sort-column--asc'; + const CLASS_SORTED_DESC = 'ibexa-table__sort-column--desc'; + const CLASS_VISIBLE_DATE_RANGE = 'ibexa-trash-search-form__range-wrapper--visible'; + const sortedActiveField = doc.querySelector('#trash_search_sort_field').value; + const sortedActiveDirection = doc.querySelector('#trash_search_sort_direction').value; + const dateFields = doc.querySelectorAll('.ibexa-trash-search-form__range-wrapper'); + const trashedTypeInput = doc.querySelector('#trash_search_trashed'); + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const formSearch = doc.querySelector('form[name="trash_search"]'); + const sortField = doc.querySelector('#trash_search_sort_field'); + const sortDirection = doc.querySelector('#trash_search_sort_direction'); + const creatorInput = doc.querySelector('.ibexa-trash-search-form__item--creator .ibexa-trash-search-form__input'); + const usersList = doc.querySelector('.ibexa-trash-search-form__item--creator .ibexa-trash-search-form__user-list'); + const resetCreatorBtn = doc.querySelector('.ibexa-btn--reset-creator'); + const searchCreatorInput = doc.querySelector('#trash_search_creator'); + const sortableColumns = doc.querySelectorAll('.ibexa-table__sort-column'); + const btns = doc.querySelectorAll('.ibexa-btn--open-udw'); + const udwContainer = doc.getElementById('react-udw'); + const autoSendNodes = doc.querySelectorAll('.ibexa-trash-search-form__item--auto-send'); + const errorMessage = Translator.trans(/*@Desc("Cannot fetch user list")*/ 'trash.user_list.error', {}, 'trash_ui'); + const dateConfig = { + mode: 'range', + locale: { + rangeSeparator: ' - ', + }, + formatDate: (date) => ibexa.helpers.timezone.formatShortDateTime(date, null, ibexa.adminUiConfig.dateFormat.shortDate), + }; + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (form, content) => { + const field = form.querySelector('#trash_item_restore_location_location'); + + field.value = content.map((item) => item.id).join(); + + closeUDW(); + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const form = event.target.closest('form[name="trash_item_restore"]'); + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans( + /*@Desc("Select a Location to restore the Content item(s)")*/ 'restore_under_new_location.title', + {}, + 'universal_discovery_widget', + ); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: onConfirm.bind(this, form), + onCancel, + title, + containersOnly: true, + multiple: false, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); + + const trashRestoreCheckboxes = [...doc.querySelectorAll('form[name="trash_item_restore"] input[type="checkbox"]')]; + const buttonRestore = doc.querySelector('#trash_item_restore_restore'); + const buttonRestoreUnderNewParent = doc.querySelector('#trash_item_restore_location_select_content'); + const buttonDelete = doc.querySelector('#delete-trash-items'); + + const enableButtons = () => { + const isEmptySelection = trashRestoreCheckboxes.every((el) => !el.checked); + const isMissingParent = trashRestoreCheckboxes.some((el) => el.checked && parseInt(el.dataset.isParentInTrash, 10) === 1); + + if (buttonRestore) { + buttonRestore.disabled = isEmptySelection || isMissingParent; + } + + if (buttonDelete) { + buttonDelete.disabled = isEmptySelection; + } + + if (buttonRestoreUnderNewParent) { + buttonRestoreUnderNewParent.disabled = isEmptySelection; + } + }; + const updateTrashForm = (checkboxes) => { + checkboxes.forEach((checkbox) => { + const trashFormCheckbox = doc.querySelector(`form[name="trash_item_delete"] input[type="checkbox"][value="${checkbox.value}"]`); + + if (trashFormCheckbox) { + trashFormCheckbox.checked = checkbox.checked; + } + }); + }; + const handleCheckboxChange = (event) => { + updateTrashForm([event.target]); + enableButtons(); + }; + const handleResetUser = () => { + searchCreatorInput.value = ''; + + creatorInput.value = ''; + creatorInput.removeAttribute('disabled'); + }; + const handleClickOutsideUserList = (event) => { + if (event.target.closest('.ibexa-trash-search-form__item--creator')) { + return; + } + + creatorInput.value = ''; + usersList.classList.add('ibexa-trash-search-form__item__user-list--hidden'); + doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false); + }; + const getUsersList = (value) => { + const body = JSON.stringify({ + ViewInput: { + identifier: `find-user-by-name-${value}`, + public: false, + ContentQuery: { + FacetBuilders: {}, + SortClauses: {}, + Query: { + FullTextCriterion: `${value}*`, + ContentTypeIdentifierCriterion: creatorInput.dataset.contentTypeIdentifiers.split(','), + }, + limit: 50, + offset: 0, + }, + }, + }); + const request = new Request('/api/ibexa/v2/views', { + method: 'POST', + headers: { + Accept: 'application/vnd.ibexa.api.View+json; version=1.1', + 'Content-Type': 'application/vnd.ibexa.api.ViewInput+json; version=1.1', + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + body, + mode: 'same-origin', + credentials: 'same-origin', + }); + + fetch(request) + .then(ibexa.helpers.request.getJsonFromResponse) + .then(showUsersList) + .catch(() => ibexa.helpers.notification.showErrorNotification(errorMessage)); + }; + const createUsersListItem = (user) => { + return `
  • ${user.TranslatedName}
  • `; + }; + const showUsersList = (data) => { + const hits = data.View.Result.searchHits.searchHit; + const users = hits.reduce((total, hit) => total + createUsersListItem(hit.value.Content), ''); + const methodName = users ? 'addEventListener' : 'removeEventListener'; + + usersList.innerHTML = users; + usersList.classList.remove('ibexa-trash-search-form__user-list--hidden'); + + doc.querySelector('body')[methodName]('click', handleClickOutsideUserList, false); + }; + const handleTyping = (event) => { + const value = event.target.value.trim(); + + global.clearTimeout(getUsersTimeout); + + if (value.length > 2) { + getUsersTimeout = global.setTimeout(getUsersList.bind(null, value), 200); + } else { + usersList.classList.add('ibexa-trash-search-form__user-list--hidden'); + doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false); + } + }; + const handleSelectUser = (event) => { + searchCreatorInput.value = event.target.dataset.id; + + usersList.classList.add('ibexa-trash-search-form__user-list--hidden'); + + creatorInput.value = event.target.dataset.name; + creatorInput.setAttribute('disabled', true); + + doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false); + formSearch.submit(); + }; + const sortTrashItems = (event) => { + const { target } = event; + const { field, direction } = target.dataset; + + sortField.value = field; + target.dataset.direction = direction === 'ASC' ? 'DESC' : 'ASC'; + sortDirection.setAttribute('value', direction === 'DESC' ? 1 : 0); + formSearch.submit(); + }; + const toggleDatesSelectVisibility = (event) => { + const datesRangeNode = doc.querySelector(event.target.dataset.targetSelector); + + if (event.target.value !== 'custom_range') { + doc.querySelector(datesRangeNode.dataset.periodSelector).value = event.target.value; + doc.querySelector(datesRangeNode.dataset.endSelector).value = ''; + datesRangeNode.classList.remove(CLASS_VISIBLE_DATE_RANGE); + formSearch.submit(); + + return; + } + + datesRangeNode.classList.add(CLASS_VISIBLE_DATE_RANGE); + }; + const setSelectedDateRange = (timestamps, { dates, inputField }) => { + const dateRange = inputField.closest('.ibexa-trash-search-form__range-wrapper'); + + if (dates.length === 2) { + const startDate = getUnixTimestampUTC(dates[0]); + const endDate = getUnixTimestampUTC(dates[1]); + const secondsInDay = 86400; + const days = (endDate - startDate) / secondsInDay; + + doc.querySelector(dateRange.dataset.periodSelector).value = `P0Y0M${days}D`; + doc.querySelector(dateRange.dataset.endSelector).value = endDate; + + formSearch.submit(); + } else if (dates.length === 0) { + doc.querySelector(dateRange.dataset.periodSelector).value = ''; + doc.querySelector(dateRange.dataset.endSelector).value = ''; + + formSearch.submit(); + } + }; + const getUnixTimestampUTC = (dateObject) => { + let date = new Date(Date.UTC(dateObject.getFullYear(), dateObject.getMonth(), dateObject.getDate())); + date = Math.floor(date.getTime() / 1000); + + return date; + }; + const initFlatPickr = (dateRangeField) => { + const { start, end } = dateRangeField.querySelector('.ibexa-trash-search-form__range-select').dataset; + const defaultDate = start && end ? [start, end] : []; + + const dateTimePickerWidget = new ibexa.core.DateTimePicker({ + container: dateRangeField, + onChange: setSelectedDateRange, + flatpickrConfig: { + ...dateConfig, + defaultDate, + }, + }); + + dateTimePickerWidget.init(); + }; + const handleAutoSubmitNodes = (event) => { + event.preventDefault(); + + if (event.target.value !== 'custom_range') { + formSearch.submit(); + } + }; + const setSortedClass = () => { + doc.querySelectorAll('.ibexa-table__sort-column').forEach((node) => { + node.classList.remove(CLASS_SORTED_ASC, CLASS_SORTED_DESC); + }); + + if (sortedActiveField) { + const sortedFieldNode = doc.querySelector(`.ibexa-table__sort-column--${sortedActiveField}`); + + if (!sortedFieldNode) { + return; + } + + if (parseInt(sortedActiveDirection, 10) === 1) { + sortedFieldNode.classList.add(CLASS_SORTED_ASC); + } else { + sortedFieldNode.classList.add(CLASS_SORTED_DESC); + } + } + }; + + setSortedClass(); + dateFields.forEach(initFlatPickr); + autoSendNodes.forEach((node) => node.addEventListener('change', handleAutoSubmitNodes, false)); + sortableColumns.forEach((column) => column.addEventListener('click', sortTrashItems, false)); + trashedTypeInput.addEventListener('change', toggleDatesSelectVisibility, false); + creatorInput.addEventListener('keyup', handleTyping, false); + usersList.addEventListener('click', handleSelectUser, false); + resetCreatorBtn.addEventListener('click', handleResetUser, false); + updateTrashForm(trashRestoreCheckboxes); + enableButtons(); + trashRestoreCheckboxes.forEach((checkbox) => checkbox.addEventListener('change', handleCheckboxChange, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator, window.flatpickr); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.url.wildcards.create.js b/public/bundles/ibexaadminui/js/scripts/admin.url.wildcards.create.js new file mode 100644 index 000000000..a957dc593 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.url.wildcards.create.js @@ -0,0 +1,26 @@ +(function (global, doc) { + const modal = doc.querySelector('#create-wildcards-modal'); + + if (!modal) { + return; + } + + const discardBtns = modal.querySelectorAll('[data-bs-dismiss="modal"]'); + const submitBtn = modal.querySelector('[type="submit"]'); + const inputs = [...modal.querySelectorAll('[required="required"]')]; + const toggleButtonState = () => { + const isInvalid = inputs.some((input) => input.value.trim().length === 0); + const methodName = isInvalid ? 'setAttribute' : 'removeAttribute'; + + submitBtn[methodName]('disabled', true); + }; + const clearValues = () => { + inputs.forEach((input) => { + input.value = ''; + }); + toggleButtonState(); + }; + + inputs.forEach((input) => input.addEventListener('input', toggleButtonState, false)); + discardBtns.forEach((btn) => btn.addEventListener('click', clearValues, false)); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.urlwildcards.list.js b/public/bundles/ibexaadminui/js/scripts/admin.urlwildcards.list.js new file mode 100644 index 000000000..58d729c82 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.urlwildcards.list.js @@ -0,0 +1,7 @@ +(function (doc) { + const typeField = doc.getElementById('url_wildcard_list_type'); + + typeField.addEventListener('change', function () { + this.form.submit(); + }); +})(document); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.user.menu.js b/public/bundles/ibexaadminui/js/scripts/admin.user.menu.js new file mode 100644 index 000000000..e3a708cd2 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.user.menu.js @@ -0,0 +1,14 @@ +(function (global, doc, ibexa) { + const userMenuContainer = doc.querySelector('.ibexa-main-header__user-menu-column'); + + if (!userMenuContainer) { + return; + } + + const togglerElement = userMenuContainer.querySelector('.ibexa-header-user-menu__toggler'); + const popupMenuElement = userMenuContainer.querySelector('.ibexa-popup-menu'); + new ibexa.core.PopupMenu({ + triggerElement: togglerElement, + popupMenuElement, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/admin.version.edit.conflict.js b/public/bundles/ibexaadminui/js/scripts/admin.version.edit.conflict.js new file mode 100644 index 000000000..e5bf2a745 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/admin.version.edit.conflict.js @@ -0,0 +1,45 @@ +(function (global, doc, bootstrap, ibexa, Translator, Routing) { + const editVersion = (event) => { + const { showErrorNotification } = ibexa.helpers.notification; + const { contentDraftEditUrl, versionHasConflictUrl, contentId, languageCode } = event.currentTarget.dataset; + const checkEditPermissionLink = Routing.generate('ibexa.content.check_edit_permission', { contentId, languageCode }); + const errorMessage = Translator.trans( + /*@Desc("You don't have permission to edit this Content item")*/ 'content.edit.permission.error', + {}, + 'content', + ); + const handleCanEditCheck = (response) => { + if (response.canEdit) { + return fetch(versionHasConflictUrl, { mode: 'same-origin', credentials: 'same-origin' }); + } + + throw new Error(errorMessage); + }; + const handleVersionDraftConflict = (response) => { + // Status 409 means that a draft conflict has occurred and the modal must be displayed. + // Otherwise we can go to Content Item edit page. + if (response.status === 409) { + doc.querySelector('#edit-conflicted-draft').href = contentDraftEditUrl; + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#version-conflict-modal')).show(); + } + + if (response.status === 403) { + response.text().then(showErrorNotification); + } + + if (response.status === 200) { + global.location.href = contentDraftEditUrl; + } + }; + + event.preventDefault(); + + fetch(checkEditPermissionLink, { mode: 'same-origin', credentials: 'same-origin' }) + .then(ibexa.helpers.request.getJsonFromResponse) + .then(handleCanEditCheck) + .then(handleVersionDraftConflict) + .catch(showErrorNotification); + }; + + doc.querySelectorAll('.ibexa-btn--content-draft-edit').forEach((button) => button.addEventListener('click', editVersion, false)); +})(window, window.document, window.bootstrap, window.ibexa, window.Translator, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/autogenerate.identifier.js b/public/bundles/ibexaadminui/js/scripts/autogenerate.identifier.js new file mode 100644 index 000000000..40339cf92 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/autogenerate.identifier.js @@ -0,0 +1,14 @@ +(function (doc, ibexa) { + const sourceInputs = doc.querySelectorAll('[data-autogenerate-identifier-target-selector]'); + + sourceInputs.forEach((sourceInput) => { + const { autogenerateIdentifierTargetSelector } = sourceInput.dataset; + const targetInput = doc.querySelector(autogenerateIdentifierTargetSelector); + const identifierAutogenerator = new ibexa.core.SlugValueInputAutogenerator({ + sourceInput, + targetInput, + }); + + identifierAutogenerator.init(); + }); +})(document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/button.content.edit.js b/public/bundles/ibexaadminui/js/scripts/button.content.edit.js new file mode 100644 index 000000000..00ca739f2 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.content.edit.js @@ -0,0 +1,77 @@ +(function (global, doc, bootstrap, ibexa, Translator, Routing) { + const FORM_EDIT = 'form.ibexa-edit-content-form'; + const { showErrorNotification } = ibexa.helpers.notification; + const editVersion = (event) => { + const versionEditForm = doc.querySelector(FORM_EDIT); + const versionEditFormName = versionEditForm.name; + const { contentId, versionNo, languageCode } = event.currentTarget.dataset; + const contentInfoInput = versionEditForm.querySelector(`input[name="${versionEditFormName}[content_info]"]`); + const versionInfoContentInfoInput = versionEditForm.querySelector( + `input[name="${versionEditFormName}[version_info][content_info]"]`, + ); + const versionInfoVersionNoInput = versionEditForm.querySelector(`input[name="${versionEditFormName}[version_info][version_no]"]`); + const languageInput = versionEditForm.querySelector(`#${versionEditFormName}_language_${languageCode}`); + const checkVersionDraftLink = Routing.generate('ibexa.version_draft.has_no_conflict', { contentId, languageCode }); + const checkEditPermissionLink = Routing.generate('ibexa.content.check_edit_permission', { contentId, languageCode }); + const errorMessage = Translator.trans( + /*@Desc("You don't have permission to edit this Content item")*/ 'content.edit.permission.error', + {}, + 'content', + ); + const submitVersionEditForm = () => { + contentInfoInput.value = contentId; + versionInfoContentInfoInput.value = contentId; + versionInfoVersionNoInput.value = versionNo !== undefined ? versionNo : null; + languageInput.checked = true; + versionEditForm.submit(); + }; + const addDraft = () => { + submitVersionEditForm(); + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#version-draft-conflict-modal')).hide(); + }; + const showModal = (modalHtml) => { + const wrapper = doc.querySelector('.ibexa-modal-wrapper'); + + wrapper.innerHTML = modalHtml; + + const addDraftButton = wrapper.querySelector('.ibexa-btn--add-draft'); + + if (addDraftButton) { + addDraftButton.addEventListener('click', addDraft, false); + } + + wrapper + .querySelectorAll('.ibexa-btn--prevented') + .forEach((btn) => btn.addEventListener('click', (wrapperBtnEvent) => wrapperBtnEvent.preventDefault(), false)); + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#version-draft-conflict-modal')).show(); + }; + const handleCanEditCheck = (response) => { + if (response.canEdit) { + return fetch(checkVersionDraftLink, { mode: 'same-origin', credentials: 'same-origin' }); + } + + throw new Error(errorMessage); + }; + const handleDraftConflict = (response) => { + // Status 409 means that a draft conflict has occurred and the modal must be displayed. + // Otherwise we can go to Content Item edit page. + if (response.status === 409) { + response.text().then(showModal); + } else if (response.status === 403) { + response.text().then(showErrorNotification); + } else if (response.status === 200) { + submitVersionEditForm(); + } + }; + + event.preventDefault(); + + fetch(checkEditPermissionLink, { mode: 'same-origin', credentials: 'same-origin' }) + .then(ibexa.helpers.request.getJsonFromResponse) + .then(handleCanEditCheck) + .then(handleDraftConflict) + .catch(showErrorNotification); + }; + + doc.querySelectorAll('.ibexa-btn--content-edit').forEach((button) => button.addEventListener('click', editVersion, false)); +})(window, window.document, window.bootstrap, window.ibexa, window.Translator, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/button.prevent.default.js b/public/bundles/ibexaadminui/js/scripts/button.prevent.default.js new file mode 100644 index 000000000..0e9039e75 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.prevent.default.js @@ -0,0 +1,3 @@ +(function (global, doc) { + doc.querySelectorAll('.ibexa-btn--prevented').forEach((btn) => btn.addEventListener('click', (event) => event.preventDefault(), false)); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/button.state.checkbox.toggle.js b/public/bundles/ibexaadminui/js/scripts/button.state.checkbox.toggle.js new file mode 100644 index 000000000..9b4d40db7 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.state.checkbox.toggle.js @@ -0,0 +1,28 @@ +(function (global, doc) { + const toggleForms = doc.querySelectorAll('.ibexa-toggle-btn-state-checkbox'); + const ALL_CHECKED = 'all-checked'; + const ANY_CHECKED = 'any-checked'; + + const toggleButtonState = (button, validateCheckboxStatus) => { + let methodName = 'setAttribute'; + + if (validateCheckboxStatus()) { + methodName = 'removeAttribute'; + } + + button[methodName]('disabled', true); + }; + + toggleForms.forEach((toggleForm) => { + const checkboxInputs = [...toggleForm.querySelectorAll('input[type="checkbox"]')]; + const button = doc.querySelector(toggleForm.dataset.toggleButtonId); + const toggleMode = toggleForm.dataset.toggleMode || ANY_CHECKED; + const validateCheckboxStatus = () => + (checkboxInputs.some((el) => el.checked) && ALL_CHECKED === toggleMode) || + (checkboxInputs.every((el) => el.checked) && ANY_CHECKED === toggleMode); + + checkboxInputs.forEach((input) => + input.addEventListener('change', toggleButtonState.bind(input, button, validateCheckboxStatus), false), + ); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/button.state.radio.toggle.js b/public/bundles/ibexaadminui/js/scripts/button.state.radio.toggle.js new file mode 100644 index 000000000..33c20ebf6 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.state.radio.toggle.js @@ -0,0 +1,21 @@ +(function (global, doc) { + const toggleForms = doc.querySelectorAll('.ibexa-toggle-btn-state-radio'); + + toggleForms.forEach((toggleForm) => { + const radioInputs = [...toggleForm.querySelectorAll('input[type="radio"]')]; + const button = doc.querySelector(toggleForm.dataset.toggleButtonId); + + if (!button) { + return; + } + + const toggleButtonState = () => { + const isAnythingSelected = radioInputs.some((el) => el.checked); + + button.disabled = !isAnythingSelected; + }; + + toggleButtonState(); + radioInputs.forEach((radioInput) => radioInput.addEventListener('change', toggleButtonState, false)); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/button.state.toggle.js b/public/bundles/ibexaadminui/js/scripts/button.state.toggle.js new file mode 100644 index 000000000..a06a27b90 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.state.toggle.js @@ -0,0 +1,21 @@ +(function (global, doc) { + const toggleForms = doc.querySelectorAll('.ibexa-toggle-btn-state'); + + toggleForms.forEach((toggleForm) => { + const checkboxes = [...toggleForm.querySelectorAll('.ibexa-table__cell--has-checkbox .ibexa-input--checkbox')]; + const buttonRemove = doc.querySelector(toggleForm.dataset.toggleButtonId); + + if (!buttonRemove) { + return; + } + + const toggleButtonState = () => { + const isAnythingSelected = checkboxes.some((el) => el.checked); + + buttonRemove.disabled = !isAnythingSelected; + }; + + toggleButtonState(); + checkboxes.forEach((checkbox) => checkbox.addEventListener('change', toggleButtonState, false)); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/button.translation.edit.js b/public/bundles/ibexaadminui/js/scripts/button.translation.edit.js new file mode 100644 index 000000000..030ad2eee --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.translation.edit.js @@ -0,0 +1,56 @@ +(function (global, doc, ibexa) { + class EditTranslation { + constructor(config) { + this.container = config.container; + this.toggler = config.container.querySelector('.ibexa-btn--translations-list-toggler'); + this.translationsList = config.container.querySelector('.ibexa-translation-selector__list-wrapper'); + + this.hideTranslationsList = this.hideTranslationsList.bind(this); + this.showTranslationsList = this.showTranslationsList.bind(this); + this.setPosition = this.setPosition.bind(this); + } + + setPosition() { + const topOffset = parseInt(this.translationsList.dataset.topOffset, 10); + const topPosition = window.scrollY > topOffset ? 0 : topOffset - window.scrollY; + const height = window.scrollY > topOffset ? window.innerHeight : window.innerHeight + window.scrollY - topOffset; + + this.translationsList.style.top = `${topPosition}px`; + this.translationsList.style.height = `${height}px`; + } + + hideTranslationsList(event) { + const closestTranslationSelector = event.target.closest('.ibexa-translation-selector'); + const clickedOnTranslationsList = closestTranslationSelector && closestTranslationSelector.isSameNode(this.container); + const clickedOnDraftConflictModal = event.target.closest('.ibexa-modal--version-draft-conflict'); + + if (clickedOnTranslationsList || clickedOnDraftConflictModal) { + return; + } + + this.translationsList.classList.add('ibexa-translation-selector__list-wrapper--hidden'); + doc.removeEventListener('click', this.hideTranslationsList, false); + } + + showTranslationsList() { + this.translationsList.classList.remove('ibexa-translation-selector__list-wrapper--hidden'); + + this.setPosition(); + + doc.addEventListener('click', this.hideTranslationsList, false); + ibexa.helpers.tooltips.hideAll(); + } + + init() { + this.toggler.addEventListener('click', this.showTranslationsList, false); + } + } + + const translationSelectors = doc.querySelectorAll('.ibexa-translation-selector'); + + translationSelectors.forEach((translationSelector) => { + const editTranslation = new EditTranslation({ container: translationSelector }); + + editTranslation.init(); + }); +})(window, document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/button.trigger.js b/public/bundles/ibexaadminui/js/scripts/button.trigger.js new file mode 100644 index 000000000..bd1092535 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/button.trigger.js @@ -0,0 +1,19 @@ +(function (global, doc) { + doc.addEventListener( + 'DOMContentLoaded', + () => { + const buttons = doc.querySelectorAll('.ibexa-btn--trigger'); + const trigger = (event) => { + event.preventDefault(); + + const button = event.currentTarget; + const triggerTargetElement = doc.querySelector(button.dataset.click); + + triggerTargetElement.click(); + }; + + buttons.forEach((button) => button.addEventListener('click', trigger, false)); + }, + false, + ); +})(window, document); diff --git a/public/bundles/ibexaadminui/js/scripts/core/adaptive.items.js b/public/bundles/ibexaadminui/js/scripts/core/adaptive.items.js new file mode 100644 index 000000000..055900792 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/adaptive.items.js @@ -0,0 +1,106 @@ +(function (global, doc, ibexa) { + const OFFSET_ROUNDING_COMPENSATOR = 0.5; + class AdaptiveItems { + constructor(config) { + this.isVertical = config.isVertical ?? false; + this.prepareItemsBeforeAdapt = config.prepareItemsBeforeAdapt ?? (() => {}); + this.container = config.container; + this.items = config.items + ? [...config.items] + : [...this.container.querySelectorAll(':scope > .ibexa-adaptive-items__item:not(.ibexa-adaptive-items__item--selector)')]; + this.selectorItem = config.selectorItem ?? this.container.querySelector(':scope > .ibexa-adaptive-items__item--selector'); + this.itemHiddenClass = config.itemHiddenClass; + this.getActiveItem = config.getActiveItem; + this.onAdapted = config.onAdapted; + this.classForceHide = config.classForceHide ?? 'ibexa-adaptive-items__item--force-hide'; + this.classForceShow = config.classForceShow ?? 'ibexa-adaptive-items__item--force-show'; + this.animationFrame = null; + this.containerResizeObserver = new ResizeObserver(() => { + if (this.animationFrame) { + global.cancelAnimationFrame(this.animationFrame); + } + + this.animationFrame = global.requestAnimationFrame(() => { + this.adapt(); + }); + }); + } + + init() { + this.adapt(); + this.containerResizeObserver.observe(this.container); + } + + adapt() { + const sizeProperty = this.isVertical ? 'offsetHeight' : 'offsetWidth'; + const maxTotalSize = this.container[sizeProperty] - OFFSET_ROUNDING_COMPENSATOR; + + this.prepareItemsBeforeAdapt(); + + [this.selectorItem, ...this.items].forEach((item) => item.classList.remove(this.itemHiddenClass)); + + const activeItem = this.getActiveItem(); + const activeItemSize = activeItem ? activeItem[sizeProperty] + OFFSET_ROUNDING_COMPENSATOR : 0; + const selectorSize = this.selectorItem[sizeProperty] + OFFSET_ROUNDING_COMPENSATOR; + const forceVisibleItemsSize = [...this.items].reduce((totalSize, item) => { + const computedSize = item.classList.contains(this.classForceShow) ? item[sizeProperty] + OFFSET_ROUNDING_COMPENSATOR : 0; + + return totalSize + computedSize; + }, 0); + const hiddenItemsWithoutSelector = new Set(); + let currentSize = selectorSize + activeItemSize + forceVisibleItemsSize; + + const itemsWithoutForce = this.items.filter((item) => { + const isForceHide = item.classList.contains(this.classForceHide); + const isForceVisible = item.classList.contains(this.classForceShow); + + return !isForceHide && !isForceVisible; + }); + + for (let i = 0; i < this.items.length; i++) { + const item = this.items[i]; + const isForceHide = item.classList.contains(this.classForceHide); + const isForceVisible = item.classList.contains(this.classForceShow); + + if (isForceHide) { + hiddenItemsWithoutSelector.add(item); + + continue; + } + + if (item === activeItem) { + continue; + } + + const lastItem = this.items[this.items.length - 1]; + const isLastNonactiveItem = + lastItem === activeItem ? i === itemsWithoutForce.length - 2 : i === itemsWithoutForce.length - 1; + const allPreviousItemsVisible = hiddenItemsWithoutSelector.size === 0; + const fitsInsteadOfSelector = item[sizeProperty] + OFFSET_ROUNDING_COMPENSATOR < maxTotalSize - currentSize + selectorSize; + + if (isLastNonactiveItem && allPreviousItemsVisible && fitsInsteadOfSelector) { + break; + } + + const itemComputedSize = item[sizeProperty] + OFFSET_ROUNDING_COMPENSATOR; + + if (itemComputedSize > maxTotalSize - currentSize && !isForceVisible) { + hiddenItemsWithoutSelector.add(item); + } + + currentSize += itemComputedSize; + } + + this.items.forEach((item) => { + item.classList.toggle(this.itemHiddenClass, hiddenItemsWithoutSelector.has(item)); + }); + this.selectorItem.classList.toggle(this.itemHiddenClass, !hiddenItemsWithoutSelector.size); + + const visibleItemsWithoutSelector = new Set([...this.items].filter((item) => !hiddenItemsWithoutSelector.has(item))); + + this.onAdapted?.(visibleItemsWithoutSelector, hiddenItemsWithoutSelector); + } + } + + ibexa.addConfig('core.AdaptiveItems', AdaptiveItems); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/backdrop.js b/public/bundles/ibexaadminui/js/scripts/core/backdrop.js new file mode 100644 index 000000000..2982ad427 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/backdrop.js @@ -0,0 +1,67 @@ +(function (global, doc, ibexa) { + let id = 0; + + class Backdrop { + constructor(config = {}) { + this.isTransparent = config.isTransparent ?? false; + this.extraClasses = config.extraClasses ?? []; + this.backdrop = null; + this.id = id++; + + this.get = this.get.bind(this); + this.toggle = this.toggle.bind(this); + this.remove = this.remove.bind(this); + this.hide = this.hide.bind(this); + this.show = this.show.bind(this); + this.init = this.init.bind(this); + } + + get() { + return this.backdrop; + } + + toggle(shouldBackdropDisplay) { + this.backdrop.classList.toggle('ibexa-backdrop--active', shouldBackdropDisplay); + } + + remove() { + if (this.backdrop) { + this.backdrop.remove(); + this.backdrop = null; + } + } + + hide() { + if (this.backdrop === null) { + this.init(); + } + + this.toggle(false); + } + + show() { + if (this.backdrop === null) { + this.init(); + } + + this.toggle(true); + doc.dispatchEvent(new CustomEvent('ibexa-backdrop:after-show')); + } + + init() { + const classes = { + 'ibexa-backdrop--transparent': this.isTransparent, + }; + const backdropClasses = Object.keys(classes).filter((property) => classes[property]); + const bodyFirstNode = document.body.firstChild; + + this.backdrop = doc.createElement('div'); + this.backdrop.id = `ibexa-backdrop-no-${this.id}`; + this.backdrop.classList.add('ibexa-backdrop', ...backdropClasses, ...this.extraClasses); + doc.body.insertBefore(this.backdrop, bodyFirstNode); + ibexa.helpers.objectInstances.setInstance(this.backdrop, this); + } + } + + ibexa.addConfig('core.Backdrop', Backdrop); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/bar.chart.js b/public/bundles/ibexaadminui/js/scripts/core/bar.chart.js new file mode 100644 index 000000000..c4cafab7a --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/bar.chart.js @@ -0,0 +1,31 @@ +(function (global, doc, ibexa) { + const barDefaultOptions = { + scales: { + xAxes: [ + { + display: true, + gridLines: { + display: false, + }, + }, + ], + }, + }; + + class BarChart extends ibexa.core.BaseChart { + constructor(data, options = {}) { + super(data, { + ...barDefaultOptions, + ...options, + }); + + this.type = 'bar'; + } + + getType() { + return this.type; + } + } + + ibexa.addConfig('core.chart.BarChart', BarChart); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/base.chart.js b/public/bundles/ibexaadminui/js/scripts/core/base.chart.js new file mode 100644 index 000000000..f7647405b --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/base.chart.js @@ -0,0 +1,92 @@ +(function (global, doc, ibexa, Chart) { + const IBEXA_WHITE = '#fff'; + const IBEXA_COLOR_BASE = '#e0e0e8'; + const IBEXA_COLOR_BASE_DARK = '#878b90'; + const defaultOptions = { + responsive: true, + maintainAspectRatio: false, + legend: { + display: false, + }, + tooltips: { + enabled: true, + mode: 'nearest', + cornerRadius: 4, + borderWidth: 1, + borderColor: IBEXA_COLOR_BASE, + titleFontStyle: 'light', + titleFontColor: IBEXA_COLOR_BASE_DARK, + xPadding: 12, + yPadding: 12, + backgroundColor: IBEXA_WHITE, + callbacks: { + labelTextColor: () => { + return IBEXA_COLOR_BASE_DARK; + }, + }, + }, + }; + + class BaseChart { + constructor(data, options = {}) { + this.setData(data); + this.setOptions(options); + this.lang = document.documentElement.lang.replace('_', '-'); // TODO: Get this config from settings + } + + setData(data) { + this.datasets = data.datasets; + this.labels = data.labels; + } + + setOptions(options) { + this.options = { + ...defaultOptions, + ...options, + }; + } + + getType() {} + + getLayoutOptions() {} + + getScaleOptions() {} + + getLegendOptions() {} + + callbackAfterRender() {} + + updateChartMessageDisplay() { + const chartBody = this.chart.canvas.closest('.ibexa-chart__body'); + const chartMessagesNode = chartBody.querySelector('.ibexa-chart__message'); + + chartMessagesNode.classList.toggle('d-none', this.chart.config.data.datasets.length); + } + + updateChart() { + this.chart.data.labels = this.labels; + this.chart.data.datasets = this.datasets; + + this.chart.update(); + + this.updateChartMessageDisplay(); + this.callbackAfterRender(); + } + + render() { + this.chart = new Chart(this.canvas.getContext('2d'), { + type: this.getType(), + data: { + labels: this.labels, + datasets: this.datasets, + }, + options: this.options, + }); + + this.updateChartMessageDisplay(); + this.callbackAfterRender(); + } + } + + ibexa.addConfig('core.BaseChart', BaseChart); +})(window, window.document, window.ibexa, window.Chart); diff --git a/public/bundles/ibexaadminui/js/scripts/core/collapse.js b/public/bundles/ibexaadminui/js/scripts/core/collapse.js new file mode 100644 index 000000000..77da449ee --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/collapse.js @@ -0,0 +1,21 @@ +(function (global, doc) { + doc.querySelectorAll('.ibexa-collapse').forEach((collapseNode) => { + const toggleButton = collapseNode.querySelector('.ibexa-collapse__toggle-btn'); + const isCollapsed = toggleButton.classList.contains('collapsed'); + + collapseNode.classList.toggle('ibexa-collapse--collapsed', isCollapsed); + collapseNode.dataset.collapsed = isCollapsed; + + collapseNode.addEventListener('hide.bs.collapse', (event) => { + event.stopPropagation(); + collapseNode.classList.add('ibexa-collapse--collapsed'); + collapseNode.dataset.collapsed = true; + }); + + collapseNode.addEventListener('show.bs.collapse', (event) => { + event.stopPropagation(); + collapseNode.classList.remove('ibexa-collapse--collapsed'); + collapseNode.dataset.collapsed = false; + }); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/core/custom.tooltip.js b/public/bundles/ibexaadminui/js/scripts/core/custom.tooltip.js new file mode 100644 index 000000000..93473d94d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/custom.tooltip.js @@ -0,0 +1,4 @@ +(function (global, doc, ibexa) { + ibexa.helpers.tooltips.parse(); + ibexa.helpers.tooltips.observe(); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/date.time.picker.js b/public/bundles/ibexaadminui/js/scripts/core/date.time.picker.js new file mode 100644 index 000000000..3541f8352 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/date.time.picker.js @@ -0,0 +1,118 @@ +(function (global, doc, ibexa, flatpickr) { + const { convertDateToTimezone, formatShortDateTime } = ibexa.helpers.timezone; + const userTimezone = ibexa.adminUiConfig.timezone; + const DEFAULT_CONFIG = { + enableTime: true, + time_24hr: true, + formatDate: (date) => formatShortDateTime(date, null), + }; + + class DateTimePicker { + constructor(config) { + this.container = config.container; + this.fieldWrapper = this.container.querySelector('.ibexa-date-time-picker'); + this.inputField = this.fieldWrapper.querySelector('.ibexa-date-time-picker__input'); + this.actionsWrapper = this.fieldWrapper.querySelector('.ibexa-input-text-wrapper__actions'); + this.calendarBtn = this.actionsWrapper.querySelector('.ibexa-input-text-wrapper__action-btn--calendar'); + this.clearBtn = this.fieldWrapper.querySelector('.ibexa-input-text-wrapper__action-btn--clear'); + this.customOnChange = config.onChange; + + this.init = this.init.bind(this); + this.onChange = this.onChange.bind(this); + this.onInput = this.onInput.bind(this); + this.clear = this.clear.bind(this); + + this.flatpickrConfig = { + ...DEFAULT_CONFIG, + inline: this.fieldWrapper.classList.contains('ibexa-date-time-picker--inline-datetime-popup'), + onChange: this.onChange, + ignoredFocusElements: [this.actionsWrapper], + ...(config.flatpickrConfig ?? {}), + }; + + ibexa.helpers.objectInstances.setInstance(this.container, this); + } + + clear() { + this.flatpickrInstance.clear(); + } + + onChange(dates) { + const isDateSelected = !!dates[0]; + const otherArguments = { inputField: this.inputField, dates }; + + if (!isDateSelected) { + this.inputField.dataset.timestamp = ''; + + this.customOnChange([''], otherArguments); + + return; + } + + const timestamps = dates.map((date) => { + const selectedDateWithUserTimezone = convertDateToTimezone(date, userTimezone, true); + const timestamp = Math.floor(selectedDateWithUserTimezone.valueOf() / 1000); + + return timestamp; + }); + + [this.inputField.dataset.timestamp] = timestamps; + + this.customOnChange(timestamps, otherArguments); + } + + onInput(event) { + event.preventDefault(); + + if (event.target.value === '' && this.inputField.dataset.timestamp !== '') { + this.clear(); + } + } + + onKeyUp(isMinute, event) { + const inputValue = event.target.value; + + if (inputValue.length === 0) { + return; + } + + const value = parseInt(inputValue, 10); + + if (typeof value === 'number' && value >= 0) { + const flatpickrDate = this.flatpickrInstance.selectedDates[0]; + + if (isMinute) { + flatpickrDate.setMinutes(value); + } else { + flatpickrDate.setHours(value); + } + + if (this.flatpickrConfig.minDate.getTime() > flatpickrDate.getTime()) { + return; + } + + this.flatpickrInstance.setDate(flatpickrDate, true); + } + } + + init() { + this.flatpickrInstance = flatpickr(this.inputField, this.flatpickrConfig); + + this.inputField.addEventListener('input', this.onInput, false); + this.calendarBtn.addEventListener( + 'click', + () => { + this.flatpickrInstance.open(); + }, + false, + ); + + if (this.flatpickrInstance.config.enableTime) { + this.flatpickrInstance.minuteElement.addEventListener('keyup', this.onKeyUp.bind(this, true), false); + this.flatpickrInstance.hourElement.addEventListener('keyup', this.onKeyUp.bind(this, false), false); + } + } + } + + ibexa.addConfig('core.DateTimePicker', DateTimePicker); +})(window, window.document, window.ibexa, window.flatpickr); diff --git a/public/bundles/ibexaadminui/js/scripts/core/draggable.js b/public/bundles/ibexaadminui/js/scripts/core/draggable.js new file mode 100644 index 000000000..1659834d1 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/draggable.js @@ -0,0 +1,199 @@ +(function (global, doc, ibexa) { + const SELECTOR_PLACEHOLDER = '.ibexa-draggable__placeholder'; + const SELECTOR_PREVENT_DRAG = '.ibexa-draggable__prevent-drag'; + const TIMEOUT_REMOVE_HIGHLIGHT = 3000; + + class Draggable { + constructor(config) { + this.draggedItem = null; + this.placeholder = null; + this.onDragOverTimeout = null; + this.itemsContainer = config.itemsContainer; + this.selectorItem = config.selectorItem; + this.selectorPlaceholder = config.selectorPlaceholder || SELECTOR_PLACEHOLDER; + this.selectorPreventDrag = config.selectorPreventDrag || SELECTOR_PREVENT_DRAG; + this.selectorItemContent = `${this.selectorItem}__content`; + this.itemMainClass = this.selectorItem.slice(1); + this.highlightClass = `${this.itemMainClass}--highlighted`; + this.draggingOutClass = `${this.itemMainClass}--is-dragging-out`; + this.removingClass = `${this.itemMainClass}--is-removing`; + this.removedClass = `${this.itemMainClass}--removed`; + this.placeholderPositionData = {}; + + this.onDragStart = this.onDragStart.bind(this); + this.onDragEnd = this.onDragEnd.bind(this); + this.onDragOver = this.onDragOver.bind(this); + this.onDrop = this.onDrop.bind(this); + this.addPlaceholder = this.addPlaceholder.bind(this); + this.removePlaceholder = this.removePlaceholder.bind(this); + this.attachEventHandlersToItem = this.attachEventHandlersToItem.bind(this); + this.getPlaceholderNode = this.getPlaceholderNode.bind(this); + this.toggleNonInteractive = this.toggleNonInteractive.bind(this); + this.removeHighlight = this.removeHighlight.bind(this); + this.triggerHighlight = this.triggerHighlight.bind(this); + } + + attachEventHandlersToItem(item) { + item.ondragstart = this.onDragStart; + item.ondragend = this.onDragEnd; + item.addEventListener('ibexa-drag-and-drop:start-removing', () => { + item.classList.add(this.removingClass); + }); + item.addEventListener('ibexa-drag-and-drop:end-removing', (event) => { + item.classList.add(this.removedClass); + + item.addEventListener('animationend', () => { + item.remove(); + event.detail.callback(); + }); + }); + + const preventedNode = item.querySelector(this.selectorPreventDrag); + + if (preventedNode) { + preventedNode.draggable = true; + preventedNode.ondragstart = (event) => { + event.preventDefault(); + event.stopPropagation(); + }; + } + } + + triggerHighlight(item) { + item.classList.add(this.highlightClass); + + global.setTimeout(() => { + this.removeHighlight(); + }, TIMEOUT_REMOVE_HIGHLIGHT); + } + + removeHighlight() { + const highlightedItem = doc.querySelector(`.${this.highlightClass}`); + + highlightedItem?.classList.remove(this.highlightClass); + } + + getPlaceholderNode(event) { + const { target, clientY } = event; + + const itemNode = target.closest(`${this.selectorItem}:not(${this.selectorPlaceholder})`); + + if (itemNode) { + return itemNode; + } + + const items = [...this.itemsContainer.querySelectorAll(this.selectorItem)]; + items.reverse(); + + const insertAfterItem = items.find((item) => { + const { top } = item.getBoundingClientRect(); + + return top <= clientY; + }); + + return insertAfterItem; + } + + getPlaceholderPositionTop(item, event) { + return event.clientY; + } + + toggleNonInteractive(state) { + [...this.itemsContainer.querySelectorAll(this.selectorItem)].forEach((el) => { + el.classList.toggle(`${this.itemMainClass}--is-non-interactive`, state); + }); + } + + onDragStart(event) { + event.dataTransfer.dropEffect = 'move'; + event.dataTransfer.setData('text/html', event.currentTarget); + + setTimeout(() => { + event.target.closest(this.selectorItem).classList.add(this.draggingOutClass); + this.toggleNonInteractive(true); + }, 0); + this.draggedItem = event.currentTarget; + } + + onDragEnd() { + this.itemsContainer.querySelector(`.${this.draggingOutClass}`).classList.remove(this.draggingOutClass); + this.toggleNonInteractive(false); + } + + onDragOver(event) { + const item = this.getPlaceholderNode(event); + + if (!item) { + return false; + } + + const positionY = this.getPlaceholderPositionTop(item, event); + + if (item.isSameNode(this.placeholderPositionData.item) && this.placeholderPositionData.positionY === positionY) { + return false; + } + + this.placeholderPositionData = { + item, + positionY, + }; + + this.removePlaceholder(); + + this.addPlaceholder(item, positionY); + + return true; + } + + onDrop() { + this.itemsContainer.insertBefore(this.draggedItem, this.itemsContainer.querySelector(this.selectorPlaceholder)); + this.removePlaceholder(); + this.triggerHighlight(this.draggedItem); + } + + addPlaceholder(element, positionY) { + const container = doc.createElement('div'); + const rect = element.getBoundingClientRect(); + const middlePositionY = rect.top + rect.height / 2; + const where = positionY <= middlePositionY ? element : element.nextSibling; + + container.insertAdjacentHTML('beforeend', this.itemsContainer.dataset.placeholder); + + this.placeholder = container.querySelector(this.selectorPlaceholder); + + this.itemsContainer.insertBefore(this.placeholder, where); + } + + removePlaceholder() { + if (this.placeholder) { + this.placeholder.remove(); + } + } + + init() { + this.itemsContainer.ondragover = this.onDragOver; + this.itemsContainer.addEventListener('drop', this.onDrop, false); + + doc.body.addEventListener('dragover', (event) => { + if ( + !this.itemsContainer.contains(event.target) && + !event.target.classList.contains('ibexa-field-definitions-placeholder') + ) { + this.removePlaceholder(); + } else { + event.preventDefault(); + } + }); + + this.itemsContainer.querySelectorAll(this.selectorItem).forEach(this.attachEventHandlersToItem); + } + + reinit() { + this.itemsContainer.removeEventListener('drop', this.onDrop); + + this.init(); + } + } + + ibexa.addConfig('core.Draggable', Draggable); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/dropdown.js b/public/bundles/ibexaadminui/js/scripts/core/dropdown.js new file mode 100644 index 000000000..30a12c644 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/dropdown.js @@ -0,0 +1,545 @@ +(function (global, doc, ibexa, bootstrap, Translator) { + const EVENT_VALUE_CHANGED = 'change'; + const RESTRICTED_AREA_ITEMS_CONTAINER = 190; + const MINIMUM_LETTERS_TO_FILTER = 3; + + class DropdownPopover extends bootstrap.Popover { + constructor(...args) { + const { dropdown } = args.pop(); + + super(...args); + + this.dropdown = dropdown; + } + + show() { + if (this.dropdown.container.classList.contains('ibexa-dropdown--disabled')) { + return; + } + + super.show(); + } + } + class Dropdown { + constructor(config = {}) { + this.container = config.container.classList.contains('ibexa-dropdown') + ? config.container + : config.container.querySelector('.ibexa-dropdown'); + + if (!this.container) { + throw new Error('No valid container provided'); + } + + this.sourceInput = this.container.querySelector(config.selectorSource ?? '.ibexa-dropdown__source .ibexa-input'); + this.selectedItemsContainer = this.container.querySelector('.ibexa-dropdown__selection-info'); + this.itemsFixedWrapperContainer = this.container.querySelector('.ibexa-dropdown__items-fixed-wrapper'); + this.itemsContainer = this.container.querySelector('.ibexa-dropdown__items'); + this.itemsListContainer = this.itemsContainer.querySelector('.ibexa-dropdown__items-list'); + this.itemsFilterInput = this.itemsContainer.querySelector('.ibexa-dropdown__items-filter'); + this.selectionTogglerBtn = this.itemsContainer.querySelector('.ibexa-dropdown__selection-toggler-btn'); + + this.isDynamic = this.container.classList.contains('ibexa-dropdown--dynamic'); + this.canSelectOnlyOne = !this.sourceInput?.multiple; + this.selectedItemTemplate = this.selectedItemsContainer.dataset.template; + this.selectedItemIconTemplate = this.selectedItemsContainer.dataset.iconTemplate; + this.selectedItemLabel = this.selectedItemsContainer.dataset.selectedItemLabel; + this.itemTemplate = this.itemsListContainer.dataset.template; + this.sourceOptionsObserver = new MutationObserver((mutationsList) => { + if (this.hasChangedOptions(mutationsList)) { + this.recreateOptions(); + } + }); + this.sourceInvalidObserver = new MutationObserver((mutationsList) => { + const isInvalid = mutationsList[0].target.classList.contains('is-invalid'); + + this.container.classList.toggle('is-invalid', isInvalid); + }); + this.currentSelectedValue = this.sourceInput.value; + + this.createSelectedItem = this.createSelectedItem.bind(this); + this.hideOptions = this.hideOptions.bind(this); + this.fitItems = this.fitItems.bind(this); + this.clearCurrentSelection = this.clearCurrentSelection.bind(this); + this.onSelect = this.onSelect.bind(this); + this.onInteractionOutside = this.onInteractionOutside.bind(this); + this.onOptionClick = this.onOptionClick.bind(this); + this.fireValueChangedEvent = this.fireValueChangedEvent.bind(this); + this.filterItems = this.filterItems.bind(this); + this.toggleItemsSelection = this.toggleItemsSelection.bind(this); + this.setSelectionTogglerLabel = this.setSelectionTogglerLabel.bind(this); + this.onPopoverShow = this.onPopoverShow.bind(this); + this.onPopoverHide = this.onPopoverHide.bind(this); + this.itemsPopoverContent = this.itemsPopoverContent.bind(this); + this.onSourceFocus = this.onSourceFocus.bind(this); + this.onSourceBlur = this.onSourceBlur.bind(this); + + ibexa.helpers.objectInstances.setInstance(this.container, this); + } + + attachSelectedItemEvents(item) { + const removeSelectionBtn = item.querySelector('.ibexa-dropdown__remove-selection'); + + removeSelectionBtn.addEventListener('click', (event) => { + event.stopPropagation(); + this.deselectOption(item); + }); + } + + createSelectedItem(value, label, icon) { + const container = doc.createElement('div'); + const selectedItemRendered = this.selectedItemTemplate + .replace('{{ value }}', ibexa.helpers.text.escapeHTMLAttribute(value)) + .replace('{{ label }}', label); + + container.insertAdjacentHTML('beforeend', selectedItemRendered); + + const selectedItemNode = container.querySelector('.ibexa-dropdown__selected-item'); + const removeSelectionBtn = selectedItemNode.querySelector('.ibexa-dropdown__remove-selection'); + + if (icon) { + const iconWrapper = container.querySelector('.ibexa-dropdown__selected-item-icon'); + const selectedItemIconRendered = this.selectedItemIconTemplate.replace('{{ icon }}', icon); + + iconWrapper.insertAdjacentHTML('beforeend', selectedItemIconRendered); + } + + selectedItemNode.classList.toggle('ibexa-dropdown__selected-item--has-icon', !!icon); + + this.attachSelectedItemEvents(selectedItemNode); + + removeSelectionBtn.addEventListener('click', (event) => { + event.stopPropagation(); + this.deselectOption(selectedItemNode); + }); + + return selectedItemNode; + } + + clearCurrentSelection(shouldFireChangeEvent = true) { + const overflowNumber = this.selectedItemsContainer.querySelector('.ibexa-dropdown__selected-overflow-number').cloneNode(true); + + this.sourceInput.querySelectorAll('option').forEach((option) => (option.selected = false)); + this.itemsListContainer.querySelectorAll('.ibexa-dropdown__item--selected').forEach((option) => { + const checkbox = option.querySelector('.ibexa-input--checkbox'); + + option.classList.remove('ibexa-dropdown__item--selected'); + + if (checkbox) { + checkbox.checked = false; + } + }); + this.selectedItemsContainer.innerHTML = ''; + this.selectedItemsContainer.insertAdjacentHTML('beforeend', this.selectedItemsContainer.dataset.placeholderTemplate); + this.selectedItemsContainer.append(overflowNumber); + this.fitItems(); + + if (shouldFireChangeEvent) { + this.fireValueChangedEvent(); + } + } + + hideOptions() { + doc.body.removeEventListener('click', this.onClickOutside); + + this.itemsPopover.hide(); + } + + selectFirstOption() { + const firstOption = this.container.querySelector('.ibexa-dropdown__source option'); + + return this.selectOption(firstOption.value, true); + } + + selectOption(value) { + const stringifiedValue = JSON.stringify(String(value)); + const optionToSelect = this.itemsListContainer.querySelector(`.ibexa-dropdown__item[data-value=${stringifiedValue}]`); + + return this.onSelect(optionToSelect, true); + } + + onSelect(element, selected) { + const { choiceIcon } = element.dataset; + const value = JSON.stringify(String(element.dataset.value)); + + if (this.canSelectOnlyOne && selected) { + this.hideOptions(); + this.clearCurrentSelection(false); + } + + if (value) { + this.sourceInput.querySelector(`[value=${value}]`).selected = selected; + + if (!this.canSelectOnlyOne) { + element.querySelector('.ibexa-input').checked = selected; + } + } + + this.itemsListContainer.querySelector(`[data-value=${value}]`).classList.toggle('ibexa-dropdown__item--selected', selected); + + const selectedItemsList = this.container.querySelector('.ibexa-dropdown__selection-info'); + + if (selected) { + const labelNode = element.querySelector('.ibexa-dropdown__item-label'); + const label = this.selectedItemLabel ?? labelNode.innerHTML; + const targetPlace = selectedItemsList.querySelector('.ibexa-dropdown__selected-item--predefined'); + + this.selectedItemsContainer.insertBefore(this.createSelectedItem(value, label, choiceIcon), targetPlace); + } else { + const valueNode = selectedItemsList.querySelector(`[data-value=${value}]`); + + if (valueNode) { + valueNode.remove(); + } + } + + this.fitItems(); + + if (this.currentSelectedValue !== value || !this.canSelectOnlyOne) { + this.fireValueChangedEvent(); + + this.currentSelectedValue = value; + } + } + + onInteractionOutside(event) { + if (this.itemsPopover.tip.contains(event.target)) { + return; + } + + this.hideOptions(); + } + + fireValueChangedEvent() { + this.sourceInput.dispatchEvent(new CustomEvent(EVENT_VALUE_CHANGED)); + } + + getItemsContainerHeight() { + const DROPDOWN_MARGIN = 32; + const documentElementHeight = global.innerHeight; + const { top, bottom } = this.selectedItemsContainer.getBoundingClientRect(); + const topHeight = top; + const bottomHeight = documentElementHeight - bottom; + + return Math.max(topHeight, bottomHeight) - DROPDOWN_MARGIN; + } + + onPopoverShow() { + doc.body.addEventListener('click', this.onInteractionOutside, false); + } + + onPopoverHide() { + doc.body.removeEventListener('click', this.onInteractionOutside, false); + } + + onOptionClick({ target }) { + const option = target.closest('.ibexa-dropdown__item'); + const isSelected = this.canSelectOnlyOne || !option.classList.contains('ibexa-dropdown__item--selected'); + + return this.onSelect(option, isSelected); + } + + deselectOption(option) { + const value = JSON.stringify(String(option.dataset.value)); + const optionSelect = this.sourceInput.querySelector(`[value=${value}]`); + const itemSelected = this.itemsListContainer.querySelector(`[data-value=${value}]`); + + itemSelected.classList.remove('ibexa-dropdown__item--selected'); + + if (!this.canSelectOnlyOne) { + itemSelected.querySelector('.ibexa-input').checked = false; + } + + if (optionSelect) { + optionSelect.selected = false; + } + + option.remove(); + this.currentSelectedValue = null; + + this.fitItems(); + this.fireValueChangedEvent(); + } + + fitItems() { + if (this.canSelectOnlyOne) { + return; + } + + let itemsWidth = 0; + let numberOfOverflowItems = 0; + const selectedItems = this.selectedItemsContainer.querySelectorAll('.ibexa-dropdown__selected-item'); + const selectedItemsOverflow = this.selectedItemsContainer.querySelector('.ibexa-dropdown__selected-overflow-number'); + const dropdownItemsContainerWidth = this.selectedItemsContainer.offsetWidth - RESTRICTED_AREA_ITEMS_CONTAINER; + + if (selectedItemsOverflow) { + selectedItems.forEach((item) => { + item.hidden = false; + }); + selectedItems.forEach((item, index) => { + const isOverflowNumber = item.classList.contains('ibexa-dropdown__selected-overflow-number'); + + itemsWidth += item.offsetWidth; + + if (!isOverflowNumber && index !== 0 && itemsWidth > dropdownItemsContainerWidth) { + const isPlaceholder = item.classList.contains('ibexa-dropdown__selected-placeholder'); + + item.hidden = true; + + if (!isPlaceholder) { + numberOfOverflowItems++; + } + } + }); + + if (numberOfOverflowItems) { + selectedItemsOverflow.hidden = false; + selectedItemsOverflow.innerHTML = numberOfOverflowItems; + this.container.classList.add('ibexa-dropdown--overflow'); + } else { + selectedItemsOverflow.hidden = true; + this.container.classList.remove('ibexa-dropdown--overflow'); + } + } + } + + compareItem(itemFilterValue, searchedTerm) { + const itemFilterValueLowerCase = itemFilterValue.toLowerCase(); + const searchedTermLowerCase = searchedTerm.toLowerCase(); + + return itemFilterValueLowerCase.includes(searchedTermLowerCase); + } + + filterItems(event) { + const forceShowItems = event.currentTarget.value.length < MINIMUM_LETTERS_TO_FILTER; + const allItems = [...this.itemsListContainer.querySelectorAll('[data-filter-value]')]; + const groups = [...this.itemsListContainer.querySelectorAll('.ibexa-dropdown__item-group')]; + const separator = this.itemsListContainer.querySelector('.ibexa-dropdown__separator'); + let hideSeparator = true; + + if (separator) { + separator.setAttribute('hidden', 'hidden'); + } + + allItems.forEach((item) => { + const isItemVisible = forceShowItems || this.compareItem(item.dataset.filterValue, event.currentTarget.value); + const isPreferredChoice = item.classList.contains('ibexa-dropdown__item--preferred-choice'); + + if (isPreferredChoice && isItemVisible) { + hideSeparator = false; + } + + item.classList.toggle('ibexa-dropdown__item--hidden', !isItemVisible); + }); + + groups.forEach((group) => { + const areAllItemsHidden = !group.querySelectorAll('.ibexa-dropdown__item:not(.ibexa-dropdown__item--hidden)').length; + + group.classList.toggle('ibexa-dropdown__item-group--hidden', areAllItemsHidden); + }); + + if (separator && !hideSeparator) { + separator.removeAttribute('hidden'); + } + } + + itemsPopoverContent() { + const { width } = this.selectedItemsContainer.getBoundingClientRect(); + const minItemWidth = parseInt(this.selectedItemsContainer.dataset.minItemWidth, 10); + const computedItemWidth = width > minItemWidth ? width : minItemWidth; + + this.itemsContainer.style['max-height'] = `${this.getItemsContainerHeight()}px`; + this.itemsContainer.style.minWidth = `${computedItemWidth}px`; + + return this.itemsContainer; + } + + hasChangedOptions(mutationList) { + return mutationList.some((mutationRecord) => mutationRecord.addedNodes.length || mutationRecord.removedNodes.length); + } + + getSelectedItems() { + return [...this.sourceInput.querySelectorAll(':checked')]; + } + + recreateOptions() { + const optionsToRecreate = this.sourceInput.querySelectorAll('option'); + + this.itemsListContainer.querySelectorAll('.ibexa-dropdown__item').forEach((item) => { + this.removeOption(item.dataset.value); + }); + + optionsToRecreate.forEach((option) => { + this.createOption(option.value, option.innerHTML); + }); + + const selectedItems = this.getSelectedItems(); + + this.clearCurrentSelection(false); + this.fitItems(); + selectedItems.forEach((selectedItem) => { + this.selectOption(selectedItem.value); + }); + this.container.classList.toggle('ibexa-dropdown--disabled', !optionsToRecreate.length); + + if (!optionsToRecreate.length) { + this.selectedItemsContainer.insertAdjacentHTML('afterbegin', this.selectedItemsContainer.dataset.placeholderTemplate); + } + } + + removeOption(value) { + const stringifiedValue = JSON.stringify(String(value)); + const optionNode = this.itemsListContainer.querySelector(`[data-value=${stringifiedValue}]`); + + optionNode.remove(); + } + + createOption(value, label) { + const container = doc.createElement('div'); + const itemRendered = this.itemTemplate + .replaceAll('{{ value }}', ibexa.helpers.text.escapeHTMLAttribute(value)) + .replaceAll('{{ label }}', label); + + container.insertAdjacentHTML('beforeend', itemRendered); + + const optionNode = container.firstElementChild; + + optionNode.addEventListener('click', this.onOptionClick, false); + this.itemsListContainer.append(optionNode); + } + + toggleSourceFocus(isFocused) { + this.container.classList.toggle('ibexa-dropdown--focused', isFocused); + } + + toggleItemsSelection() { + const items = this.itemsContainer.querySelectorAll('.ibexa-dropdown__item'); + const selectedItems = this.getSelectedItems(); + const areSomeItemsSelected = !!selectedItems.length; + + if (areSomeItemsSelected) { + this.clearCurrentSelection(); + } else { + items.forEach((item) => this.selectOption(item.dataset.value)); + } + + this.fitItems(); + } + + onSourceFocus() { + this.toggleSourceFocus(true); + } + + onSourceBlur() { + this.toggleSourceFocus(false); + } + + setSelectionTogglerLabel() { + const selectedItems = this.getSelectedItems(); + const label = selectedItems.length + ? Translator.trans( + /*@Desc("Clear (%selected_items_count%)")*/ 'dropdown.clear', + { selected_items_count: selectedItems.length }, + 'messages', + ) + : Translator.trans(/*@Desc("Select All")*/ 'dropdown.select_all', {}, 'messages'); + + this.selectionTogglerBtn.innerHTML = label; + } + + init() { + if (this.container.dataset.initialized) { + console.warn('Dropdown has already been initialized!'); + + return; + } + + this.container.dataset.initialized = true; + + this.sourceInput.addEventListener('focus', this.onSourceFocus, false); + this.sourceInput.addEventListener('blur', this.onSourceBlur, false); + + const optionsCount = this.container.querySelectorAll('.ibexa-dropdown__source option').length; + + if (!optionsCount) { + return; + } + + this.itemsPopover = new DropdownPopover( + this.selectedItemsContainer, + { + html: true, + placement: 'bottom', + customClass: 'ibexa-dropdown-popover', + content: this.itemsPopoverContent, + container: 'body', + }, + { dropdown: this }, + ); + this.itemsPopover._element.removeAttribute('title'); + + if (this.isDynamic) { + this.selectFirstOption(); + } + + if (this.selectionTogglerBtn) { + this.selectionTogglerBtn.addEventListener('click', this.toggleItemsSelection, false); + this.sourceInput.addEventListener('change', this.setSelectionTogglerLabel, false); + } + + this.hideOptions(); + this.fitItems(); + + this.itemsPopover._element.addEventListener('shown.bs.popover', this.onPopoverShow); + this.itemsPopover._element.addEventListener('hidden.bs.popover', this.onPopoverHide); + this.itemsListContainer + .querySelectorAll('.ibexa-dropdown__item:not([disabled])') + .forEach((option) => option.addEventListener('click', this.onOptionClick, false)); + + if (this.itemsFilterInput) { + const modal = this.container.closest('.modal'); + const popupInputs = this.itemsContainer.querySelectorAll('input'); + + popupInputs.forEach((popupInput) => + popupInput.addEventListener( + 'focusin', + () => { + const modalInstance = bootstrap.Modal.getInstance(modal); + + if (modalInstance) { + modalInstance._focustrap.deactivate(); + + this.itemsFilterInput.addEventListener( + 'focusout', + () => { + modalInstance._focustrap.activate(); + }, + { once: true }, + ); + } + }, + false, + ), + ); + + this.itemsFilterInput.addEventListener('keyup', this.filterItems, false); + this.itemsFilterInput.addEventListener('input', this.filterItems, false); + } + + this.sourceOptionsObserver.observe(this.sourceInput, { + childList: true, + }); + this.sourceInvalidObserver.observe(this.sourceInput, { + attributes: true, + attributeFilter: ['class'], + }); + + const selectedItems = this.container.querySelectorAll( + '.ibexa-dropdown__selected-item:not(.ibexa-dropdown__selected-overflow-number):not(.ibexa-dropdown__selected-placeholder)', + ); + + selectedItems.forEach((selectedItem) => this.attachSelectedItemEvents(selectedItem)); + } + } + + ibexa.addConfig('core.Dropdown', Dropdown); +})(window, window.document, window.ibexa, window.bootstrap, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/core/line.chart.js b/public/bundles/ibexaadminui/js/scripts/core/line.chart.js new file mode 100644 index 000000000..84578fed8 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/line.chart.js @@ -0,0 +1,73 @@ +(function (global, doc, ibexa, Chart) { + const MAX_NUMBER_OF_LABELS = 16; + const lineDefaultOptions = { + elements: { + point: { + radius: 2, + }, + line: { + tension: 0, + }, + }, + scales: { + xAxes: [ + { + display: true, + gridLines: { + display: false, + }, + ticks: { + maxRotation: 0, + autoSkip: false, + callback: (value, index, labels) => { + const labelsInterval = Math.max(Math.ceil(labels.length / MAX_NUMBER_OF_LABELS), 1); + const shouldDisplayLabel = !(index % labelsInterval); + + return shouldDisplayLabel ? value : null; + }, + }, + }, + ], + yAxes: [ + { + display: true, + type: 'logarithmic', + ticks: { + callback: (...args) => { + const value = Chart.Ticks.formatters.logarithmic.call(this, ...args); + + if (value.length) { + return Number(value).toLocaleString(); + } + + return value; + }, + }, + }, + ], + }, + }; + + class LineChart extends ibexa.core.BaseChart { + constructor(data, options = {}) { + super(data, { + ...lineDefaultOptions, + ...options, + }); + + this.type = 'line'; + } + + getType() { + return this.type; + } + + setData(data) { + super.setData(data); + + this.labelsInterval = Math.max(Math.ceil(this.labels.length / MAX_NUMBER_OF_LABELS), 1); + } + } + + ibexa.addConfig('core.chart.LineChart', LineChart); +})(window, window.document, window.ibexa, window.Chart); diff --git a/public/bundles/ibexaadminui/js/scripts/core/pie.chart.js b/public/bundles/ibexaadminui/js/scripts/core/pie.chart.js new file mode 100644 index 000000000..6c26e363e --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/pie.chart.js @@ -0,0 +1,15 @@ +(function (global, doc, ibexa) { + class PieChart extends ibexa.core.BaseChart { + constructor(data) { + super(data); + + this.type = 'pie'; + } + + getType() { + return this.type; + } + } + + ibexa.addConfig('core.chart.PieChart', PieChart); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/popup.menu.js b/public/bundles/ibexaadminui/js/scripts/core/popup.menu.js new file mode 100644 index 000000000..8ba365f92 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/popup.menu.js @@ -0,0 +1,107 @@ +(function (global, doc, ibexa) { + const CLASS_POPUP_MENU_HIDDEN = 'ibexa-popup-menu--hidden'; + class PopupMenu { + constructor(config) { + this.popupMenuElement = config.popupMenuElement; + this.triggerElement = config.triggerElement; + this.onItemClick = config.onItemClick || (() => {}); + this.position = config.position || (() => {}); + + this.attachOnClickToItem = this.attachOnClickToItem.bind(this); + this.handleToggle = this.handleToggle.bind(this); + this.handleClickOutsidePopupMenu = this.handleClickOutsidePopupMenu.bind(this); + + this.triggerElement.addEventListener('click', this.handleToggle, false); + doc.addEventListener('click', this.handleClickOutsidePopupMenu, false); + + this.attachOnClickToExistingItems(); + } + + generateItems(itemsToGenerate, processAfterCreated) { + const { itemTemplate } = this.popupMenuElement.dataset; + const fragment = doc.createDocumentFragment(); + + itemsToGenerate.forEach((item) => { + const container = doc.createElement('ul'); + const renderedItem = itemTemplate.replace('{{ label }}', item.label); + + container.insertAdjacentHTML('beforeend', renderedItem); + + const popupMenuItem = container.querySelector('.ibexa-popup-menu__item'); + + processAfterCreated(popupMenuItem, item); + + popupMenuItem.addEventListener( + 'click', + (event) => { + this.popupMenuElement.classList.add(CLASS_POPUP_MENU_HIDDEN); + this.onItemClick(event); + }, + false, + ); + + fragment.append(popupMenuItem); + }); + + this.popupMenuElement.innerHTML = ''; + this.popupMenuElement.append(fragment); + } + + attachOnClickToExistingItems() { + const items = this.getItems(); + + items.forEach(this.attachOnClickToItem); + } + + attachOnClickToItem(item) { + item.querySelector('.ibexa-popup-menu__item-content').addEventListener( + 'click', + (event) => { + this.popupMenuElement.classList.add(CLASS_POPUP_MENU_HIDDEN); + this.onItemClick(event); + }, + false, + ); + } + + getItems() { + return this.popupMenuElement.querySelectorAll('.ibexa-popup-menu__item'); + } + + toggleItems(shouldHide) { + const popupMenuItems = [...this.popupMenuElement.querySelectorAll('.ibexa-popup-menu__item')]; + + popupMenuItems.forEach((popupMenuItem) => { + popupMenuItem.classList.toggle('ibexa-popup-menu__item--hidden', shouldHide(popupMenuItem)); + }); + } + + handleToggle() { + this.popupMenuElement.classList.toggle(CLASS_POPUP_MENU_HIDDEN); + this.updatePosition(); + } + + handleClickOutsidePopupMenu(event) { + const isPopupMenuExpanded = !this.popupMenuElement.classList.contains(CLASS_POPUP_MENU_HIDDEN); + const isClickInsideParentElement = this.triggerElement.contains(event.target); + + if (!isPopupMenuExpanded || isClickInsideParentElement) { + return; + } + + this.popupMenuElement.classList.add(CLASS_POPUP_MENU_HIDDEN); + } + + updatePosition() { + const isHidden = this.popupMenuElement.classList.contains(CLASS_POPUP_MENU_HIDDEN); + + if (isHidden) { + return; + } + + this.position(this.popupMenuElement); + } + } + + ibexa.addConfig('core.PopupMenu', PopupMenu); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/slug.value.input.autogenerator.js b/public/bundles/ibexaadminui/js/scripts/core/slug.value.input.autogenerator.js new file mode 100644 index 000000000..6ad399feb --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/slug.value.input.autogenerator.js @@ -0,0 +1,56 @@ +(function (global, ibexa) { + class SlugValueInputAutogenerator { + constructor(config = {}) { + this.sourceInput = config.sourceInput; + this.targetInput = config.targetInput; + this.whitespaceTextReplacer = config.whitespaceTextReplacer || '_'; + this.shouldAutogenerateValue = !this.targetInput.value; + } + + slugify(text) { + const lowercaseText = text.toLowerCase(); + const normalizedText = lowercaseText.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); + // workaround, as polish letter 'ł' doesn't belong to Unicode Block “Combining Diacritical Marks” + const normalizedTextExtraChars = normalizedText.replace('ł', 'l'); + const noWhitespaceText = normalizedTextExtraChars.trim().replace(/ /g, this.whitespaceTextReplacer); + const noSpecialCharsText = noWhitespaceText.replace(/[^a-zA-Z0-9_]/g, ''); + const noMultiHyphenText = noSpecialCharsText.replace(/_+/g, this.whitespaceTextReplacer); + + return noMultiHyphenText; + } + + setTargetValue(value) { + if (!this.shouldAutogenerateValue) { + return; + } + + const slugValue = this.slugify(value); + + this.targetInput.value = slugValue; + this.targetInput.dispatchEvent(new Event('blur')); + } + + attachEventsToTargetInput() { + this.targetInput.addEventListener('keyup', ({ currentTarget }) => { + this.shouldAutogenerateValue = currentTarget.value === ''; + }); + + this.targetInput.addEventListener('input', ({ currentTarget }) => { + this.shouldAutogenerateValue = currentTarget.value === ''; + }); + } + + attachEventsToSourceInput() { + this.sourceInput.addEventListener('keyup', ({ currentTarget }) => { + this.setTargetValue(currentTarget.value); + }); + } + + init() { + this.attachEventsToTargetInput(); + this.attachEventsToSourceInput(); + } + } + + ibexa.addConfig('core.SlugValueInputAutogenerator', SlugValueInputAutogenerator); +})(window, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/tag.view.select.js b/public/bundles/ibexaadminui/js/scripts/core/tag.view.select.js new file mode 100644 index 000000000..75d366f97 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/tag.view.select.js @@ -0,0 +1,142 @@ +(function (global, doc, ibexa) { + class TagViewSelect { + constructor(config) { + this.inputSelector = config.inputSelector || 'input'; + this.container = config.container || config.fieldContainer.querySelector('.ibexa-tag-view-select'); + + if (!this.container) { + throw new Error("Field Container doesn't exist!"); // eslint-disable-line quotes + } + + this.listContainer = this.container.querySelector('.ibexa-tag-view-select__selected-list'); + this.inputField = this.container.querySelector(this.inputSelector); + this.selectBtn = this.container.querySelector('.ibexa-tag-view-select__btn-select-path'); + this.isSingleSelect = this.container.dataset.isSingleSelect === '1'; + this.canBeEmpty = this.container.dataset.canBeEmpty === '1'; + this.inputSeparator = config.seperator || ','; + this.selectedItemTemplate = this.listContainer.dataset.template; + + this.addItems = this.addItems.bind(this); + this.addItem = this.addItem.bind(this); + this.removeItems = this.removeItems.bind(this); + this.removeItem = this.removeItem.bind(this); + this.toggleDeleteButtons = this.toggleDeleteButtons.bind(this); + this.attachDeleteEvents = this.attachDeleteEvents.bind(this); + this.adjustButtonLabel = this.adjustButtonLabel.bind(this); + + ibexa.helpers.ellipsis.middle.parseAll(); + this.attachDeleteEvents(); + + this.disabledObserver = new MutationObserver((mutationsList) => { + const isDisabled = mutationsList[0].target.hasAttribute('disabled'); + + this.toggleDisabledState(isDisabled); + }); + + this.disabledObserver.observe(this.container, { + attributeFilter: ['disabled'], + attributeOldValue: true, + }); + } + + toggleDisabledState(isDisabled) { + const removeBtns = this.listContainer.querySelectorAll('.ibexa-tag-view-select__selected-item-tag-remove-btn'); + + removeBtns.forEach((btn) => btn.toggleAttribute('disabled', isDisabled)); + this.inputField.toggleAttribute('disabled', isDisabled); + this.selectBtn.toggleAttribute('disabled', isDisabled); + } + + addItems(items, forceRecreate) { + if (this.isSingleSelect) { + this.inputField.value = items[0]?.id ?? ''; + this.listContainer.textContent = ''; + } else { + const newItemsIds = items.map((item) => item.id); + + if (this.inputField.value !== '' && !forceRecreate) { + newItemsIds.unshift(this.inputField.value); + } + + this.inputField.value = newItemsIds.join(this.inputSeparator); + } + + if (forceRecreate) { + this.listContainer.textContent = ''; + } + + items.forEach((item) => { + const { id, name } = item; + const itemTemplate = this.selectedItemTemplate.replace('{{ id }}', id).replaceAll('{{ name }}', name); + const range = doc.createRange(); + const itemHtmlWidget = range.createContextualFragment(itemTemplate); + const deleteButton = itemHtmlWidget.querySelector('.ibexa-tag-view-select__selected-item-tag-remove-btn'); + + deleteButton.toggleAttribute('disabled', false); + deleteButton.addEventListener('click', () => this.removeItem(String(id)), false); + this.listContainer.append(itemHtmlWidget); + }); + + this.inputField.dispatchEvent(new Event('change')); + ibexa.helpers.ellipsis.middle.parseAll(); + this.toggleDeleteButtons(); + this.adjustButtonLabel(); + } + + addItem(id, name, forceRecreate) { + this.addItems([{ id, name }], forceRecreate); + } + + removeItems(itemsIds) { + const prevSelectedIds = this.inputField.value.split(this.inputSeparator); + const nextSelectedIds = prevSelectedIds.filter((savedId) => !itemsIds.includes(savedId)); + this.inputField.value = nextSelectedIds.join(this.inputSeparator); + + itemsIds.forEach((itemId) => { + this.listContainer.querySelector(`[data-id="${itemId}"]`).remove(); + }); + + this.inputField.dispatchEvent(new Event('change')); + this.toggleDeleteButtons(); + this.adjustButtonLabel(); + } + + removeItem(id) { + this.removeItems([id]); + } + + toggleDeleteButtons() { + const selectedItems = [...this.listContainer.querySelectorAll('[data-id]')]; + const hideDeleteButtons = !this.canBeEmpty && selectedItems.length === 1; + + selectedItems.forEach((selectedItem) => + selectedItem + .querySelector('.ibexa-tag-view-select__selected-item-tag-remove-btn') + .toggleAttribute('hidden', hideDeleteButtons), + ); + } + + attachDeleteEvents() { + const selectedItems = [...this.listContainer.querySelectorAll('[data-id]')]; + + selectedItems.forEach((selectedItem) => { + const { id } = selectedItem.dataset; + const deleteButton = selectedItem.querySelector('.ibexa-tag-view-select__selected-item-tag-remove-btn'); + + deleteButton.addEventListener('click', () => this.removeItem(String(id)), false); + }); + } + + adjustButtonLabel() { + const selectedItems = [...this.listContainer.querySelectorAll('[data-id]')]; + const buttonLabelSelect = this.container.querySelector('.ibexa-tag-view-select__btn-label--select'); + const buttonLabelChange = this.container.querySelector('.ibexa-tag-view-select__btn-label--change'); + const hasButtonChangeLabel = this.isSingleSelect && selectedItems.length > 0; + + buttonLabelSelect.toggleAttribute('hidden', hasButtonChangeLabel); + buttonLabelChange.toggleAttribute('hidden', !hasButtonChangeLabel); + } + } + + ibexa.addConfig('core.TagViewSelect', TagViewSelect); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/core/toggle.button.js b/public/bundles/ibexaadminui/js/scripts/core/toggle.button.js new file mode 100644 index 000000000..b068e2361 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/core/toggle.button.js @@ -0,0 +1,82 @@ +(function (global, doc, eZ) { + const SPACE_KEY = ' '; + + class ToggleButton { + constructor(config) { + this.toggleNode = config.toggleNode; + this.inputsSelector = config?.inputsSelector || 'input'; + + this.toggleState = this.toggleState.bind(this); + this.addFocus = this.addFocus.bind(this); + this.removeFocus = this.removeFocus.bind(this); + this.toggleStateOnSpacePressed = this.toggleStateOnSpacePressed.bind(this); + this.init = this.init.bind(this); + } + + toggleState(event) { + event.preventDefault(); + + const toggler = event.currentTarget; + + if (toggler.classList.contains('ibexa-toggle--is-disabled')) { + return; + } + + const isChecked = toggler.classList.toggle('ibexa-toggle--is-checked'); + + if (toggler.classList.contains('ibexa-toggle--radio')) { + const valueToSet = isChecked ? 1 : 0; + + toggler.querySelector(`.form-check input[value="${valueToSet}"]`).checked = true; + } else { + const toggleInput = toggler.querySelector('.ibexa-toggle__input'); + + toggleInput.checked = isChecked; + toggleInput.dispatchEvent(new Event('change')); + } + } + + addFocus(event) { + event.preventDefault(); + + const toggler = event.currentTarget.closest('.ibexa-toggle'); + + if (toggler.classList.contains('ibexa-toggle--is-disabled')) { + return; + } + + toggler.classList.add('ibexa-toggle--is-focused'); + } + + removeFocus(event) { + event.preventDefault(); + + const toggler = event.currentTarget.closest('.ibexa-toggle'); + + if (toggler.classList.contains('ibexa-toggle--is-disabled')) { + return; + } + + toggler.classList.remove('ibexa-toggle--is-focused'); + } + + toggleStateOnSpacePressed(event) { + if (event.key === SPACE_KEY) { + event.preventDefault(); + + this.toggleState(event); + } + } + + init() { + const toggleInput = this.toggleNode.querySelector(this.inputsSelector); + + this.toggleNode.addEventListener('click', this.toggleState, false); + this.toggleNode.addEventListener('keyup', this.toggleStateOnSpacePressed, true); + toggleInput.addEventListener('focus', this.addFocus, false); + toggleInput.addEventListener('blur', this.removeFocus, false); + } + } + + eZ.addConfig('core.ToggleButton', ToggleButton); +})(window, window.document, window.eZ); diff --git a/public/bundles/ibexaadminui/js/scripts/cotf/create.js b/public/bundles/ibexaadminui/js/scripts/cotf/create.js new file mode 100644 index 000000000..064576f0a --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/cotf/create.js @@ -0,0 +1,35 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator, Routing) { + const btns = doc.querySelectorAll('.ibexa-btn--cotf-create'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + global.location.href = Routing.generate('ibexa.content.view', { + contentId: items[0].ContentInfo.Content._id, + locationId: items[0].id, + }); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Create content")*/ 'dashboard.create.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + activeTab: 'create', + multiple: false, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/double.click.mark.js b/public/bundles/ibexaadminui/js/scripts/double.click.mark.js new file mode 100644 index 000000000..8498a6d6c --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/double.click.mark.js @@ -0,0 +1,15 @@ +(function (global, doc) { + const dblClickMarkNodes = doc.querySelectorAll('.ibexa-dbl-click-mark'); + const markText = (event) => { + const targetNode = event.currentTarget; + const range = doc.createRange(); + + range.selectNode(targetNode); + global.getSelection().removeAllRanges(); + global.getSelection().addRange(range); + }; + + dblClickMarkNodes.forEach((dblClickMarkNode) => { + dblClickMarkNode.addEventListener('dblclick', markText, false); + }); +})(window, document); diff --git a/public/bundles/ibexaadminui/js/scripts/edit.header.js b/public/bundles/ibexaadminui/js/scripts/edit.header.js new file mode 100644 index 000000000..4d69dc167 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/edit.header.js @@ -0,0 +1,49 @@ +(function (global, doc) { + const SCROLL_POSITION_TO_FIT = 50; + const HEADER_RIGHT_MARGIN = 50; + const MIN_HEIGHT_DIFF_FOR_FITTING_HEADER = 150; + const headerNode = doc.querySelector('.ibexa-edit-header'); + const contentNode = doc.querySelector('.ibexa-edit-content'); + + if (!headerNode || !contentNode) { + return; + } + + const { height: expandedHeaderHeight } = headerNode.getBoundingClientRect(); + const scrolledContent = doc.querySelector('.ibexa-edit-content > :first-child'); + const fitEllipsizedTitle = () => { + const headerBottomRowNode = headerNode.querySelector('.ibexa-edit-header__row--bottom'); + const titleNode = headerBottomRowNode.querySelector('.ibexa-edit-header__name--ellipsized'); + const firstMenuEntryNode = headerNode.querySelector('.ibexa-context-menu .ibexa-context-menu__item'); + const { left: titleNodeLeft, width: titleNodeWidth } = titleNode.getBoundingClientRect(); + const { left: firstMenuEntryNodeLeft } = firstMenuEntryNode.getBoundingClientRect(); + const bottomRowNodeWidthNew = firstMenuEntryNodeLeft - titleNodeLeft; + const titleNodeWidthNew = bottomRowNodeWidthNew - HEADER_RIGHT_MARGIN; + + headerBottomRowNode.style.width = `${bottomRowNodeWidthNew}px`; + + if (titleNodeWidth > titleNodeWidthNew) { + titleNode.style.width = `${titleNodeWidthNew}px`; + } + }; + const fitHeader = (event) => { + const { height: formHeight } = scrolledContent.getBoundingClientRect(); + const contentHeightWithExpandedHeader = formHeight + expandedHeaderHeight; + const heightDiffBetweenWindowAndContent = contentHeightWithExpandedHeader - global.innerHeight; + + if (heightDiffBetweenWindowAndContent < MIN_HEIGHT_DIFF_FOR_FITTING_HEADER) { + return; + } + + const { scrollTop } = event.currentTarget; + const shouldHeaderBeSlim = scrollTop > SCROLL_POSITION_TO_FIT; + + headerNode.classList.toggle('ibexa-edit-header--slim', shouldHeaderBeSlim); + + if (shouldHeaderBeSlim) { + fitEllipsizedTitle(); + } + }; + + contentNode.addEventListener('scroll', fitHeader, false); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-field.js b/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-field.js new file mode 100644 index 000000000..6dc6eb848 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-field.js @@ -0,0 +1,252 @@ +(function (global, doc, ibexa) { + class BaseFieldValidator { + constructor(config) { + this.classInvalid = config.classInvalid; + this.eventsMap = config.eventsMap; + this.fieldSelector = config.fieldSelector; + this.fieldContainer = config.fieldContainer; + this.fieldsToValidate = []; + this.isValid = this.isValid.bind(this); + } + + getFieldTypeContainer(fallback) { + return this.fieldContainer ? this.fieldContainer : fallback; + } + + /** + * Attaches event to elements found with a selector provided by field config + * + * @method attachEvent + * @param {Object} config + * @memberof BaseFieldValidator + */ + attachEvent(config) { + const container = this.getFieldTypeContainer(doc); + const elements = config.elements || container.querySelectorAll(config.selector); + + elements.forEach(this.attachEventToElement.bind(this, config)); + } + + /** + * Attaches event to elements found with a selector provided by field config + * + * @method attachEventToElement + * @param {Object} config + * @param {HTMLElement} item + * @memberof BaseFieldValidator + */ + attachEventToElement(config, item) { + const isValueValidator = typeof config.isValueValidator !== 'undefined' ? config.isValueValidator : true; + + this.fieldsToValidate.push({ item, isValueValidator, callback: config.validateField }); + + item.addEventListener(config.eventName, config.validateField, false); + item.addEventListener('checkIsValid', this.isValid, false); + } + + /** + * Removes event from a node found by a given selector + * + * @method removeEvent + * @param {String} eventName + * @param {String} selector + * @param {Function} callback + * @memberof BaseFieldValidator + */ + removeEvent(eventName, selector, callback) { + this.getFieldTypeContainer(doc) + .querySelectorAll(selector) + .forEach((item) => { + item.removeEventListener('checkIsValid', this.isValid, false); + item.removeEventListener(eventName, callback, false); + }); + } + + /** + * Finds nodes to add validation state + * + * @method findValidationStateNodes + * @param {HTMLElement} fieldNode + * @param {HTMLElement} input + * @param {Array} selectors + * @returns {Array} + * @memberof BaseFieldValidator + */ + findValidationStateNodes(fieldNode, input, selectors = []) { + return selectors.reduce((total, selector) => total.concat([...fieldNode.querySelectorAll(selector)]), []); + } + + /** + * Toggles the invalid state + * + * @method toggleInvalidState + * @param {Boolean} isError + * @param {Object} config + * @param {HTMLElement} input + * @memberof BaseFieldValidator + */ + toggleInvalidState(isError, config, input) { + const container = this.getFieldTypeContainer(input.closest(this.fieldSelector)); + const methodName = isError ? 'add' : 'remove'; + const nodes = this.findValidationStateNodes(container, input, config.invalidStateSelectors); + + container.classList[methodName](this.classInvalid); + input.classList[methodName](this.classInvalid); + + nodes.forEach((el) => el.classList[methodName](this.classInvalid)); + + doc.body.dispatchEvent( + new CustomEvent('ibexa-inputs-validation:change-state', { + detail: { nodes }, + }), + ); + } + + /** + * Creates an error node + * + * @method createErrorNode + * @param {String} message + * @returns {HTMLElement} + * @memberof BaseFieldValidator + */ + createErrorNode(message) { + return ibexa.helpers.formValidation.formatErrorLine(message); + } + + /** + * Finds the error containers + * + * @method findErrorContainers + * @param {HTMLElement} fieldNode + * @param {HTMLElement} input + * @param {Array} selectors + * @returns {Array} + * @memberof BaseFieldValidator + */ + findErrorContainers(fieldNode, input, selectors) { + return selectors.reduce((total, selector) => total.concat([...fieldNode.querySelectorAll(selector)]), []); + } + + /** + * Finds the existing error nodes + * + * @method findExistingErrorNodes + * @param {HTMLElement} fieldNode + * @param {HTMLElement} input + * @param {Array} selectors + * @returns {Array} + * @memberof BaseFieldValidator + */ + findExistingErrorNodes(fieldNode, input, selectors) { + return this.findErrorContainers(fieldNode, input, selectors); + } + + /** + * Toggles the error message + * + * @method toggleErrorMessage + * @param {Object} validationResult + * @param {Object} config + * @param {HTMLElement} input + * @memberof BaseFieldValidator + */ + toggleErrorMessage(validationResult, config, input) { + const container = this.getFieldTypeContainer(input.closest(this.fieldSelector)); + const nodes = this.findErrorContainers(container, input, config.errorNodeSelectors); + const existingErrorSelectors = config.errorNodeSelectors.map((selector) => `${selector} .ibexa-form-error__row`); + const existingErrorNodes = this.findExistingErrorNodes(container, input, existingErrorSelectors); + + existingErrorNodes.forEach((el) => el.remove()); + + if (validationResult.isError) { + nodes.forEach((el) => { + const errorNode = this.createErrorNode(validationResult.errorMessage); + + el.append(errorNode); + }); + } + } + + /** + * Validates the field + * + * @method validateField + * @param {Object} config + * @param {Event} event + * @memberof BaseFieldValidator + */ + validateField(config, event) { + const validationResult = this[config.callback](event); + + if (!validationResult) { + return; + } + + this.toggleInvalidState(validationResult.isError, config, event.target); + this.toggleErrorMessage(validationResult, config, event.target); + + return validationResult; + } + + /** + * Attaches event listeners based on a config. + * + * @method init + * @memberof BaseFieldValidator + */ + init() { + this.fieldsToValidate = []; + this.eventsMap.forEach((eventConfig) => { + eventConfig.validateField = this.validateField.bind(this, eventConfig); + + this.attachEvent(eventConfig); + }); + } + + /** + * Removes event listeners and attaches again. + * + * @method reinit + * @memberof BaseFieldValidator + */ + reinit() { + this.eventsMap.forEach(({ eventName, selector, validateField }) => this.removeEvent(eventName, selector, validateField)); + this.init(); + } + + /** + * Cancels all errors + * + * @method cancelErrors + * @returns {Object} + */ + cancelErrors() { + return { isError: false }; + } + + /** + * Checks whether field values are valid + * + * @method isValid + * @returns {Boolean} + */ + isValid() { + if (!this.fieldsToValidate.length) { + return true; + } + + const results = []; + + this.fieldsToValidate.forEach((field) => { + if (field.isValueValidator) { + results.push(field.callback({ target: field.item, currentTarget: field.item })); + } + }); + + return results.every((result) => result && !result.isError); + } + } + + ibexa.addConfig('BaseFieldValidator', BaseFieldValidator); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-file-field.js b/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-file-field.js new file mode 100644 index 000000000..3e3687be9 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-file-field.js @@ -0,0 +1,58 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD_LABEL = '.ibexa-field-edit__label-wrapper .ibexa-field-edit__label'; + + class BaseFileFieldValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + */ + validateInput(event) { + const input = event.currentTarget; + const dataContainer = this.fieldContainer.querySelector('.ibexa-field-edit__data'); + const label = this.fieldContainer.querySelector(SELECTOR_FIELD_LABEL).innerHTML; + const isRequired = input.required || this.fieldContainer.classList.contains('ibexa-field-edit--required'); + const dataMaxSize = +input.dataset.maxFileSize; + const maxFileSize = parseInt(dataMaxSize, 10); + const isEmpty = input.files && !input.files.length && dataContainer && !dataContainer.hasAttribute('hidden'); + let result = { isError: false }; + + if (isRequired && isEmpty) { + result = { + isError: true, + errorMessage: ibexa.errors.emptyField.replace('{fieldName}', label), + }; + } + + if (!isEmpty && maxFileSize > 0 && input.files[0] && input.files[0].size > maxFileSize) { + result = this.validateFileSize(event); + } + + return result; + } + + validateFileSize() { + return this.showFileSizeError(); + } + + /** + * Displays an error message: file size exceeds maximum value + * + * @method showFileSizeNotice + * @returns {Object} + */ + showFileSizeError() { + const label = this.fieldContainer.querySelector(SELECTOR_FIELD_LABEL).innerHTML; + const result = { + isError: true, + errorMessage: ibexa.errors.invalidFileSize.replace('{fieldName}', label), + }; + + return result; + } + } + + ibexa.addConfig('BaseFileFieldValidator', BaseFileFieldValidator); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-preview-field.js b/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-preview-field.js new file mode 100644 index 000000000..3a30a4369 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/base/base-preview-field.js @@ -0,0 +1,283 @@ +(function (global, doc, ibexa) { + const SELECTOR_DATA = '.ibexa-field-edit__data'; + const SELECTOR_PREVIEW = '.ibexa-field-edit__preview'; + const SELECTOR_BTN_REMOVE = '.ibexa-field-edit-preview__action--remove'; + + class BasePreviewField { + constructor({ fieldContainer, allowedFileTypes, fileTypeAccept, validator }) { + this.fieldContainer = fieldContainer || null; + this.allowedFileTypes = allowedFileTypes || []; + this.fileTypeAccept = fileTypeAccept || ''; + this.validator = validator; + this.inputField = this.findInputField(); + this.clonedInputField = this.inputField.cloneNode(true); + this.openFileSelector = this.openFileSelector.bind(this); + this.showPreview = this.showPreview.bind(this); + this.handleRemoveFile = this.handleRemoveFile.bind(this); + this.handleDropFile = this.handleDropFile.bind(this); + this.handleInputChange = this.handleInputChange.bind(this); + + const dataMaxSize = +this.inputField.dataset.maxFileSize; + + this.maxFileSize = parseInt(dataMaxSize, 10); + this.showPreviewEventName = 'ibexa-base:show-preview'; + } + + /** + * Formats a file size information + * + * @method formatFileSize + * @param {Number} bytes file size in bytes + * @return {String} formatted file size information + */ + formatFileSize(bytes) { + const units = ['B', 'KB', 'MB', 'GB']; + const kilobyte = 1024; + let size = parseInt(bytes, 10) || 0; + let unitIndex = 0; + + while (size >= kilobyte) { + size = size / kilobyte; + unitIndex++; + } + + const decimalUnits = unitIndex < 1 ? 0 : 1; + + const sizeFixed = size.toFixed(size >= 10 || decimalUnits); + const unit = units[unitIndex]; + + return `${sizeFixed} ${unit}`; + } + + /** + * Finds an input element in a field container + * + * @method findInputField + */ + findInputField() { + return this.fieldContainer.querySelector('input[type="file"]'); + } + + /** + * Opens a native file selector + * + * @method openFileSelector + * @param {Event} event + */ + openFileSelector(event) { + event.preventDefault(); + + this.inputField.click(); + } + + /** + * Handles dropping files + * + * @method handleDropFiles + * @param {Event} event + */ + handleDropFile(event) { + const [file] = event.dataTransfer.files; + + if (!this.checkCanDrop(file)) { + return; + } + + if (this.maxFileSize > 0 && file.size > this.maxFileSize) { + return this.showFileSizeError(); + } + + const changeEvent = new Event('change'); + + this.inputField.files = event.dataTransfer.files; + this.inputField.dispatchEvent(changeEvent); + } + + /** + * Displays a file size error + * + * @method showFileSizeError + */ + showFileSizeError() { + this.inputField.dispatchEvent(new CustomEvent('ibexa-invalid-file-size')); + } + + /** + * Checks whether a given file can be dropped onto a field + * + * @method checkCanDrop + * @param {File} file + * @returns {Boolean} + */ + checkCanDrop(file) { + const accept = this.fileTypeAccept; + + if (!this.allowedFileTypes.length && !accept.length) { + return true; + } + + if (accept.length && accept.includes('/*')) { + const pattern = accept.substr(0, accept.indexOf('*')); + + return file.type.includes(pattern); + } + + return this.allowedFileTypes.includes(file.type); + } + + /** + * Checks if file size is an allowed limit + * + * @method handleInputChange + * @param {Event} event + */ + handleInputChange(event) { + if (this.maxFileSize > 0 && event.currentTarget.files[0].size > this.maxFileSize) { + return this.resetInputField(); + } + + this.fieldContainer.querySelector('.ibexa-field-edit__option--remove-media').checked = false; + + this.showPreview(event); + } + + /** + * Displays a file preview + * + * @method showPreview + * @param {Event} [event] + */ + showPreview(event) { + const btnRemove = this.fieldContainer.querySelector(SELECTOR_BTN_REMOVE); + const dropZone = this.fieldContainer.querySelector(SELECTOR_DATA); + + if (event) { + this.loadDroppedFilePreview(event); + } + + this.fieldContainer.querySelector(SELECTOR_PREVIEW).removeAttribute('hidden'); + dropZone.setAttribute('hidden', true); + + btnRemove.addEventListener('click', this.handleRemoveFile, false); + dropZone.removeEventListener('drop', this.handleDropFile); + } + + /** + * Loads dropped file preview. + * It should redefined in each class that extends this one. + * + * @method loadDroppedFilePreview + * @param {Event} event + */ + loadDroppedFilePreview(event) { + console.log('CUSTOMIZE RENDERING DROPPED FILE PREVIEW', event); // eslint-disable-line no-console + } + + /** + * Hides a file preview + * + * @method hidePreview + */ + hidePreview() { + const btnRemove = this.fieldContainer.querySelector(SELECTOR_BTN_REMOVE); + + this.fieldContainer.querySelector(SELECTOR_DATA).removeAttribute('hidden'); + this.fieldContainer.querySelector(SELECTOR_PREVIEW).setAttribute('hidden', true); + this.fieldContainer.classList.remove('is-invalid'); + this.fieldContainer.querySelectorAll('.ibexa-field-edit__error').forEach((element) => element.remove()); + + btnRemove.removeEventListener('click', this.handleRemoveFile); + + this.initializeDropZone(); + } + + /** + * Resets input field state + * + * @method resetInputField + */ + resetInputField() { + const clonedInput = this.clonedInputField.cloneNode(true); + + // required to reset properly the input of file type properly + this.inputField.parentNode.replaceChild(clonedInput, this.inputField); + this.inputField = clonedInput; + this.inputField.addEventListener('change', this.handleInputChange, false); + this.fieldContainer.querySelector('.ibexa-field-edit__option--remove-media').checked = true; + + this.validator.reinit(); + } + + /** + * Removes a file from input and hides a preview afterwards + * + * @method handleRemoveFile + */ + handleRemoveFile(event) { + event.preventDefault(); + + this.resetInputField(); + this.hidePreview(); + } + + /** + * Prevents from executing default actions + * + * @method preventDefaultAction + * @param {Object} event + */ + preventDefaultAction(event) { + event.preventDefault(); + event.stopPropagation(); + } + + /** + * Initializes drop zone event handlers + * + * @method initializeDropZone + */ + initializeDropZone() { + const dropZone = this.fieldContainer.querySelector('.ibexa-field-edit__preview[hidden] + .ibexa-field-edit__data'); + + if (dropZone) { + dropZone.addEventListener('drop', this.handleDropFile, false); + } + } + + /** + * Initializes the preview + * + * @method initializePreview + */ + initializePreview() { + const preview = this.fieldContainer.querySelector('.ibexa-field-edit__preview'); + + if (!preview.hasAttribute('hidden')) { + this.showPreview(); + } + } + + /** + * Initializes the preview + * + * @method init + */ + init() { + this.btnAdd = this.fieldContainer.querySelector('.ibexa-data-source__btn-add'); + + this.btnAdd.addEventListener('click', this.openFileSelector, false); + this.inputField.addEventListener('change', this.handleInputChange, false); + window.addEventListener('drop', this.preventDefaultAction, false); + window.addEventListener('dragover', this.preventDefaultAction, false); + + this.fieldContainer.addEventListener(this.showPreviewEventName, () => this.showPreview()); + + this.initializeDropZone(); + this.initializePreview(); + + this.validator.init(); + } + } + + ibexa.addConfig('BasePreviewField', BasePreviewField); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/base/multi-input-field.js b/public/bundles/ibexaadminui/js/scripts/fieldType/base/multi-input-field.js new file mode 100644 index 000000000..7b0054a74 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/base/multi-input-field.js @@ -0,0 +1,23 @@ +(function (global, doc, ibexa) { + class MultiInputFieldValidator extends ibexa.BaseFieldValidator { + constructor({ containerSelectors, ...restProps }) { + super(restProps); + + this.containerSelectors = containerSelectors; + } + + toggleInvalidState(isError, config, input) { + super.toggleInvalidState(isError, config, input); + + this.containerSelectors.forEach((selector) => { + const invalidSelector = `.${this.classInvalid}`; + const container = input.closest(selector); + const method = !!container.querySelector(invalidSelector) ? 'add' : 'remove'; + + container.classList[method](this.classInvalid); + }); + } + } + + ibexa.addConfig('MultiInputFieldValidator', MultiInputFieldValidator); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezauthor.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezauthor.js new file mode 100644 index 000000000..206d374df --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezauthor.js @@ -0,0 +1,271 @@ +(function (global, doc, ibexa) { + const SELECTOR_REMOVE_AUTHOR = '.ibexa-btn--remove-author'; + const SELECTOR_AUTHOR = '.ibexa-data-source__author'; + const SELECTOR_FIELD = '.ibexa-field-edit--ezauthor'; + const SELECTOR_LABEL = '.ibexa-data-source__label'; + const SELECTOR_FIELD_EMAIL = '.ibexa-data-source__field--email'; + const SELECTOR_FIELD_NAME = '.ibexa-data-source__field--name'; + + class EzAuthorValidator extends ibexa.MultiInputFieldValidator { + /** + * Validates the 'name' input field value + * + * @method validateName + * @param {Event} event + * @returns {Object} + * @memberof EzAuthorValidator + */ + validateName(event) { + const isError = !event.target.value.trim() && event.target.required; + const fieldNode = event.target.closest(SELECTOR_FIELD_NAME); + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', fieldNode.querySelector(SELECTOR_LABEL).innerHTML); + + return { + isError: isError, + errorMessage: errorMessage, + }; + } + + /** + * Validates the 'email' input field value + * + * @method validateEmail + * @param {Event} event + * @returns {Object} + * @memberof EzAuthorValidator + */ + validateEmail(event) { + const input = event.currentTarget; + const isRequired = input.required; + const isEmpty = !input.value.trim(); + const isValid = ibexa.errors.emailRegexp.test(input.value); + const isError = (isRequired && isEmpty) || (!isEmpty && !isValid); + const label = input.closest(SELECTOR_FIELD_EMAIL).querySelector(SELECTOR_LABEL).innerHTML; + const result = { isError }; + + if (isRequired && isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (!isEmpty && !isValid) { + result.errorMessage = ibexa.errors.invalidEmail; + } + + return result; + } + + /** + * Sets an index to template. + * + * @method setIndex + * @param {HTMLElement} parentNode + * @param {String} template + * @returns {String} + * @memberof EzAuthorValidator + */ + setIndex(parentNode, template) { + return template.replace(/__index__/g, parentNode.dataset.nextAuthorId); + } + + /** + * Updates the disable state. + * + * @method updateDisabledState + * @param {HTMLElement} parentNode + * @memberof EzAuthorValidator + */ + updateDisabledState(parentNode) { + const isEnabled = parentNode.querySelectorAll(SELECTOR_AUTHOR).length > 1; + + parentNode.querySelectorAll(SELECTOR_REMOVE_AUTHOR).forEach((btn) => { + const forceDisabled = btn.parentElement.classList.contains('ibexa-data-source__actions--disabled'); + + if (isEnabled && !forceDisabled) { + btn.removeAttribute('disabled'); + } else { + btn.setAttribute('disabled', true); + } + }); + } + + /** + * Removes an item. + * + * @method removeItem + * @param {Event} event + * @memberof EzAuthorValidator + */ + removeItem(event) { + const authorNode = event.target.closest(SELECTOR_FIELD); + + event.target.closest(SELECTOR_AUTHOR).remove(); + + this.updateDisabledState(authorNode); + this.reinit(); + } + + toggleBulkDeleteButtonState(event) { + const container = event.target.closest(SELECTOR_FIELD); + const checkboxes = container.querySelectorAll('.ibexa-input--checkbox'); + const isAnyCheckboxSelected = [...checkboxes].some((checkbox) => checkbox.checked); + const bulkDeleteButton = container.querySelector('.ibexa-btn--bulk-remove-author'); + + bulkDeleteButton.toggleAttribute('disabled', !isAnyCheckboxSelected); + } + + removeSelectedItems(event) { + const container = event.target.closest(SELECTOR_FIELD); + const selectedCheckboxes = container.querySelectorAll('.ibexa-input--checkbox:checked'); + const bulkDeleteButton = container.querySelector('.ibexa-btn--bulk-remove-author'); + + selectedCheckboxes.forEach((checkbox) => checkbox.closest(SELECTOR_AUTHOR).remove()); + + bulkDeleteButton.setAttribute('disabled', 'disabled'); + + const authorsRowsExist = !!container.querySelector(SELECTOR_AUTHOR); + + if (!authorsRowsExist) { + container.querySelector('.ibexa-btn--add-author').click(); + } + + this.updateDisabledState(container); + this.reinit(); + } + + /** + * Adds an item. + * + * @method addItem + * @param {Event} event + * @memberof EzAuthorValidator + */ + addItem(event) { + const authorNode = event.target.closest(SELECTOR_FIELD); + const { template } = authorNode.dataset; + const node = event.target.closest('.ibexa-field-edit__data .ibexa-data-source'); + + node.insertAdjacentHTML('beforeend', this.setIndex(authorNode, template)); + authorNode.dataset.nextAuthorId++; + + this.reinit(); + this.updateDisabledState(authorNode); + ibexa.helpers.tooltips.parse(node); + ibexa.helpers.tooltips.hideAll(); + } + + /** + * Finds the nodes to add validation state + * + * @method findValidationStateNodes + * @param {HTMLElement} fieldNode + * @param {HTMLElement} input + * @param {Array} selectors + * @returns {Array} + * @memberof EzAuthorValidator + */ + findValidationStateNodes(fieldNode, input, selectors) { + const authorRow = input.closest(SELECTOR_AUTHOR); + const nodes = [fieldNode, authorRow]; + + return selectors.reduce((total, selector) => total.concat([...authorRow.querySelectorAll(selector)]), nodes); + } + + /** + * Finds the error containers + * + * @method findErrorContainers + * @param {HTMLElement} fieldNode + * @param {HTMLElement} input + * @param {Array} selectors + * @returns {Array} + * @memberof EzAuthorValidator + */ + findErrorContainers(fieldNode, input, selectors) { + const authorRow = input.closest(SELECTOR_AUTHOR); + + return selectors.reduce((total, selector) => total.concat([...authorRow.querySelectorAll(selector)]), []); + } + + /** + * Finds the existing error nodes + * + * @method findExistingErrorNodes + * @param {HTMLElement} fieldNode + * @param {HTMLElement} input + * @param {Array} selectors + * @returns {Array} + * @memberof EzAuthorValidator + */ + findExistingErrorNodes(fieldNode, input, selectors) { + return selectors.reduce((total, selector) => total.concat([...input.closest(SELECTOR_AUTHOR).querySelectorAll(selector)]), []); + } + + /** + * Attaches event listeners based on a config. + * + * @method init + * @memberof EzAuthorValidator + */ + init() { + super.init(); + + doc.querySelectorAll(this.fieldSelector).forEach((field) => this.updateDisabledState(field)); + } + } + + const validator = new EzAuthorValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + containerSelectors: ['.ibexa-data-source__author', '.ibexa-field-edit--ezauthor'], + eventsMap: [ + { + selector: `.ibexa-data-source__author ${SELECTOR_FIELD_NAME} .ibexa-data-source__input`, + eventName: 'blur', + callback: 'validateName', + invalidStateSelectors: [ + SELECTOR_FIELD_NAME, + `${SELECTOR_FIELD_NAME} .ibexa-data-source__input`, + `${SELECTOR_FIELD_NAME} .ibexa-data-source__label`, + ], + errorNodeSelectors: [`${SELECTOR_FIELD_NAME} .ibexa-form-error`], + }, + { + selector: `.ibexa-data-source__author ${SELECTOR_FIELD_EMAIL} .ibexa-data-source__input`, + eventName: 'blur', + callback: 'validateEmail', + invalidStateSelectors: [ + SELECTOR_FIELD_EMAIL, + `${SELECTOR_FIELD_EMAIL} .ibexa-data-source__input`, + `${SELECTOR_FIELD_EMAIL} .ibexa-data-source__label`, + ], + errorNodeSelectors: [`${SELECTOR_FIELD_EMAIL} .ibexa-form-error`], + }, + { + isValueValidator: false, + selector: SELECTOR_REMOVE_AUTHOR, + eventName: 'click', + callback: 'removeItem', + }, + { + isValueValidator: false, + selector: '.ibexa-data-source__author .ibexa-input--checkbox', + eventName: 'change', + callback: 'toggleBulkDeleteButtonState', + }, + { + isValueValidator: false, + selector: '.ibexa-btn--bulk-remove-author', + eventName: 'click', + callback: 'removeSelectedItems', + }, + { + isValueValidator: false, + selector: '.ibexa-btn--add-author', + eventName: 'click', + callback: 'addItem', + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezbinaryfile.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezbinaryfile.js new file mode 100644 index 000000000..2fea06ca8 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezbinaryfile.js @@ -0,0 +1,55 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezbinaryfile'; + + class EzBinaryFilePreviewField extends ibexa.BasePreviewField { + /** + * Loads dropped file preview + * + * @param {Event} event + */ + loadDroppedFilePreview(event) { + const preview = this.fieldContainer.querySelector('.ibexa-field-edit__preview'); + const nameContainer = preview.querySelector('.ibexa-field-edit-preview__file-name'); + const sizeContainer = preview.querySelector('.ibexa-field-edit-preview__file-size'); + const files = [].slice.call(event.target.files); + const fileSize = this.formatFileSize(files[0].size); + + nameContainer.innerHTML = files[0].name; + nameContainer.title = files[0].name; + sizeContainer.innerHTML = fileSize; + sizeContainer.title = fileSize; + + preview.querySelector('.ibexa-field-edit-preview__action--preview').href = URL.createObjectURL(files[0]); + } + } + + doc.querySelectorAll(SELECTOR_FIELD).forEach((fieldContainer) => { + const validator = new ibexa.BaseFileFieldValidator({ + classInvalid: 'is-invalid', + fieldContainer, + eventsMap: [ + { + selector: `input[type="file"]`, + eventName: 'change', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + }, + { + isValueValidator: false, + selector: `input[type="file"]`, + eventName: 'ibexa-invalid-file-size', + callback: 'showFileSizeError', + errorNodeSelectors: ['.ibexa-form-error'], + }, + ], + }); + const previewField = new EzBinaryFilePreviewField({ + validator, + fieldContainer, + }); + + previewField.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezboolean.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezboolean.js new file mode 100644 index 000000000..cfabda908 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezboolean.js @@ -0,0 +1,42 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezboolean'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + + class EzBooleanValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input field value + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzBooleanValidator + */ + validateInput(event) { + const isError = !event.target.checked && event.target.required; + const label = event.target.closest(SELECTOR_FIELD).querySelector('.ibexa-field-edit__label').innerHTML; + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzBooleanValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-field-edit--ezboolean input', + eventName: 'change', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezcountry.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezcountry.js new file mode 100644 index 000000000..1568149bd --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezcountry.js @@ -0,0 +1,46 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezcountry'; + const SELECTOR_SELECTED = '.ibexa-dropdown__selection-info'; + const EVENT_VALUE_CHANGED = 'change'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + + class EzCountryValidator extends ibexa.BaseFieldValidator { + /** + * Validates the country field value + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzCountryValidator + */ + validateInput(event) { + const fieldContainer = event.currentTarget.closest(SELECTOR_FIELD); + const hasSelectedOptions = !!fieldContainer.querySelector('.ibexa-data-source__input').value; + const isRequired = fieldContainer.classList.contains('ibexa-field-edit--required'); + const isError = isRequired && !hasSelectedOptions; + const label = fieldContainer.querySelector('.ibexa-field-edit__label').innerHTML; + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + + return { + isError, + errorMessage, + }; + } + } + const validator = new EzCountryValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-data-source__input--ezcountry', + eventName: EVENT_VALUE_CHANGED, + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_SELECTED], + }, + ], + }); + + validator.init(); + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezdate.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezdate.js new file mode 100644 index 000000000..aad278e06 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezdate.js @@ -0,0 +1,116 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezdate'; + const SELECTOR_INPUT = '.ibexa-data-source__input:not(.flatpickr-input)'; + const SELECTOR_FLATPICKR_INPUT = '.flatpickr-input'; + const EVENT_VALUE_CHANGED = 'change'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + + class EzDateValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzDateValidator + */ + validateInput(event) { + const target = event.currentTarget; + const isRequired = target.required; + const isEmpty = !target.value.trim().length; + const label = event.target.closest(this.fieldSelector).querySelector('.ibexa-field-edit__label').innerHTML; + let isError = false; + let errorMessage = ''; + + if (isRequired && isEmpty) { + isError = true; + errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzDateValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: `${SELECTOR_FIELD} ${SELECTOR_INPUT}`, + eventName: EVENT_VALUE_CHANGED, + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_FLATPICKR_INPUT], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FLATPICKR_INPUT}`, + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_FLATPICKR_INPUT], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + + const dateFields = doc.querySelectorAll(SELECTOR_FIELD); + const updateInputValue = (sourceInput, timestamps, { dates }) => { + const event = new CustomEvent(EVENT_VALUE_CHANGED); + + if (!dates.length) { + sourceInput.value = ''; + sourceInput.dispatchEvent(event); + + return; + } + + let date = new Date(dates[0]); + + date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); + + sourceInput.value = Math.floor(date.valueOf() / 1000); + sourceInput.dispatchEvent(event); + }; + const initFlatPickr = (field) => { + const sourceInput = field.querySelector(SELECTOR_INPUT); + let defaultDate = null; + + if (sourceInput.value) { + defaultDate = new Date(sourceInput.value * 1000); + + const { actionType } = sourceInput.dataset; + + if (actionType === 'create') { + defaultDate.setTime(new Date().getTime()); + } else if (actionType === 'edit') { + defaultDate = new Date(defaultDate.getUTCFullYear(), defaultDate.getUTCMonth(), defaultDate.getUTCDate(), 0, 0, 0, 0); + } + + updateInputValue(sourceInput, [], { dates: [defaultDate] }); + } + + const dateTimePickerWidget = new ibexa.core.DateTimePicker({ + container: field, + onChange: updateInputValue.bind(null, sourceInput), + flatpickrConfig: { + formatDate: (date) => ibexa.helpers.timezone.formatFullDateTime(date, null, ibexa.adminUiConfig.dateFormat.fullDate), + enableTime: false, + defaultDate: defaultDate, + }, + }); + + dateTimePickerWidget.init(); + + if (sourceInput.hasAttribute('required')) { + dateTimePickerWidget.inputField.setAttribute('required', true); + } + }; + + dateFields.forEach(initFlatPickr); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezdatetime.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezdatetime.js new file mode 100644 index 000000000..0f7d07e6e --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezdatetime.js @@ -0,0 +1,97 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezdatetime'; + const SELECTOR_INPUT = '.ibexa-data-source__input[data-seconds]'; + const SELECTOR_FLATPICKR_INPUT = '.flatpickr-input'; + const EVENT_VALUE_CHANGED = 'change'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + const { convertDateToTimezone } = ibexa.helpers.timezone; + + class EzDateTimeValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzDateTimeValidator + */ + validateInput(event) { + const target = event.currentTarget; + const isRequired = target.required; + const isEmpty = !target.value.trim().length; + const label = event.target.closest(this.fieldSelector).querySelector('.ibexa-field-edit__label').innerHTML; + let isError = false; + let errorMessage = ''; + + if (isRequired && isEmpty) { + isError = true; + errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzDateTimeValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: `${SELECTOR_FIELD} ${SELECTOR_INPUT}`, + eventName: EVENT_VALUE_CHANGED, + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_FLATPICKR_INPUT], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FLATPICKR_INPUT}`, + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_FLATPICKR_INPUT], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + + const datetimeFields = doc.querySelectorAll(SELECTOR_FIELD); + const updateInputValue = (sourceInput, [timestamp]) => { + sourceInput.value = timestamp ?? ''; + sourceInput.dispatchEvent(new CustomEvent(EVENT_VALUE_CHANGED)); + }; + const initFlatPickr = (field) => { + const sourceInput = field.querySelector(SELECTOR_INPUT); + const secondsEnabled = sourceInput.dataset.seconds === '1'; + let defaultDate = null; + + if (sourceInput.value) { + const defaultDateWithUserTimezone = convertDateToTimezone(sourceInput.value * 1000); + const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + + defaultDate = new Date(convertDateToTimezone(defaultDateWithUserTimezone, browserTimezone, true)); + } + + const dateTimePickerWidget = new ibexa.core.DateTimePicker({ + container: field, + onChange: updateInputValue.bind(null, sourceInput), + flatpickrConfig: { + enableSeconds: secondsEnabled, + defaultDate: defaultDate, + }, + }); + + dateTimePickerWidget.init(); + + if (sourceInput.hasAttribute('required')) { + dateTimePickerWidget.inputField.setAttribute('required', true); + } + }; + + datetimeFields.forEach(initFlatPickr); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezemail.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezemail.js new file mode 100644 index 000000000..4d2749842 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezemail.js @@ -0,0 +1,49 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezemail'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + + class EzEmailValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzEmailValidator + */ + validateInput(event) { + const input = event.currentTarget; + const isRequired = input.required; + const isEmpty = !input.value.trim(); + const isValid = ibexa.errors.emailRegexp.test(input.value); + const isError = (isRequired && isEmpty) || (!isEmpty && !isValid); + const label = input.closest(SELECTOR_FIELD).querySelector('.ibexa-field-edit__label').innerHTML; + const result = { isError }; + + if (isRequired && isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (!isEmpty && !isValid) { + result.errorMessage = ibexa.errors.invalidEmail; + } + + return result; + } + } + + const validator = new EzEmailValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-field-edit--ezemail input', + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezfloat.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezfloat.js new file mode 100644 index 000000000..11d66b6b0 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezfloat.js @@ -0,0 +1,59 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezfloat'; + const SELECTOR_ERROR_NODE = `${SELECTOR_FIELD} .ibexa-form-error`; + + class EzFloatValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateFloat + * @param {Event} event + * @returns {Object} + * @memberof EzFloatValidator + */ + validateFloat(event) { + const isRequired = event.target.required; + const value = +event.target.value; + const isEmpty = !event.target.value && event.target.value !== '0'; + const isFloat = Number.isInteger(value) || value % 1 !== 0; + const isLess = value < parseFloat(event.target.getAttribute('min')); + const isGreater = value > parseFloat(event.target.getAttribute('max')); + const isError = (isEmpty && isRequired) || (!isEmpty && (!isFloat || isLess || isGreater)); + const label = event.target.closest(SELECTOR_FIELD).querySelector('.ibexa-field-edit__label').innerHTML; + const result = { isError }; + + if (isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (!isFloat) { + result.errorMessage = ibexa.errors.isNotFloat.replace('{fieldName}', label); + } else if (isLess) { + result.errorMessage = ibexa.errors.isLess + .replace('{fieldName}', label) + .replace('{minValue}', event.target.getAttribute('min')); + } else if (isGreater) { + result.errorMessage = ibexa.errors.isGreater + .replace('{fieldName}', label) + .replace('{maxValue}', event.target.getAttribute('max')); + } + + return result; + } + } + + const validator = new EzFloatValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-field-edit--ezfloat input', + eventName: 'blur', + callback: 'validateFloat', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezgmaplocation.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezgmaplocation.js new file mode 100644 index 000000000..3a6eb8666 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezgmaplocation.js @@ -0,0 +1,648 @@ +(function (global, doc, ibexa, Leaflet, Translator) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezgmaplocation'; + const SELECTOR_ADDRESS_INPUT = '.ibexa-data-source__field--address .ibexa-data-source__input'; + const SELECTOR_LAT_FIELD = '.ibexa-data-source__field--latitude'; + const SELECTOR_LON_FIELD = '.ibexa-data-source__field--longitude'; + const SELECTOR_LAT_INPUT = '.ibexa-data-source__field--latitude .ibexa-data-source__input'; + const SELECTOR_LON_INPUT = '.ibexa-data-source__field--longitude .ibexa-data-source__input'; + const SELECTOR_ADDRESS_ERROR_NODE = '.ibexa-data-source__field--address'; + const SELECTOR_LAT_ERROR_NODE = '.ibexa-data-source__field--latitude'; + const SELECTOR_LON_ERROR_NODE = '.ibexa-data-source__field--longitude'; + const EVENT_BLUR = 'blur'; + const EVENT_KEYUP = 'keyup'; + const EVENT_CANCEL_ERRORS = 'ibexa-cancel-errors'; + const EVENT_ADDRESS_NOT_FOUND = 'ibexa-address-not-found'; + const POSITION_TYPE_LONGITUDE = 'longitude'; + const POSITION_TYPE_LATITUDE = 'latitude'; + const VALIDATE_LONGITUDE = 'validateLongitude'; + const VALIDATE_LATITUDE = 'validateLatitude'; + const VALIDATE_ADDRESS = 'validateAddress'; + const maps = []; + + class EzGMapLocationValidator extends ibexa.BaseFieldValidator { + /** + * Validates latitude/longitude input value + * + * @method validateCoordInput + * @param {HTMLElement} input + * @param {Object} range of coord input + * @returns {Object} + */ + validateCoordInput(input, { min, max }) { + const value = parseFloat(input.value.replace(',', '.')); + const result = { isError: false }; + const label = input.closest('.ibexa-data-source__field').querySelector('.ibexa-data-source__label').innerHTML; + const isNumber = !isNaN(value); + const isInRange = value <= max && value >= min; + + if (!input.required && isNumber && isInRange) { + return result; + } + + if (isNumber && !isInRange) { + result.isError = true; + result.errorMessage = ibexa.errors.outOfRangeValue + .replace('{fieldName}', label) + .replace('{min}', min) + .replace('{max}', max); + + return result; + } + + if (input.required && !isNumber) { + result.isError = true; + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return result; + } + + /** + * Validates longitude input value + * + * @method validateLongitude + * @param {Event} event + * @returns {Object} + */ + validateLongitude(event) { + const lonResult = this.validateCoordInput(event.currentTarget, { min: -180, max: 180 }); + + if (lonResult.isError) { + return lonResult; + } + + const latInput = event.currentTarget.closest(SELECTOR_FIELD).querySelector(SELECTOR_LAT_INPUT); + const latResult = this.validateCoordInput(latInput, { min: -90, max: 90 }); + const isNativeEvent = event.type && (event.type === EVENT_BLUR || event.type === EVENT_KEYUP); + const allEmptyOrFilledResult = this.checkAllFieldsEmptyOrFilled(latInput, event.currentTarget); + const invalidLatitude = allEmptyOrFilledResult.invalidInputType === POSITION_TYPE_LATITUDE; + + if (latResult.isError || (!isNativeEvent && invalidLatitude)) { + return false; + } else if (!isNativeEvent && allEmptyOrFilledResult.invalidInputType === POSITION_TYPE_LONGITUDE) { + lonResult.isError = true; + lonResult.errorMessage = allEmptyOrFilledResult.errorMessage; + + return lonResult; + } + return lonResult; + } + + /** + * Validates latitude input value + * + * @method validateLatitude + * @param {Event} event + * @returns {Object} + */ + validateLatitude(event) { + const latResult = this.validateCoordInput(event.currentTarget, { min: -90, max: 90 }); + + if (latResult.isError) { + return latResult; + } + + const lonInput = event.currentTarget.closest(SELECTOR_FIELD).querySelector(SELECTOR_LON_INPUT); + const lonResult = this.validateCoordInput(lonInput, { min: -180, max: 180 }); + const isNativeEvent = event.type && (event.type === EVENT_BLUR || event.type === EVENT_KEYUP); + const allEmptyOrFilledResult = this.checkAllFieldsEmptyOrFilled(event.currentTarget, lonInput); + const invalidLongitude = allEmptyOrFilledResult.invalidInputType === POSITION_TYPE_LONGITUDE; + + if (lonResult.isError || (!isNativeEvent && invalidLongitude)) { + return false; + } else if (!isNativeEvent && allEmptyOrFilledResult.invalidInputType === POSITION_TYPE_LATITUDE) { + latResult.isError = true; + latResult.errorMessage = allEmptyOrFilledResult.errorMessage; + + return latResult; + } + return latResult; + } + + /** + * Checks whether both longitude input field and latitude input field are filled or empty. + * + * @method checkAllFieldsEmptyOrFilled + * @param {HTMLElement} latInput latitude input DOM node + * @param {HTMLElement} lonInput longitude input DOM node + * @returns {Object} + */ + checkAllFieldsEmptyOrFilled(latInput, lonInput) { + const lonInputFilled = lonInput.value.trim().length; + const latInputFilled = latInput.value.trim().length; + const lonInputFilledlatInputEmpty = lonInputFilled && !latInputFilled; + const latInputFilledlonInputEmpty = !lonInputFilled && latInputFilled; + + let errorMessage = null; + let invalidInputType = null; + + if (lonInputFilledlatInputEmpty) { + errorMessage = ibexa.errors.provideLatitudeValue; + invalidInputType = POSITION_TYPE_LATITUDE; + } else if (latInputFilledlonInputEmpty) { + errorMessage = ibexa.errors.provideLongitudeValue; + invalidInputType = POSITION_TYPE_LONGITUDE; + } + + return { isError: lonInputFilledlatInputEmpty || latInputFilledlonInputEmpty, invalidInputType, errorMessage }; + } + + /** + * Validates longitude input value after clicking "Enter" key + * + * @method validateLongitudeOnEnter + * @param {Event} event + * @returns {Object} + */ + validateLongitudeOnEnter(event) { + event.preventDefault(); + event.stopPropagation(); + + if (event.keyCode === 13) { + return this.validateLongitude(event); + } + + /** + * If is not a Tab or Shift + Tab key set. + * + * When in the longitude field and after pressing the Tab or Shift + Tab key, + * the keyup event fires on a latitude input field instead of a latitude input field. + * It prevents such behaviour. The field will be validated on blur event. + */ + if (event.keyCode !== 9 && event.keyCode !== 16) { + return { isError: false }; + } + } + + /** + * Validates Latitude input value after clicking "Enter" key + * + * @method validateLatitudeOnEnter + * @param {Event} event + * @returns {Object} + */ + validateLatitudeOnEnter(event) { + event.preventDefault(); + event.stopPropagation(); + + if (event.keyCode === 13) { + return this.validateLatitude(event); + } + + /** + * If is not a Tab or Shift + Tab key set. + * + * When in the latitude field and after pressing the Tab or Shift + Tab key, + * the keyup event fires on a longitude input field instead of a latitude input field. + * It prevents such behaviour. The field will be validated on blur event. + */ + if (event.keyCode !== 9 && event.keyCode !== 16) { + return { isError: false }; + } + } + + /** + * Displays address not found error + * + * @method showNotFoundError + * @returns {Object} + */ + showNotFoundError() { + return { isError: true, errorMessage: ibexa.errors.addressNotFound }; + } + + /** + * Validates the address input value. + * + * @method validateAddress + * @param {Event} event + * @returns {Object} + */ + validateAddress(event) { + const field = event.currentTarget.closest(SELECTOR_FIELD); + const latInput = field.querySelector(SELECTOR_LAT_INPUT); + const lonInput = field.querySelector(SELECTOR_LON_INPUT); + + if (!event.currentTarget.value.trim().length) { + return { isError: false }; + } + + if (!latInput.value.trim().length || !lonInput.value.trim().length) { + return { isError: true, errorMessage: ibexa.errors.addressNotFound }; + } + + return { isError: false }; + } + + /** + * Validates the lanitude input field on demand + * + * @method validateLatitudeOnDemand + * @returns {Object} hash with 'result' and 'config' keys + */ + validateLatitudeOnDemand() { + const container = this.getFieldTypeContainer(doc); + const latitudeInputConfig = this.eventsMap.find((eventConfig) => eventConfig.callback === VALIDATE_LATITUDE); + + return { + result: this.validateLatitude({ + currentTarget: container.querySelector(latitudeInputConfig.selector), + }), + config: latitudeInputConfig, + }; + } + + /** + * Validates the longitude input field on demand + * + * @method validateLongitudeOnDemand + * @returns {Object} hash with 'result' and 'config' keys + */ + validateLongitudeOnDemand() { + const container = this.getFieldTypeContainer(doc); + const longitudeInputConfig = this.eventsMap.find((eventConfig) => eventConfig.callback === VALIDATE_LONGITUDE); + + return { + result: this.validateLongitude({ + currentTarget: container.querySelector(longitudeInputConfig.selector), + }), + config: longitudeInputConfig, + }; + } + + /** + * Creates a hash with fields validation results and invalid state selectors + * + * @method buildCoordFieldsValidationHash + * @param {Array} fieldsData + * @returns {Object} + */ + buildCoordFieldsValidationHash(fieldsData) { + return { + validationResults: fieldsData.map((field) => field.result), + invalidStateSelectors: fieldsData.reduce((total, field) => [...total, ...field.config.invalidStateSelectors], []), + }; + } + + /** + * Validates the field + * + * @method validateField + * @param {Object} config + * @param {Event} event + */ + validateField(config, event) { + const validationResult = this[config.callback](event); + + if (!validationResult) { + return; + } + + this.toggleInvalidState(validationResult.isError, config, event.target); + this.toggleErrorMessage(validationResult, config, event.target); + + if (validationResult.isError) { + const errorMessage = Translator.trans( + /* @Desc("Area below needs correction") */ 'ezmaplocation.create.message.error', + {}, + 'fieldtypes_edit', + ); + const allFieldsResult = { isError: true, errorMessage: errorMessage }; + + config.errorNodeSelectors = [`${SELECTOR_FIELD} > .ibexa-form-error`]; + this.toggleInvalidState(true, config, event.target); + this.toggleErrorMessage(allFieldsResult, config, event.target); + } + + return validationResult; + } + } + + const validator = new EzGMapLocationValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} ${SELECTOR_ADDRESS_INPUT}`, + eventName: EVENT_ADDRESS_NOT_FOUND, + callback: 'showNotFoundError', + errorNodeSelectors: [`${SELECTOR_FIELD} > .ibexa-form-error`], + }, + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} ${SELECTOR_ADDRESS_INPUT}`, + eventName: EVENT_CANCEL_ERRORS, + callback: 'cancelErrors', + errorNodeSelectors: [`${SELECTOR_FIELD} > .ibexa-form-error`], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_ADDRESS_INPUT}`, + eventName: 'checkValidity', + callback: VALIDATE_ADDRESS, + errorNodeSelectors: [SELECTOR_ADDRESS_ERROR_NODE], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_LON_INPUT}`, + positionType: POSITION_TYPE_LONGITUDE, + eventName: EVENT_BLUR, + callback: VALIDATE_LONGITUDE, + errorNodeSelectors: [`${SELECTOR_LON_ERROR_NODE} .ibexa-form-error`], + invalidStateSelectors: [SELECTOR_LON_FIELD], + }, + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} ${SELECTOR_LON_INPUT}`, + eventName: EVENT_KEYUP, + callback: 'validateLongitudeOnEnter', + errorNodeSelectors: [`${SELECTOR_LON_ERROR_NODE} .ibexa-form-error`], + invalidStateSelectors: [SELECTOR_LON_FIELD], + }, + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} ${SELECTOR_LON_INPUT}`, + eventName: EVENT_CANCEL_ERRORS, + callback: 'cancelErrors', + errorNodeSelectors: [`${SELECTOR_LON_ERROR_NODE} .ibexa-form-error`], + invalidStateSelectors: [SELECTOR_LON_FIELD], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_LAT_INPUT}`, + positionType: POSITION_TYPE_LATITUDE, + eventName: EVENT_BLUR, + callback: VALIDATE_LATITUDE, + errorNodeSelectors: [`${SELECTOR_LAT_ERROR_NODE} .ibexa-form-error`], + invalidStateSelectors: [SELECTOR_LAT_FIELD], + }, + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} ${SELECTOR_LAT_INPUT}`, + eventName: EVENT_KEYUP, + callback: 'validateLatitudeOnEnter', + errorNodeSelectors: [`${SELECTOR_LAT_ERROR_NODE} .ibexa-form-error`], + invalidStateSelectors: [SELECTOR_LAT_FIELD], + }, + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} ${SELECTOR_LAT_INPUT}`, + eventName: EVENT_CANCEL_ERRORS, + callback: 'cancelErrors', + errorNodeSelectors: [`${SELECTOR_LAT_ERROR_NODE} .ibexa-form-error`], + invalidStateSelectors: [SELECTOR_LAT_FIELD], + }, + ], + }); + + validator.init(); + + /** + * Searches geo coords by a provided address + * + * @function searchByAddress + * @param {String} value + * @param {Function} foundCallback + * @param {Function} notFoundCallback + */ + const searchByAddress = (value, foundCallback, notFoundCallback) => { + fetch(`https://nominatim.openstreetmap.org/search?format=json&q=${global.encodeURI(value)}&zoom=15`) + .then((response) => response.json()) + .then((locations) => { + if (locations.length) { + foundCallback(locations[0].lat, locations[0].lon); + } else { + notFoundCallback(); + } + }) + .catch(ibexa.helpers.notification.showErrorNotification); + }; + + /** + * Disables default action of an event + * + * @function disableDefaultAction + * @param {Event} event + */ + const disableDefaultAction = (event) => event.preventDefault(); + + /** + * Prevents form submission + * + * @function preventFormSubmission + * @param {Event} event + */ + const preventFormSubmission = (event) => event.currentTarget.closest('form').addEventListener('submit', disableDefaultAction, false); + + /** + * Enables form submission + * + * @function enableFormSubmission + * @param {Event} event + */ + const enableFormSubmission = (event) => event.currentTarget.closest('form').removeEventListener('submit', disableDefaultAction); + + /** + * Corrects coord input field notation by replacing "," with "." + * + * @function correctNotation + * @param {Event} event + */ + const correctNotation = (event) => (event.currentTarget.value = event.currentTarget.value.replace(',', '.')); + + doc.querySelectorAll(SELECTOR_FIELD).forEach((field) => { + const addressInput = field.querySelector(SELECTOR_ADDRESS_INPUT); + const longitudeInput = field.querySelector(SELECTOR_LON_INPUT); + const latitudeInput = field.querySelector(SELECTOR_LAT_INPUT); + const areCoordsSet = !!longitudeInput.value.length && !!latitudeInput.value.length; + const locateMeBtn = field.querySelector('.ibexa-data-source__locate-me .btn'); + const searchBtn = field.querySelector('.ibexa-btn--search-by-address'); + const mapContainer = field.querySelector('.ibexa-data-source__map'); + let mapConfig = { + zoom: areCoordsSet ? 15 : 1, + center: areCoordsSet ? [parseFloat(latitudeInput.value), parseFloat(longitudeInput.value)] : [0, 0], + }; + + if (mapContainer.classList.contains('ibexa-data-source__map--disabled')) { + mapConfig = { + ...mapConfig, + zoomControl: false, + scrollWheelZoom: false, + dragging: false, + tap: false, + }; + } + + const map = Leaflet.map(mapContainer, mapConfig); + + maps.push(map); + longitudeInput.value = longitudeInput.dataset.value.replace(',', '.'); + latitudeInput.value = latitudeInput.dataset.value.replace(',', '.'); + + /** + * Updates map state to show location with provided coordinates + * + * @function updateMapState + * @param {Number} lat + * @param {Number} lon + */ + const updateMapState = (lat, lon) => { + map.setView(Leaflet.latLng(lat, lon), 15); + + longitudeInput.value = lon; + latitudeInput.value = lat; + + if (locationMarker) { + map.removeLayer(locationMarker); + } + + locationMarker = Leaflet.marker([lat, lon], { + icon: new Leaflet.Icon.Default({ + imagePath: '/bundles/ibexaadminuiassets/vendors/leaflet/dist/images/', + }), + }).addTo(map); + + addressInput.dispatchEvent(new CustomEvent(EVENT_CANCEL_ERRORS)); + longitudeInput.dispatchEvent(new CustomEvent(EVENT_CANCEL_ERRORS)); + latitudeInput.dispatchEvent(new CustomEvent(EVENT_CANCEL_ERRORS)); + }; + + /** + * Displays address not found error + * + * @function showAddressNotFoundError + */ + const showAddressNotFoundError = () => addressInput.dispatchEvent(new CustomEvent(EVENT_ADDRESS_NOT_FOUND)); + + /** + * Handles address input actions + * + * @function handleAddressInput + * @param {Event} event + */ + const handleAddressInput = (event) => { + event.preventDefault(); + event.stopPropagation(); + + if (event.keyCode === 13 || event.type === 'click') { + searchByAddress(addressInput.value, updateMapState, showAddressNotFoundError); + } + }; + + /** + * Handles latitude input actions + * + * @function handleLatitudeInput + * @param {Event} event + */ + const handleLatitudeInput = (event) => { + event.preventDefault(); + event.stopPropagation(); + + if (event.keyCode !== 13) { + return; + } + + if (!longitudeInput.value.trim().length) { + longitudeInput.dispatchEvent(new Event(EVENT_BLUR)); + + return; + } + + updateMapState(parseFloat(latitudeInput.value), parseFloat(longitudeInput.value)); + }; + + /** + * Handles longitude input actions + * + * @function handleLongitudeInput + * @param {Event} event + */ + const handleLongitudeInput = (event) => { + event.preventDefault(); + event.stopPropagation(); + + if (event.keyCode !== 13) { + return; + } + + if (!latitudeInput.value.trim().length) { + latitudeInput.dispatchEvent(new Event(EVENT_BLUR)); + + return; + } + + updateMapState(parseFloat(latitudeInput.value), parseFloat(longitudeInput.value)); + }; + /** + * Handles clicking on a map + * + * @function handleOnMapClick + * @param {Event} event + */ + const handleOnMapClick = (event) => { + const latlng = event.latlng.wrap(); + + updateMapState(latlng.lat, latlng.lng); + }; + + /** + * IMPORTANT! + * Requires a secure domain (HTTPS) + * + * Sets a current location on a map + * + * @function setCurrentLocation + * @param {Event} event + */ + const setCurrentLocation = (event) => { + event.preventDefault(); + event.stopPropagation(); + + navigator.geolocation.getCurrentPosition( + (position) => updateMapState(position.coords.latitude, position.coords.longitude), + (error) => ibexa.helpers.notification.showErrorNotification(error), + ); + }; + let locationMarker; + + Leaflet.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors', + }).addTo(map); + + if (areCoordsSet) { + updateMapState(mapConfig.center[0], mapConfig.center[1]); + } + + if (mapContainer.classList.contains('ibexa-data-source__map--disabled')) { + return; + } + + addressInput.addEventListener(EVENT_KEYUP, handleAddressInput, false); + addressInput.addEventListener('focus', preventFormSubmission, false); + addressInput.addEventListener(EVENT_BLUR, enableFormSubmission, false); + searchBtn.addEventListener('click', handleAddressInput, false); + longitudeInput.addEventListener(EVENT_KEYUP, handleLongitudeInput, false); + longitudeInput.addEventListener(EVENT_BLUR, correctNotation, false); + latitudeInput.addEventListener(EVENT_KEYUP, handleLatitudeInput, false); + latitudeInput.addEventListener(EVENT_BLUR, correctNotation, false); + map.on('click', handleOnMapClick); + + if (global.location.protocol === 'https:') { + locateMeBtn.addEventListener('click', setCurrentLocation, false); + } else { + locateMeBtn.setAttribute('disabled', 'disabled'); + } + }); + + const invalidateSizeMap = (event) => { + const tabPaneSelector = event.target.getAttribute('href'); + const tabPane = doc.querySelector(tabPaneSelector); + + if (tabPane.querySelectorAll(SELECTOR_FIELD).length > 0) { + maps.forEach((map) => map.invalidateSize(true)); + } + }; + + doc.querySelectorAll('.ibexa-tabs .nav-link').forEach((tab) => tab.addEventListener('shown.bs.tab', invalidateSizeMap)); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa, window.L, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezimage.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezimage.js new file mode 100644 index 000000000..e5d498fe4 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezimage.js @@ -0,0 +1,146 @@ +(function (global, doc, ibexa, Translator) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezimage'; + const SELECTOR_INPUT_FILE = 'input[type="file"]'; + const SELECTOR_ALT_WRAPPER = '.ibexa-field-edit-preview__image-alt'; + const SELECTOR_INPUT_ALT = '.ibexa-field-edit-preview__image-alt .ibexa-data-source__input'; + const EVENT_CANCEL_ERROR = 'ibexa-cancel-errors'; + + class EzImageFilePreviewField extends ibexa.BasePreviewField { + /** + * Gets a temporary image URL + * + * @method getImageUrl + * @param {File} file + * @param {Function} callback the callback returns a retrieved file's temporary URL + */ + getImageUrl(file, callback) { + const reader = new FileReader(); + + reader.onload = (event) => callback(event.target.result); + reader.readAsDataURL(file); + } + + /** + * Loads dropped file preview. + * It should redefined in each class that extends this one. + * + * @method loadDroppedFilePreview + * @param {Event} event + */ + loadDroppedFilePreview(event) { + const preview = this.fieldContainer.querySelector('.ibexa-field-edit__preview'); + const imageNode = preview.querySelector('.ibexa-field-edit-preview__media'); + const nameContainer = preview.querySelector('.ibexa-field-edit-preview__file-name'); + const sizeContainer = preview.querySelector('.ibexa-field-edit-preview__file-size'); + const files = [].slice.call(event.target.files); + const fileSize = this.formatFileSize(files[0].size); + + this.getImageUrl(files[0], (url) => { + const image = new Image(); + + image.onload = function () { + const { width } = image; + const { height } = image; + const widthNode = preview.querySelector('.ibexa-field-edit-preview__dimension--width'); + const heightNode = preview.querySelector('.ibexa-field-edit-preview__dimension--height'); + + widthNode.innerHTML = Translator.trans( + /* @Desc("W:%width% px") */ 'ezimage.dimensions.width', + { width }, + 'fieldtypes_edit', + ); + heightNode.innerHTML = Translator.trans( + /* @Desc("H:%height% px") */ 'ezimage.dimensions.height', + { height }, + 'fieldtypes_edit', + ); + }; + + image.src = url; + imageNode.setAttribute('src', url); + }); + + nameContainer.innerHTML = files[0].name; + nameContainer.title = files[0].name; + sizeContainer.innerHTML = fileSize; + sizeContainer.title = fileSize; + + preview.querySelector('.ibexa-field-edit-preview__action--preview').href = URL.createObjectURL(files[0]); + this.fieldContainer.querySelector(SELECTOR_INPUT_ALT).dispatchEvent(new CustomEvent(EVENT_CANCEL_ERROR)); + } + } + + class EzImageFieldValidator extends ibexa.BaseFileFieldValidator { + /** + * Validates the alternative text input + * + * @method validateAltInput + * @param {Event} event + * @returns {Object} + * @memberof EzStringValidator + */ + validateAltInput(event) { + const fileField = this.fieldContainer.querySelector(SELECTOR_INPUT_FILE); + const dataContainer = this.fieldContainer.querySelector('.ibexa-field-edit__data'); + const isFileFieldEmpty = fileField.files && !fileField.files.length && dataContainer && !dataContainer.hasAttribute('hidden'); + const { isRequired } = event.target.dataset; + const alreadyIsError = this.fieldContainer.classList.contains(this.classInvalid); + const isEmpty = !event.target.value; + const isError = alreadyIsError || (isEmpty && isRequired && !isFileFieldEmpty); + const label = event.target.closest(SELECTOR_ALT_WRAPPER).querySelector('.ibexa-data-source__label').innerHTML; + const result = { isError }; + + if (isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return result; + } + } + + doc.querySelectorAll(SELECTOR_FIELD).forEach((fieldContainer) => { + const validator = new EzImageFieldValidator({ + classInvalid: 'is-invalid', + fieldContainer, + eventsMap: [ + { + selector: `${SELECTOR_INPUT_FILE}`, + eventName: 'change', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + }, + { + selector: SELECTOR_INPUT_ALT, + eventName: 'blur', + callback: 'validateAltInput', + invalidStateSelectors: ['.ibexa-data-source__field--alternativeText'], + errorNodeSelectors: [`${SELECTOR_ALT_WRAPPER} .ibexa-form-error`], + }, + { + isValueValidator: false, + selector: `${SELECTOR_INPUT_FILE}`, + eventName: 'ibexa-invalid-file-size', + callback: 'showFileSizeError', + errorNodeSelectors: ['.ibexa-form-error'], + }, + { + isValueValidator: false, + selector: SELECTOR_INPUT_ALT, + eventName: EVENT_CANCEL_ERROR, + callback: 'cancelErrors', + invalidStateSelectors: ['.ibexa-data-source__field--alternativeText'], + errorNodeSelectors: [`${SELECTOR_ALT_WRAPPER} .ibexa-form-error`], + }, + ], + }); + const previewField = new EzImageFilePreviewField({ + validator, + fieldContainer, + fileTypeAccept: fieldContainer.querySelector(SELECTOR_INPUT_FILE).accept, + }); + + previewField.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezimageasset.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezimageasset.js new file mode 100644 index 000000000..e965faff4 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezimageasset.js @@ -0,0 +1,260 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator, Routing) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezimageasset'; + const SELECTOR_INPUT_FILE = 'input[type="file"]'; + const SELECTOR_INPUT_DESTINATION_CONTENT_ID = '.ibexa-data-source__destination-content-id'; + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const { showErrorNotification } = ibexa.helpers.notification; + const { showSuccessNotification } = ibexa.helpers.notification; + const { getJsonFromResponse } = ibexa.helpers.request; + const { imageAssetMapping } = ibexa.adminUiConfig; + + class EzImageAssetPreviewField extends ibexa.BasePreviewField { + constructor(props) { + super(props); + + this.showPreviewEventName = 'ibexa-image-asset:show-preview'; + } + /** + * Creates a new Image Asset + * + * @method createAsset + * @param {File} file + * @param {String} languageCode + */ + createAsset(file, languageCode) { + const assetCreateUri = Routing.generate('ibexa.asset.upload_image'); + const form = new FormData(); + + form.append('languageCode', languageCode); + form.append('file', file); + + const options = { + method: 'POST', + headers: { + Accept: 'application/json', + 'X-CSRF-Token': token, + }, + body: form, + mode: 'same-origin', + credentials: 'same-origin', + }; + + this.toggleLoading(true); + + fetch(assetCreateUri, options) + .then(getJsonFromResponse) + .then(ibexa.helpers.request.handleRequest) + .then(this.onAssetCreateSuccess.bind(this)) + .catch(this.onAssetCreateFailure.bind(this)); + } + + /** + * Handle a successfully created Image Asset + * + * @method onAssetCreateSuccess + * @param {Object} response + */ + onAssetCreateSuccess(response) { + const { destinationContent } = response; + + this.updateData(destinationContent.id, destinationContent.name, destinationContent.locationId, response.value); + this.toggleLoading(false); + + showSuccessNotification( + Translator.trans( + /* @Desc("The image has been published and can now be reused") */ 'ezimageasset.create.message.success', + {}, + 'fieldtypes_edit', + ), + ); + } + + /** + * Handle a failure while creating Image Asset + * + * @method onAssetCreateFailure + */ + onAssetCreateFailure(error) { + const message = Translator.trans( + /* @Desc("Error while creating Image Asset: %error%") */ 'ezimageasset.create.message.error', + { error: error.message }, + 'fieldtypes_edit', + ); + + this.toggleLoading(false); + showErrorNotification(message); + } + + /** + * Loads selected Image Asset + * + * @method loadAsset + * @param {Object} response + */ + loadAsset(response) { + const imageField = response.ContentInfo.Content.CurrentVersion.Version.Fields.field.find((field) => { + return field.fieldDefinitionIdentifier === imageAssetMapping['contentFieldIdentifier']; + }); + + this.updateData( + response.ContentInfo.Content._id, + response.ContentInfo.Content.TranslatedName, + response.id, + imageField.fieldValue, + ); + } + + /** + * Toggle visibility of the loading spinner + * + * @method toggleLoading + * @param {boolean} show + */ + toggleLoading(show) { + this.fieldContainer.classList.toggle('ibexa-field-edit--is-preview-loading', show); + } + + /** + * Updates Image Asset preview data + * + * @method updateData + * @param {Number} destinationContentId + * @param {String} destinationContentName + * @param {Number} destinationLocationId + * @param {Object} image + */ + updateData(destinationContentId, destinationContentName, destinationLocationId, image) { + const preview = this.fieldContainer.querySelector('.ibexa-field-edit__preview'); + const previewVisual = preview.querySelector('.ibexa-field-edit-preview__visual'); + const previewImg = preview.querySelector('.ibexa-field-edit-preview__media'); + const previewAlt = preview.querySelector('.ibexa-field-edit-preview__image-alt input'); + const previewActionPreview = preview.querySelector('.ibexa-field-edit-preview__action--preview'); + const assetNameContainer = preview.querySelector('.ibexa-field-edit-preview__file-name'); + const destinationLocationUrl = Routing.generate('ibexa.content.view', { + contentId: destinationContentId, + locationId: destinationLocationId, + }); + const additionalData = Array.isArray(image.additionalData) ? '{}' : JSON.stringify(image.additionalData); + + previewVisual.setAttribute('data-additional-data', additionalData); + previewImg.setAttribute('src', image ? image.uri : '//:0'); + previewImg.classList.toggle('d-none', image === null); + previewAlt.value = image.alternativeText; + previewActionPreview.setAttribute('href', destinationLocationUrl); + assetNameContainer.innerHTML = destinationContentName; + assetNameContainer.setAttribute('href', destinationLocationUrl); + + this.inputDestinationContentId.value = destinationContentId; + this.inputField.value = ''; + this.showPreview(); + } + + /** + * Open UDW to select an existing Image Asset + * + * @method openUDW + * @param {Event} event + */ + openUDW(event) { + event.preventDefault(); + + const udwContainer = doc.getElementById('react-udw'); + const udwRoot = ReactDOM.createRoot(udwContainer); + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Select Image Asset")*/ 'ezimageasset.title', {}, 'universal_discovery_widget'); + const closeUDW = () => udwRoot.unmount(); + const onCancel = closeUDW; + const onConfirm = (items) => { + closeUDW(); + this.loadAsset(items[0]); + }; + + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + ...config, + }), + ); + } + + /** + * Checks if file size is an allowed limit + * + * @method handleInputChange + * @param {Event} event + */ + handleInputChange(event) { + const [file] = event.currentTarget.files; + const { languageCode } = event.currentTarget.dataset; + const isFileSizeLimited = this.maxFileSize > 0; + const maxFileSizeExceeded = isFileSizeLimited && file.size > this.maxFileSize; + + if (maxFileSizeExceeded) { + this.resetInputField(); + return; + } + + this.fieldContainer.querySelector('.ibexa-field-edit__option--remove-media').checked = false; + + this.createAsset(file, languageCode); + } + + /** + * Resets input field state + * + * @method resetInputField + */ + resetInputField() { + super.resetInputField(); + + this.inputDestinationContentId.value = ''; + } + + /** + * Initializes the preview + * + * @method init + */ + init() { + super.init(); + + this.btnSelect = this.fieldContainer.querySelector('.ibexa-data-source__btn-select'); + this.btnSelect.addEventListener('click', this.openUDW.bind(this), false); + this.inputDestinationContentId = this.fieldContainer.querySelector(SELECTOR_INPUT_DESTINATION_CONTENT_ID); + } + } + + doc.querySelectorAll(SELECTOR_FIELD).forEach((fieldContainer) => { + const validator = new ibexa.BaseFileFieldValidator({ + classInvalid: 'is-invalid', + fieldContainer, + eventsMap: [ + { + selector: `${SELECTOR_INPUT_FILE}`, + eventName: 'change', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + }, + { + isValueValidator: false, + selector: `${SELECTOR_INPUT_FILE}`, + eventName: 'ibexa-invalid-file-size', + callback: 'showFileSizeError', + errorNodeSelectors: ['.ibexa-form-error'], + }, + ], + }); + + const previewField = new EzImageAssetPreviewField({ + validator, + fieldContainer, + fileTypeAccept: fieldContainer.querySelector(SELECTOR_INPUT_FILE).accept, + }); + + previewField.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezinteger.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezinteger.js new file mode 100644 index 000000000..9971c38cf --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezinteger.js @@ -0,0 +1,59 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezinteger'; + const SELECTOR_ERROR_NODE = `${SELECTOR_FIELD} .ibexa-form-error`; + + class EzIntegerValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInteger + * @param {Event} event + * @returns {Object} + * @memberof EzIntegerValidator + */ + validateInteger(event) { + const isRequired = event.target.required; + const value = +event.target.value; + const isEmpty = !event.target.value && event.target.value !== '0'; + const isInteger = Number.isInteger(value); + const isLess = value < parseInt(event.target.getAttribute('min'), 10); + const isGreater = value > parseInt(event.target.getAttribute('max'), 10); + const isError = (isEmpty && isRequired) || (!isEmpty && (!isInteger || isLess || isGreater)); + const label = event.target.closest(SELECTOR_FIELD).querySelector('.ibexa-field-edit__label').innerHTML; + const result = { isError }; + + if (isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (!isInteger) { + result.errorMessage = ibexa.errors.isNotInteger.replace('{fieldName}', label); + } else if (isLess) { + result.errorMessage = ibexa.errors.isLess + .replace('{fieldName}', label) + .replace('{minValue}', event.target.getAttribute('min')); + } else if (isGreater) { + result.errorMessage = ibexa.errors.isGreater + .replace('{fieldName}', label) + .replace('{maxValue}', event.target.getAttribute('max')); + } + + return result; + } + } + + const validator = new EzIntegerValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-field-edit--ezinteger input', + eventName: 'blur', + callback: 'validateInteger', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezkeyword.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezkeyword.js new file mode 100644 index 000000000..b88906eff --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezkeyword.js @@ -0,0 +1,105 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezkeyword'; + const SELECTOR_TAGGIFY = '.ibexa-data-source__taggify'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + const CLASS_TAGGIFY_FOCUS = 'ibexa-data-source__taggify--focused'; + const ENTER_KEY_CODE = 13; + const COMMA_KEY_CODE = 188; + + class EzKeywordValidator extends ibexa.BaseFieldValidator { + /** + * Validates the keywords input + * + * @method validateKeywords + * @param {Event} event + * @returns {Object} + * @memberof EzKeywordValidator + */ + validateKeywords(event) { + const fieldContainer = event.currentTarget.closest(SELECTOR_FIELD); + const input = fieldContainer.querySelector('.ibexa-data-source__input-wrapper .ibexa-data-source__input'); + const label = fieldContainer.querySelector('.ibexa-field-edit__label').innerHTML; + const isRequired = input.required; + const isEmpty = !input.value.trim().length; + const isError = isEmpty && isRequired; + const result = { isError }; + + if (isError) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return result; + } + } + + /** + * Updates input value with provided value + * + * @function updateValue + * @param {HTMLElement} input + * @param {Event} event + */ + const updateValue = (input, event) => { + input.value = event.detail.tags.map((tag) => tag.label).join(); + + input.dispatchEvent(new Event('change')); + }; + + doc.querySelectorAll(SELECTOR_FIELD).forEach((field) => { + const taggifyContainer = field.querySelector(SELECTOR_TAGGIFY); + const validator = new EzKeywordValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + isValueValidator: false, + selector: `${SELECTOR_FIELD} .taggify__input`, + eventName: 'blur', + callback: 'validateKeywords', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_TAGGIFY], + }, + { + selector: `${SELECTOR_FIELD} .ibexa-data-source__input.form-control`, + eventName: 'change', + callback: 'validateKeywords', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_TAGGIFY], + }, + ], + }); + const taggify = new global.Taggify({ + containerNode: taggifyContainer, + displayLabel: false, + displayInputValues: false, + hotKeys: [ENTER_KEY_CODE, COMMA_KEY_CODE], + }); + const keywordInput = field.querySelector('.ibexa-data-source__input-wrapper .ibexa-data-source__input.form-control'); + const updateKeywords = updateValue.bind(this, keywordInput); + const addFocusState = () => taggifyContainer.classList.add(CLASS_TAGGIFY_FOCUS); + const removeFocusState = () => taggifyContainer.classList.remove(CLASS_TAGGIFY_FOCUS); + const taggifyInput = taggifyContainer.querySelector('.taggify__input'); + + if (keywordInput.required) { + taggifyInput.setAttribute('required', true); + } + + validator.init(); + + if (keywordInput.value.length) { + taggify.updateTags( + keywordInput.value.split(',').map((item) => ({ + id: Math.floor((1 + Math.random()) * 0x10000).toString(16), + label: item, + })), + ); + } + + taggifyContainer.addEventListener('tagsCreated', updateKeywords, false); + taggifyContainer.addEventListener('tagRemoved', updateKeywords, false); + taggifyInput.addEventListener('focus', addFocusState, false); + taggifyInput.addEventListener('blur', removeFocusState, false); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezmedia.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezmedia.js new file mode 100644 index 000000000..4f63d0d9d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezmedia.js @@ -0,0 +1,166 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezmedia'; + const SELECTOR_PREVIEW = '.ibexa-field-edit__preview'; + const SELECTOR_MEDIA = '.ibexa-field-edit-preview__media'; + const SELECTOR_INFO_WRAPPER = '.ibexa-field-edit-preview__info'; + const SELECTOR_MEDIA_WRAPPER = '.ibexa-field-edit-preview__media-wrapper'; + const SELECTOR_INPUT_FILE = 'input[type="file"]'; + const CLASS_MEDIA_WRAPPER_LOADING = 'ibexa-field-edit-preview__media-wrapper--loading'; + + class EzMediaValidator extends ibexa.BaseFileFieldValidator { + /** + * Validates the dimensions inputs + * + * @method validateDimensions + * @param {Event} event + * @returns {Object} + * @memberof EzMediaValidator + */ + validateDimensions(event) { + const input = event.currentTarget; + const isRequired = input.required; + const value = parseInt(input.value, 10); + const isEmpty = isNaN(value); + const isInteger = Number.isInteger(value); + const isError = (isEmpty && isRequired) || (!isEmpty && !isInteger); + const label = input.closest(SELECTOR_INFO_WRAPPER).querySelector('.ibexa-field-edit-preview__label').innerHTML; + const result = { isError }; + + if (isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (!isInteger) { + result.errorMessage = ibexa.errors.isNotInteger.replace('{fieldName}', label); + } + + if (!input.closest('.ibexa-field-edit__preview').hasAttribute('hidden')) { + return result; + } + + return { isError: false }; + } + } + + class EzMediaPreviewField extends ibexa.BasePreviewField { + /** + * Loads dropped file preview + * + * @param {Event} event + */ + loadDroppedFilePreview(event) { + const preview = this.fieldContainer.querySelector('.ibexa-field-edit__preview'); + const nameContainer = preview.querySelector('.ibexa-field-edit-preview__file-name'); + const sizeContainer = preview.querySelector('.ibexa-field-edit-preview__file-size'); + const files = [].slice.call(event.target.files); + const fileSize = this.formatFileSize(files[0].size); + + nameContainer.innerHTML = files[0].name; + nameContainer.title = files[0].name; + sizeContainer.innerHTML = fileSize; + sizeContainer.title = fileSize; + + // it breaks the rendering flow and prevents from blocking + // rendering a whole fieldtype container + // while loading video source + window.setTimeout(this.updateMediaSource.bind(this, files[0]), 100); + } + + /** + * Updates a value of media source (the video tag - src attribute) + * + * @method updateMediaSource + * @param {File} file + */ + updateMediaSource(file) { + const preview = this.fieldContainer.querySelector(SELECTOR_PREVIEW); + const videoUrl = URL.createObjectURL(file); + + preview.querySelector('.ibexa-field-edit-preview__action--preview').href = videoUrl; + preview.querySelector(SELECTOR_MEDIA).setAttribute('src', videoUrl); + } + + /** + * Displays a media preview container + * + * @method showMediaPreview + */ + showMediaPreview() { + const mediaWrapper = this.fieldContainer.querySelector(SELECTOR_MEDIA_WRAPPER); + + mediaWrapper.classList.remove(CLASS_MEDIA_WRAPPER_LOADING); + } + + /** + * Displays a media loading container + * + * @method showMediaLoadingScreen + */ + showMediaLoadingScreen() { + const mediaWrapper = this.fieldContainer.querySelector(SELECTOR_MEDIA_WRAPPER); + + mediaWrapper.classList.add(CLASS_MEDIA_WRAPPER_LOADING); + } + + /** + * Handles file removing + * + * @method handleRemoveFile + * @param {Event} event + */ + handleRemoveFile(event) { + super.handleRemoveFile(event); + + this.showMediaLoadingScreen(); + } + + /** + * Initializes the preview + * + * @method init + */ + init() { + super.init(); + + const preview = this.fieldContainer.querySelector(SELECTOR_PREVIEW); + const video = preview.querySelector(SELECTOR_MEDIA); + + video.addEventListener('canplay', this.showMediaPreview.bind(this), false); + } + } + + doc.querySelectorAll(SELECTOR_FIELD).forEach((fieldContainer) => { + const validator = new EzMediaValidator({ + classInvalid: 'is-invalid', + fieldContainer, + eventsMap: [ + { + isValueValidator: false, + selector: SELECTOR_INPUT_FILE, + eventName: 'ibexa-invalid-file-size', + callback: 'showFileSizeError', + errorNodeSelectors: ['.ibexa-field-edit--ezmedia .ibexa-form-error'], + }, + { + selector: '.ibexa-field-edit-preview__dimensions .form-control', + eventName: 'blur', + callback: 'validateDimensions', + errorNodeSelectors: [`${SELECTOR_INFO_WRAPPER} .ibexa-form-error`], + }, + { + selector: SELECTOR_INPUT_FILE, + eventName: 'change', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-field-edit--ezmedia .ibexa-form-error'], + }, + ], + }); + const previewField = new EzMediaPreviewField({ + validator, + fieldContainer, + fileTypeAccept: fieldContainer.querySelector(SELECTOR_INPUT_FILE).accept, + }); + + previewField.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezobjectrelationlist.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezobjectrelationlist.js new file mode 100644 index 000000000..3b51b6ce1 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezobjectrelationlist.js @@ -0,0 +1,307 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const CLASS_FIELD_SINGLE = 'ibexa-field-edit--ezobjectrelation'; + const SELECTOR_FIELD_MULTIPLE = '.ibexa-field-edit--ezobjectrelationlist'; + const SELECTOR_FIELD_SINGLE = '.ibexa-field-edit--ezobjectrelation'; + const SELECTOR_INPUT = '.ibexa-data-source__input'; + const SELECTOR_BTN_ADD = '.ibexa-relations__table-action--create'; + const SELECTOR_ROW = '.ibexa-relations__item'; + const EVENT_CUSTOM = 'validateInput'; + + class EzObjectRelationListValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzObjectRelationListValidator + */ + validateInput({ currentTarget }) { + const isRequired = currentTarget.required; + const isEmpty = !currentTarget.value.length; + const hasCorrectValues = currentTarget.value.split(',').every((id) => !isNaN(parseInt(id, 10))); + const fieldContainer = currentTarget.closest(SELECTOR_FIELD_MULTIPLE) || currentTarget.closest(SELECTOR_FIELD_SINGLE); + const label = fieldContainer.querySelector('.ibexa-field-edit__label').innerHTML; + const result = { isError: false }; + + if (isRequired && isEmpty) { + result.isError = true; + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (!isEmpty && !hasCorrectValues) { + result.isError = true; + result.errorMessage = ibexa.errors.invalidValue.replace('{fieldName}', label); + } + + return result; + } + } + + [...doc.querySelectorAll(SELECTOR_FIELD_MULTIPLE), ...doc.querySelectorAll(SELECTOR_FIELD_SINGLE)].forEach((fieldContainer) => { + const validator = new EzObjectRelationListValidator({ + classInvalid: 'is-invalid', + fieldContainer, + eventsMap: [ + { + selector: SELECTOR_INPUT, + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + }, + { + isValueValidator: false, + selector: SELECTOR_INPUT, + eventName: EVENT_CUSTOM, + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + }, + ], + }); + const udwContainer = doc.getElementById('react-udw'); + const sourceInput = fieldContainer.querySelector(SELECTOR_INPUT); + const relationsContainer = fieldContainer.querySelector('.ibexa-relations__list'); + const relationsWrapper = fieldContainer.querySelector('.ibexa-relations__wrapper'); + const relationsCTA = fieldContainer.querySelector('.ibexa-relations__cta'); + const addBtn = fieldContainer.querySelector(SELECTOR_BTN_ADD); + const trashBtn = fieldContainer.querySelector('.ibexa-relations__table-action--remove'); + const isSingle = fieldContainer.classList.contains(CLASS_FIELD_SINGLE); + const selectedItemsLimit = isSingle ? 1 : parseInt(relationsContainer.dataset.limit, 10); + const relationsTable = relationsWrapper.querySelector('.ibexa-table'); + const startingLocationId = + relationsContainer.dataset.defaultLocation !== '0' ? parseInt(relationsContainer.dataset.defaultLocation, 10) : null; + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const renderRows = (items) => { + items.forEach((item, index) => { + relationsContainer.insertAdjacentHTML('beforeend', renderRow(item, index)); + + const { escapeHTML } = ibexa.helpers.text; + const itemNodes = relationsContainer.querySelectorAll('.ibexa-relations__item'); + const itemNode = itemNodes[itemNodes.length - 1]; + + itemNode.setAttribute('data-content-id', escapeHTML(item.ContentInfo.Content._id)); + itemNode.querySelector('.ibexa-relations__table-action--remove-item').addEventListener('click', removeItem, false); + }); + + ibexa.helpers.tooltips.parse(); + }; + const updateInputValue = (items) => { + sourceInput.value = items.join(); + sourceInput.dispatchEvent(new CustomEvent(EVENT_CUSTOM)); + }; + const onConfirm = (items) => { + items = excludeDuplicatedItems(items); + + renderRows(items); + attachRowsEventHandlers(); + + selectedItems = [...selectedItems, ...items.map((item) => item.ContentInfo.Content._id)]; + + updateInputValue(selectedItems); + closeUDW(); + updateFieldState(); + updateAddBtnState(); + relationsTable.dispatchEvent(new CustomEvent('ibexa-refresh-main-table-checkbox')); + }; + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const limit = parseInt(event.currentTarget.dataset.limit, 10); + const title = + limit === 1 + ? Translator.trans( + /*@Desc("Select a Content item")*/ 'ezobjectrelationlist.title.single', + {}, + 'universal_discovery_widget', + ) + : Translator.trans( + /*@Desc("Select Content item(s)")*/ 'ezobjectrelationlist.title.multi', + {}, + 'universal_discovery_widget', + ); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel: closeUDW, + title, + startingLocationId, + ...config, + multiple: isSingle ? false : selectedItemsLimit !== 1, + multipleItemsLimit: selectedItemsLimit > 1 ? selectedItemsLimit - selectedItems.length : selectedItemsLimit, + }), + ); + }; + const excludeDuplicatedItems = (items) => { + selectedItemsMap = items.reduce((total, item) => ({ ...total, [item.ContentInfo.Content._id]: item }), selectedItemsMap); + + return items.filter((item) => selectedItemsMap[item.ContentInfo.Content._id]); + }; + const renderRow = (item, index) => { + const { escapeHTML } = ibexa.helpers.text; + const { formatShortDateTime } = ibexa.helpers.timezone; + const contentTypeName = ibexa.helpers.contentType.getContentTypeName(item.ContentInfo.Content.ContentTypeInfo.identifier); + const contentName = escapeHTML(item.ContentInfo.Content.TranslatedName); + const contentId = item.ContentInfo.Content._id; + const { rowTemplate } = relationsWrapper.dataset; + + return rowTemplate + .replace('{{ content_id }}', contentId) + .replace('{{ content_name }}', contentName) + .replace('{{ content_type_name }}', contentTypeName) + .replace('{{ published_date }}', formatShortDateTime(item.ContentInfo.Content.publishedDate)) + .replace('{{ order }}', selectedItems.length + index + 1); + }; + const updateFieldState = () => { + const tableHideMethod = selectedItems.length ? 'removeAttribute' : 'setAttribute'; + const ctaHideMethod = selectedItems.length ? 'setAttribute' : 'removeAttribute'; + + relationsTable[tableHideMethod]('hidden', true); + + if (trashBtn) { + trashBtn[tableHideMethod]('hidden', true); + } + + if (addBtn) { + addBtn[tableHideMethod]('hidden', true); + } + + relationsCTA[ctaHideMethod]('hidden', true); + }; + const updateAddBtnState = () => { + if (!addBtn) { + return; + } + + const forceDisabled = addBtn.classList.contains('ibexa-relations__table-action--disabled'); + const methodName = + !forceDisabled && (!selectedItemsLimit || selectedItems.length < selectedItemsLimit) ? 'removeAttribute' : 'setAttribute'; + + addBtn[methodName]('disabled', true); + }; + const updateTrashBtnState = (event) => { + if ( + !trashBtn || + ((!event.target.hasAttribute('type') || event.target.type !== 'checkbox') && event.currentTarget !== trashBtn) + ) { + return; + } + + const anySelected = findCheckboxes().some((item) => item.checked === true); + const methodName = anySelected ? 'removeAttribute' : 'setAttribute'; + + trashBtn[methodName]('disabled', true); + }; + const removeItems = (event) => { + event.preventDefault(); + + const removedItems = []; + + relationsContainer.querySelectorAll('input:checked').forEach((input) => { + removedItems.push(parseInt(input.value, 10)); + + input.closest('tr').remove(); + }); + + selectedItems = selectedItems.filter((item) => !removedItems.includes(item)); + + updateInputValue(selectedItems); + updateFieldState(); + updateAddBtnState(); + relationsTable.dispatchEvent(new CustomEvent('ibexa-refresh-main-table-checkbox')); + }; + const removeItem = (event) => { + const row = event.target.closest('.ibexa-relations__item'); + const contentId = parseInt(row.dataset.contentId, 10); + + row.remove(); + + selectedItems = selectedItems.filter((item) => contentId !== item); + + updateInputValue(selectedItems); + updateFieldState(); + updateAddBtnState(); + relationsTable.dispatchEvent(new CustomEvent('ibexa-refresh-main-table-checkbox')); + }; + const findOrderInputs = () => { + return [...relationsContainer.querySelectorAll('.ibexa-relations__order-input')]; + }; + const findCheckboxes = () => { + return [...relationsContainer.querySelectorAll('[type="checkbox"]')]; + }; + const attachRowsEventHandlers = () => { + const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; + + findOrderInputs().forEach((item) => { + item.addEventListener('blur', updateSelectedItemsOrder, false); + + if (isFirefox) { + item.addEventListener('change', focusOnElement, false); + } + }); + }; + const focusOnElement = (event) => { + if (doc.activeElement !== event.target) { + event.target.focus(); + } + }; + const emptyRelationsContainer = () => { + while (relationsContainer.lastChild) { + relationsContainer.removeChild(relationsContainer.lastChild); + } + }; + const updateSelectedItemsOrder = (event) => { + event.preventDefault(); + + const inputs = findOrderInputs().reduce((total, input) => { + return [ + ...total, + { + order: parseInt(input.value, 10), + row: input.closest(SELECTOR_ROW), + }, + ]; + }, []); + + inputs.sort((a, b) => a.order - b.order); + + const fragment = inputs.reduce((frag, item) => { + frag.appendChild(item.row); + + return frag; + }, doc.createDocumentFragment()); + + emptyRelationsContainer(); + relationsContainer.appendChild(fragment); + attachRowsEventHandlers(); + + selectedItems = inputs.map((item) => parseInt(item.row.dataset.contentId, 10)); + updateInputValue(selectedItems); + }; + let selectedItems = [...fieldContainer.querySelectorAll(SELECTOR_ROW)].map((row) => parseInt(row.dataset.contentId, 10)); + let selectedItemsMap = selectedItems.reduce((total, item) => ({ ...total, [item]: item }), {}); + + updateAddBtnState(); + attachRowsEventHandlers(); + + [...fieldContainer.querySelectorAll(SELECTOR_BTN_ADD), ...fieldContainer.querySelectorAll('.ibexa-relations__cta-btn')].forEach( + (btn) => btn.addEventListener('click', openUDW, false), + ); + + [...fieldContainer.querySelectorAll('.ibexa-relations__table-action--remove-item')].forEach((btn) => + btn.addEventListener('click', removeItem, false), + ); + + if (trashBtn) { + trashBtn.addEventListener('click', removeItems, false); + trashBtn.addEventListener('click', updateTrashBtnState, false); + } + + relationsContainer.addEventListener('change', updateTrashBtnState, false); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezrichtext.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezrichtext.js new file mode 100644 index 000000000..4cf432e1f --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezrichtext.js @@ -0,0 +1,88 @@ +(function (global, doc, ibexa, React, ReactDOM) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezrichtext'; + const SELECTOR_INPUT = '.ibexa-data-source__richtext'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + const selectContent = (config) => { + const udwContainer = document.querySelector('#react-udw'); + const udwRoot = ReactDOM.createRoot(udwContainer); + const confirmHandler = (items) => { + if (typeof config.onConfirm === 'function') { + config.onConfirm(items); + } + + udwRoot.unmount(); + }; + const cancelHandler = () => { + if (typeof config.onCancel === 'function') { + config.onCancel(); + } + + udwRoot.unmount(); + }; + const mergedConfig = { ...config, onConfirm: confirmHandler, onCancel: cancelHandler }; + + udwRoot.render(React.createElement(ibexa.modules.UniversalDiscovery, mergedConfig)); + }; + + ibexa.addConfig('richText.alloyEditor.callbacks.selectContent', selectContent); + + class EzRichTextValidator extends ibexa.BaseFieldValidator { + constructor(config) { + super(config); + + this.richtextEditor = config.richtextEditor; + } + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzRichTextValidator + */ + validateInput(event) { + const fieldContainer = event.currentTarget.closest(SELECTOR_FIELD); + const isRequired = fieldContainer.classList.contains('ibexa-field-edit--required'); + const label = fieldContainer.querySelector('.ibexa-field-edit__label').innerHTML; + const isEmpty = !this.richtextEditor.getData().length; + const isError = isRequired && isEmpty; + const result = { isError }; + + if (isError) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return result; + } + } + + doc.querySelectorAll(`${SELECTOR_FIELD} ${SELECTOR_INPUT}`).forEach((container) => { + const richtextEditor = new ibexa.BaseRichText(); + + richtextEditor.init(container); + + const validator = new EzRichTextValidator({ + classInvalid: 'is-invalid', + fieldContainer: container.closest(SELECTOR_FIELD), + richtextEditor, + eventsMap: [ + { + selector: '.ibexa-data-source__input.ibexa-input--textarea', + eventName: 'input', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + { + selector: SELECTOR_INPUT, + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + }); +})(window, window.document, window.ibexa, window.React, window.ReactDOM); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezselection.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezselection.js new file mode 100644 index 000000000..2caf3571c --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezselection.js @@ -0,0 +1,48 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezselection'; + const SELECTOR_SELECTED = '.ibexa-dropdown__selection-info'; + const SELECTOR_ERROR_NODE = '.ibexa-form-error'; + const EVENT_VALUE_CHANGED = 'change'; + + class EzSelectionValidator extends ibexa.BaseFieldValidator { + /** + * Validates the textarea field value + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzSelectionValidator + */ + validateInput(event) { + const fieldContainer = event.currentTarget.closest(SELECTOR_FIELD); + const hasSelectedOptions = !!fieldContainer.querySelector('.ibexa-data-source__input').value; + const isRequired = fieldContainer.classList.contains('ibexa-field-edit--required'); + const isError = isRequired && !hasSelectedOptions; + const label = fieldContainer.querySelector('.ibexa-field-edit__label').innerHTML; + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzSelectionValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: `${SELECTOR_FIELD} .ibexa-data-source__input--selection`, + eventName: EVENT_VALUE_CHANGED, + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_SELECTED], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezstring.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezstring.js new file mode 100644 index 000000000..e0062502d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezstring.js @@ -0,0 +1,52 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezstring'; + const SELECTOR_SOURCE_INPUT = '.ibexa-data-source__input'; + + class EzStringValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzStringValidator + */ + validateInput(event) { + const isRequired = event.target.required; + const isEmpty = !event.target.value; + const isTooShort = event.target.value.length < parseInt(event.target.dataset.min, 10); + const isTooLong = event.target.value.length > parseInt(event.target.dataset.max, 10); + const isError = (isEmpty && isRequired) || isTooShort || isTooLong; + const label = event.target.closest(SELECTOR_FIELD).querySelector('.ibexa-field-edit__label').innerHTML; + const result = { isError }; + + if (isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } else if (isTooShort) { + result.errorMessage = ibexa.errors.tooShort.replace('{fieldName}', label).replace('{minLength}', event.target.dataset.min); + } else if (isTooLong) { + result.errorMessage = ibexa.errors.tooLong.replace('{fieldName}', label).replace('{maxLength}', event.target.dataset.max); + } + + return result; + } + } + + const validator = new EzStringValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-field-edit--ezstring input', + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + invalidStateSelectors: [SELECTOR_SOURCE_INPUT], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/eztext.js b/public/bundles/ibexaadminui/js/scripts/fieldType/eztext.js new file mode 100644 index 000000000..d0c80f124 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/eztext.js @@ -0,0 +1,41 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--eztext'; + + class EzTextValidator extends ibexa.BaseFieldValidator { + /** + * Validates the textarea field value + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzTextValidator + */ + validateInput(event) { + const isError = event.target.required && !event.target.value.trim(); + const label = event.target.closest(SELECTOR_FIELD).querySelector('.ibexa-field-edit__label').innerHTML; + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzTextValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: '.ibexa-field-edit--eztext textarea', + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: ['.ibexa-form-error'], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/eztime.js b/public/bundles/ibexaadminui/js/scripts/fieldType/eztime.js new file mode 100644 index 000000000..d388f73ae --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/eztime.js @@ -0,0 +1,113 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--eztime'; + const SELECTOR_INPUT = '.ibexa-data-source__input:not(.flatpickr-input)'; + const SELECTOR_FLATPICKR_INPUT = '.flatpickr-input'; + const SELECTOR_ERROR_NODE = '.ibexa-data-source'; + const EVENT_VALUE_CHANGED = 'change'; + + class EzTimeValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzTimeValidator + */ + validateInput(event) { + const target = event.currentTarget; + const isRequired = target.required; + const isEmpty = !target.value.trim().length; + const label = event.target.closest(this.fieldSelector).querySelector('.ibexa-field-edit__label').innerHTML; + let isError = false; + let errorMessage = ''; + + if (isRequired && isEmpty) { + isError = true; + errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzTimeValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: `${SELECTOR_FIELD} ${SELECTOR_INPUT}`, + eventName: EVENT_VALUE_CHANGED, + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_FLATPICKR_INPUT], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FLATPICKR_INPUT}`, + eventName: 'blur', + callback: 'validateInput', + errorNodeSelectors: [SELECTOR_ERROR_NODE], + invalidStateSelectors: [SELECTOR_FLATPICKR_INPUT], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); + + const timeFields = doc.querySelectorAll(SELECTOR_FIELD); + const updateInputValue = (sourceInput, timestamps, { dates }) => { + const event = new CustomEvent(EVENT_VALUE_CHANGED); + + if (!dates.length) { + sourceInput.value = ''; + sourceInput.dispatchEvent(event); + + return; + } + + const date = new Date(dates[0]); + sourceInput.value = date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds(); + + sourceInput.dispatchEvent(event); + }; + const initFlatPickr = (field) => { + const sourceInput = field.querySelector(SELECTOR_INPUT); + const enableSeconds = sourceInput.dataset.seconds === '1'; + let defaultDate = null; + + if (sourceInput.value) { + const value = parseInt(sourceInput.value, 10); + const date = new Date(); + + date.setHours(Math.floor(value / 3600)); + date.setMinutes(Math.floor((value % 3600) / 60)); + date.setSeconds(Math.floor((value % 3600) % 60)); + + defaultDate = date; + } + + const dateTimePickerWidget = new ibexa.core.DateTimePicker({ + container: field, + onChange: updateInputValue.bind(null, sourceInput), + flatpickrConfig: { + noCalendar: true, + formatDate: (date) => ibexa.helpers.timezone.formatFullDateTime(date, null, ibexa.adminUiConfig.dateFormat.fullTime), + enableSeconds, + defaultDate, + }, + }); + + dateTimePickerWidget.init(); + + if (sourceInput.hasAttribute('required')) { + dateTimePickerWidget.inputField.setAttribute('required', true); + } + }; + + timeFields.forEach(initFlatPickr); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezurl.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezurl.js new file mode 100644 index 000000000..dab4cd47d --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezurl.js @@ -0,0 +1,42 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezurl'; + const SELECTOR_FIELD_LINK = '.ibexa-data-source__field--link'; + const SELECTOR_LINK_INPUT = `${SELECTOR_FIELD_LINK} .ibexa-data-source__input`; + const SELECTOR_LABEL = '.ibexa-data-source__label'; + const SELECTOR_ERROR_NODE = '.ibexa-data-source__field--link .ibexa-form-error'; + + class EzUrlValidator extends ibexa.BaseFieldValidator { + validateUrl(event) { + const input = event.currentTarget; + const isRequired = input.required; + const isEmpty = !input.value.trim(); + const isError = isEmpty && isRequired; + const label = input.closest(SELECTOR_FIELD_LINK).querySelector(SELECTOR_LABEL).innerHTML; + const result = { isError }; + + if (isRequired && isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + } + + return result; + } + } + + const validator = new EzUrlValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: `${SELECTOR_FIELD} ${SELECTOR_LINK_INPUT}`, + eventName: 'blur', + callback: 'validateUrl', + invalidStateSelectors: [SELECTOR_LINK_INPUT, `${SELECTOR_FIELD_LINK} ${SELECTOR_LABEL}`], + errorNodeSelectors: [SELECTOR_ERROR_NODE], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/fieldType/ezuser.js b/public/bundles/ibexaadminui/js/scripts/fieldType/ezuser.js new file mode 100644 index 000000000..c5eb354aa --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/fieldType/ezuser.js @@ -0,0 +1,137 @@ +(function (global, doc, ibexa) { + const SELECTOR_FIELD = '.ibexa-field-edit--ezuser'; + const SELECTOR_INNER_FIELD = '.ibexa-data-source__field'; + const SELECTOR_LABEL = '.ibexa-data-source__label'; + const SELECTOR_FIELD_USERNAME = '.ibexa-data-source__field--username'; + const SELECTOR_FIELD_FIRST = '.ibexa-data-source__field--first'; + const SELECTOR_FIELD_SECOND = '.ibexa-data-source__field--second'; + const SELECTOR_FIELD_EMAIL = '.ibexa-data-source__field--email'; + const SELECTOR_INPUT = '.ibexa-data-source__input'; + const SELECTOR_ERROR_WRAPPER = '.ibexa-form-error'; + + class EzUserValidator extends ibexa.BaseFieldValidator { + /** + * Validates the input field value + * + * @method validateInput + * @param {Event} event + * @returns {Object} + * @memberof EzUserValidator + */ + validateInput({ target }) { + const fieldContainer = target.closest(SELECTOR_INNER_FIELD); + const label = fieldContainer.querySelector(SELECTOR_LABEL).innerHTML; + const isError = target.required && !target.value.trim().length; + const errorMessage = ibexa.errors.emptyField.replace('{fieldName}', label); + + return { + isError, + errorMessage, + }; + } + + /** + * Validates the email input field value + * + * @method validateEmailInput + * @param {Event} event + * @returns {Object} + * @memberof EzUserValidator + */ + validateEmailInput({ target }) { + const isRequired = target.required; + const isEmpty = !target.value.trim(); + const isValid = ibexa.errors.emailRegexp.test(target.value); + const isError = (isRequired && isEmpty) || !isValid; + const fieldContainer = target.closest(SELECTOR_INNER_FIELD); + const result = { isError }; + + if (isEmpty) { + result.errorMessage = ibexa.errors.emptyField.replace( + '{fieldName}', + fieldContainer.querySelector(SELECTOR_LABEL).innerHTML, + ); + } else if (!isValid) { + result.errorMessage = ibexa.errors.invalidEmail; + } + + return result; + } + + /** + * Compares the values of both password inputs + * + * @method comparePasswords + * @param {Event} event + * @returns {Object} + * @memberof EzUserValidator + */ + comparePasswords({ target }) { + const validationResults = this.validateInput({ target }); + + if (validationResults.isError) { + return validationResults; + } + + const firstPassword = target + .closest(this.fieldSelector) + .querySelector(`${SELECTOR_FIELD_FIRST} ${SELECTOR_INPUT}`) + .value.trim(); + const secondPassword = target.value.trim(); + const passwordsMatch = firstPassword === secondPassword; + const requiredNotMatch = target.required && !passwordsMatch; + const notRequiredNotMatch = !target.required && (firstPassword.length || secondPassword.length) && !passwordsMatch; + let isError = false; + let errorMessage; + + if (requiredNotMatch || notRequiredNotMatch) { + isError = true; + errorMessage = ibexa.errors.notSamePasswords; + } + + return { + isError, + errorMessage, + }; + } + } + + const validator = new EzUserValidator({ + classInvalid: 'is-invalid', + fieldSelector: SELECTOR_FIELD, + eventsMap: [ + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FIELD_USERNAME} ${SELECTOR_INPUT}`, + eventName: 'blur', + callback: 'validateInput', + invalidStateSelectors: [`${SELECTOR_FIELD_USERNAME} ${SELECTOR_LABEL}`], + errorNodeSelectors: [`${SELECTOR_FIELD_USERNAME} ${SELECTOR_ERROR_WRAPPER}`], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FIELD_FIRST} ${SELECTOR_INPUT}`, + eventName: 'blur', + callback: 'validateInput', + invalidStateSelectors: [`${SELECTOR_FIELD_FIRST} ${SELECTOR_LABEL}`], + errorNodeSelectors: [`${SELECTOR_FIELD_FIRST} ${SELECTOR_ERROR_WRAPPER}`], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FIELD_SECOND} ${SELECTOR_INPUT}`, + eventName: 'blur', + callback: 'comparePasswords', + invalidStateSelectors: [`${SELECTOR_FIELD_SECOND} ${SELECTOR_LABEL}`], + errorNodeSelectors: [`${SELECTOR_FIELD_SECOND} ${SELECTOR_ERROR_WRAPPER}`], + }, + { + selector: `${SELECTOR_FIELD} ${SELECTOR_FIELD_EMAIL} ${SELECTOR_INPUT}`, + eventName: 'blur', + callback: 'validateEmailInput', + invalidStateSelectors: [`${SELECTOR_FIELD_EMAIL} ${SELECTOR_LABEL}`], + errorNodeSelectors: [`${SELECTOR_FIELD_EMAIL} ${SELECTOR_ERROR_WRAPPER}`], + }, + ], + }); + + validator.init(); + + ibexa.addConfig('fieldTypeValidators', [validator], true); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/content.type.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/content.type.helper.js new file mode 100644 index 000000000..8a27e42c1 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/content.type.helper.js @@ -0,0 +1,63 @@ +(function (global, doc, ibexa) { + let contentTypesDataMap = null; + + /** + * Creates map with content types identifiers as keys for faster lookup + * + * @function createContentTypeDataMap + * @returns {Object} contentTypesDataMap + */ + const createContentTypeDataMap = () => + Object.values(ibexa.adminUiConfig.contentTypes).reduce((contentTypeDataMap, contentTypeGroup) => { + for (const contentTypeData of contentTypeGroup) { + contentTypeDataMap[contentTypeData.identifier] = contentTypeData; + } + + return contentTypeDataMap; + }, {}); + + /** + * Returns an URL to a content type icon + * + * @function getContentTypeIcon + * @param {String} contentTypeIdentifier + * @returns {String|null} url to icon + */ + const getContentTypeIconUrl = (contentTypeIdentifier) => { + if (!contentTypesDataMap) { + contentTypesDataMap = createContentTypeDataMap(); + } + + if (!contentTypeIdentifier || !contentTypesDataMap[contentTypeIdentifier]) { + return null; + } + + const iconUrl = contentTypesDataMap[contentTypeIdentifier].thumbnail; + + return iconUrl; + }; + + /** + * Returns contentType name from contentType identifier + * + * @function getContentTypeName + * @param {String} contentTypeIdentifier + * @returns {String|null} contentType name + */ + const getContentTypeName = (contentTypeIdentifier) => { + if (!contentTypesDataMap) { + contentTypesDataMap = createContentTypeDataMap(); + } + + if (!contentTypeIdentifier || !contentTypesDataMap[contentTypeIdentifier]) { + return null; + } + + return contentTypesDataMap[contentTypeIdentifier].name; + }; + + ibexa.addConfig('helpers.contentType', { + getContentTypeIconUrl, + getContentTypeName, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/cookies.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/cookies.helper.js new file mode 100644 index 000000000..4eebda855 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/cookies.helper.js @@ -0,0 +1,30 @@ +(function (global, doc, ibexa) { + const { backOfficePath } = ibexa.adminUiConfig; + const setBackOfficeCookie = (name, value, maxAgeDays = 356, path = backOfficePath) => { + setCookie(name, value, maxAgeDays, path); + }; + const setCookie = (name, value, maxAgeDays = 356, path = '/') => { + const maxAge = maxAgeDays * 24 * 60 * 60; + + doc.cookie = `${name}=${value};max-age=${maxAge};path=${path}`; + }; + const getCookie = (name) => { + const decodedCookie = decodeURIComponent(doc.cookie); + const cookiesArray = decodedCookie.split(';'); + + const cookieValue = cookiesArray.find((cookie) => { + const cookieString = cookie.trim(); + const seachingString = `${name}=`; + + return cookieString.indexOf(seachingString) === 0; + }); + + return cookieValue ? cookieValue.split('=')[1] : null; + }; + + ibexa.addConfig('helpers.cookies', { + getCookie, + setCookie, + setBackOfficeCookie, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/form.error.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/form.error.helper.js new file mode 100644 index 000000000..6bc39c476 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/form.error.helper.js @@ -0,0 +1,12 @@ +(function (global, doc, ibexa) { + // @deprecated, will be removed in 5.0 + ibexa.addConfig('helpers.formError', { + formatLine: (...args) => { + console.warn( + 'helpers.formError.formatLine method is deprecated and will be removed in 5.0, please use helpers.formValidation.formatErrorLine instead.', + ); + + return ibexa.helpers.formValidation.formatErrorLine(...args); + }, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/form.validation.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/form.validation.helper.js new file mode 100644 index 000000000..f6c15b4c7 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/form.validation.helper.js @@ -0,0 +1,52 @@ +(function (global, doc, ibexa, Translator) { + const formatErrorLine = (errorMessage) => { + const errorIcon = ` + + `; + const container = document.createElement('em'); + const errorMessageNode = document.createTextNode(errorMessage); + + container.classList.add('ibexa-form-error__row'); + container.insertAdjacentHTML('beforeend', errorIcon); + container.append(errorMessageNode); + + return container; + }; + const checkIsEmpty = (field) => { + let errorMessage = ''; + const input = field.querySelector('.ibexa-input'); + const label = field.querySelector('.ibexa-label'); + + if (label) { + const fieldName = label.innerText; + + errorMessage = Translator.trans(/*@Desc("%fieldName% Field is required")*/ 'error.required.field', { fieldName }, 'forms'); + } else { + errorMessage = Translator.trans(/*@Desc("This value should not be blank")*/ 'error.required.field_not_blank', {}, 'forms'); + } + + return { + isValid: input.value, + errorMessage, + }; + }; + const validateIsEmptyField = (field) => { + const input = field.querySelector('.ibexa-input'); + const errorWrapper = field.querySelector('.ibexa-form-error'); + const validatorOutput = checkIsEmpty(field); + const { isValid, errorMessage } = validatorOutput; + + input.classList.toggle('is-invalid', !isValid); + errorWrapper.innerText = ''; + + if (!isValid) { + errorWrapper.append(formatErrorLine(errorMessage)); + } + + return validatorOutput; + }; + ibexa.addConfig('helpers.formValidation', { + formatErrorLine, + validateIsEmptyField, + }); +})(window, window.document, window.ibexa, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/icon.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/icon.helper.js new file mode 100644 index 000000000..14e98289a --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/icon.helper.js @@ -0,0 +1,11 @@ +(function (global, doc, ibexa) { + const getIconPath = (path, iconSet = ibexa.adminUiConfig.iconPaths.defaultIconSet) => { + const iconSetPath = ibexa.adminUiConfig.iconPaths.iconSets[iconSet]; + + return `${iconSetPath}#${path}`; + }; + + ibexa.addConfig('helpers.icon', { + getIconPath, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/location.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/location.helper.js new file mode 100644 index 000000000..d3bdcacbb --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/location.helper.js @@ -0,0 +1,57 @@ +(function (global, doc, ibexa, Translator) { + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + const removeRootFromPathString = (pathString) => { + const pathArray = pathString.split('/').filter((id) => id); + + return pathArray.splice(1, pathArray.length - 1); + }; + const buildLocationsBreadcrumbs = (locations) => + locations.map((Location) => ibexa.helpers.text.escapeHTML(Location.ContentInfo.Content.TranslatedName)).join(' / '); + const findLocationsByIds = (idList, callback) => { + const body = JSON.stringify({ + ViewInput: { + identifier: `locations-by-path-string-${idList.join('-')}`, + public: false, + LocationQuery: { + FacetBuilders: {}, + SortClauses: { SectionIdentifier: 'ascending' }, + Filter: { LocationIdCriterion: idList.join(',') }, + limit: 50, + offset: 0, + }, + }, + }); + const request = new Request('/api/ibexa/v2/views', { + method: 'POST', + headers: { + Accept: 'application/vnd.ibexa.api.View+json; version=1.1', + 'Content-Type': 'application/vnd.ibexa.api.ViewInput+json; version=1.1', + 'X-Requested-With': 'XMLHttpRequest', + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + body, + mode: 'same-origin', + credentials: 'same-origin', + }); + const errorMessage = Translator.trans( + /*@Desc("Cannot find children Locations with ID %idList%")*/ 'select_location.error', + { idList: idList.join(',') }, + 'universal_discovery_widget', + ); + + fetch(request) + .then(ibexa.helpers.request.getJsonFromResponse) + .then((viewData) => viewData.View.Result.searchHits.searchHit) + .then((searchHits) => searchHits.map((searchHit) => searchHit.value.Location)) + .then(callback) + .catch(() => ibexa.helpers.notification.showErrorNotification(errorMessage)); + }; + + ibexa.addConfig('helpers.location', { + removeRootFromPathString, + findLocationsByIds, + buildLocationsBreadcrumbs, + }); +})(window, window.document, window.ibexa, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/middle.ellipsis.js b/public/bundles/ibexaadminui/js/scripts/helpers/middle.ellipsis.js new file mode 100644 index 000000000..248238284 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/middle.ellipsis.js @@ -0,0 +1,58 @@ +(function (global, doc, ibexa) { + const resizeEllipsisObserver = new ResizeObserver((entries) => { + entries.forEach((entry) => { + parse(entry.target); + }); + }); + const parse = (baseElement = doc) => { + const isHTMLElement = baseElement instanceof Element || baseElement instanceof Document; + + if (!isHTMLElement) { + console.warn('Provided element does not belong to Document interface'); + + return; + } + + const middleEllipsisContainers = [...baseElement.querySelectorAll('.ibexa-middle-ellipsis')]; + + if (baseElement instanceof Element && baseElement.classList.contains('ibexa-middle-ellipsis')) { + middleEllipsisContainers.push(baseElement); + } + + middleEllipsisContainers.forEach((middleEllipsisContainer) => { + const partStart = middleEllipsisContainer.querySelector('.ibexa-middle-ellipsis__name--start'); + const isEllipsized = partStart.scrollWidth > partStart.offsetWidth; + + if (!isEllipsized) { + middleEllipsisContainer.dataset.bsOriginalTitle = ''; + } else { + const partStartContentNode = partStart.querySelector('.ibexa-middle-ellipsis__name-ellipsized'); + + middleEllipsisContainer.dataset.bsOriginalTitle = partStartContentNode.innerHTML; + } + + middleEllipsisContainer.classList.toggle('ibexa-middle-ellipsis--ellipsized', isEllipsized); + ibexa.helpers.tooltips.parse(middleEllipsisContainer); + + resizeEllipsisObserver.observe(middleEllipsisContainer); + }); + }; + // @deprecated, will be removed in 5.0 + const parseAll = () => parse(doc); + const update = (baseElement, content) => { + const contentElements = [...baseElement.querySelectorAll('.ibexa-middle-ellipsis__name-ellipsized')]; + const contentEscaped = ibexa.helpers.text.escapeHTML(content); + + baseElement.dataset.bsOriginalTitle = contentEscaped; + contentElements.forEach((contentElement) => { + contentElement.innerHTML = contentEscaped; + }); + parse(baseElement); + }; + + ibexa.addConfig('helpers.ellipsis.middle', { + parse, + parseAll, + update, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/notification.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/notification.helper.js new file mode 100644 index 000000000..48d3351ed --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/notification.helper.js @@ -0,0 +1,98 @@ +(function (global, doc, ibexa) { + const NOTIFICATION_INFO_LABEL = 'info'; + const NOTIFICATION_SUCCESS_LABEL = 'success'; + const NOTIFICATION_WARNING_LABEL = 'warning'; + const NOTIFICATION_ERROR_LABEL = 'error'; + + /** + * Dispatches notification event + * + * @function showNotification + * @param {Object} detail + * @param {String} detail.message + * @param {String} detail.label + * @param {Function} [detail.onShow] to be called after notification Node was added + * @param {Object} detail.rawPlaceholdersMap + */ + const showNotification = (detail) => { + const event = new CustomEvent('ibexa-notify', { detail }); + + doc.body.dispatchEvent(event); + }; + + /** + * Dispatches info notification event + * + * @function showInfoNotification + * @param {String} message + * @param {Function} [onShow] to be called after notification Node was added + * @param {Object} rawPlaceholdersMap + */ + const showInfoNotification = (message, onShow, rawPlaceholdersMap = {}) => + showNotification({ + message, + label: NOTIFICATION_INFO_LABEL, + onShow, + rawPlaceholdersMap, + }); + + /** + * Dispatches success notification event + * + * @function showSuccessNotification + * @param {String} message + * @param {Function} [onShow] to be called after notification Node was added + * @param {Object} rawPlaceholdersMap + */ + const showSuccessNotification = (message, onShow, rawPlaceholdersMap = {}) => + showNotification({ + message, + label: NOTIFICATION_SUCCESS_LABEL, + onShow, + rawPlaceholdersMap, + }); + + /** + * Dispatches warning notification event + * + * @function showWarningNotification + * @param {String} message + * @param {Function} [onShow] to be called after notification Node was added + * @param {Object} rawPlaceholdersMap + */ + const showWarningNotification = (message, onShow, rawPlaceholdersMap = {}) => + showNotification({ + message, + label: NOTIFICATION_WARNING_LABEL, + onShow, + rawPlaceholdersMap, + }); + + /** + * Dispatches error notification event + * + * @function showErrorNotification + * @param {(string | Error)} error + * @param {Function} [onShow] to be called after notification Node was added + * @param {Object} rawPlaceholdersMap + */ + const showErrorNotification = (error, onShow, rawPlaceholdersMap = {}) => { + const isErrorObj = error instanceof Error; + const message = isErrorObj ? error.message : error; + + showNotification({ + message, + label: NOTIFICATION_ERROR_LABEL, + onShow, + rawPlaceholdersMap, + }); + }; + + ibexa.addConfig('helpers.notification', { + showNotification, + showInfoNotification, + showSuccessNotification, + showWarningNotification, + showErrorNotification, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/object.instances.js b/public/bundles/ibexaadminui/js/scripts/helpers/object.instances.js new file mode 100644 index 000000000..f5dfb49fb --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/object.instances.js @@ -0,0 +1,21 @@ +(function (global, doc, ibexa) { + const setInstance = (domElement, instance) => { + if (domElement.ibexaInstance) { + throw new Error('Instance for this DOM element already exists!'); + } + + domElement.ibexaInstance = instance; + }; + const getInstance = (domElement) => { + return domElement.ibexaInstance; + }; + const clearInstance = (domElement) => { + delete domElement.ibexaInstance; + }; + + ibexa.addConfig('helpers.objectInstances', { + setInstance, + getInstance, + clearInstance, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/pagination.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/pagination.helper.js new file mode 100644 index 000000000..de49ca2c4 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/pagination.helper.js @@ -0,0 +1,41 @@ +(function (global, doc, ibexa) { + /** + * Computes array with pagination pages. + * + * Example 1: [ 1, "...", 5, 6, 7, 8, 9, 10 ] (for: proximity = 2; pagesNumber = 10; activePageIndex = 7) + * Example 2: [ 1, "...", 3, 4, 5, 6, 7, "...", 10 ] (for: proximity = 2; pagesNumber = 10; activePageIndex = 5) + * Example 3: [ 1, "...", 8, 9, 10, 11, 12, "...", 20 ] (for: proximity = 2; pagesNumber = 20; activePageIndex = 10) + * + * @param {Object} params + * @param {Number} params.proximity + * @param {Number} params.activePageIndex + * @param {Number} params.pagesCount + * @param {String} params.separator + * + * @returns {Array} + */ + const computePages = ({ proximity = 2, activePageIndex, pagesCount, separator = '...' }) => { + const pages = []; + let wasSeparator = false; + + for (let i = 1; i <= pagesCount; i++) { + const isFirstPage = i === 1; + const isLastPage = i === pagesCount; + const isInRange = i >= activePageIndex + 1 - proximity && i <= activePageIndex + 1 + proximity; + + if (isFirstPage || isLastPage || isInRange) { + pages.push(i); + wasSeparator = false; + } else if (!wasSeparator) { + pages.push(separator); + wasSeparator = true; + } + } + + return pages; + }; + + ibexa.addConfig('helpers.pagination', { + computePages, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/request.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/request.helper.js new file mode 100644 index 000000000..a3d4714ec --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/request.helper.js @@ -0,0 +1,55 @@ +(function (global, doc, ibexa) { + /** + * Handles request error + * + * @function handleRequest + * @param {Response} response + * @returns {Error|Response} + */ + const handleRequest = (response) => { + if (!response.ok) { + throw Error(response.statusText); + } + + return response; + }; + + /** + * Handles request JSON response + * + * @function getJsonFromResponse + * @param {Response} response + * @returns {Error|Promise} + */ + const getJsonFromResponse = (response) => { + return handleRequest(response).json(); + }; + + /** + * Handles request text response + * + * @function getTextFromResponse + * @param {Response} response + * @returns {Error|Promise} + */ + const getTextFromResponse = (response) => { + return handleRequest(response).text(); + }; + + /** + * Handles request response; returns status if response is OK + * + * @function getStatusFromResponse + * @param {Response} response + * @returns {Error|Promise} + */ + const getStatusFromResponse = (response) => { + return handleRequest(response).status; + }; + + ibexa.addConfig('helpers.request', { + getJsonFromResponse, + getTextFromResponse, + getStatusFromResponse, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/table.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/table.helper.js new file mode 100644 index 000000000..2545b9143 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/table.helper.js @@ -0,0 +1,18 @@ +(function (global, doc, ibexa) { + const onChangeHandler = (activeClass, event) => { + const { checked } = event.target; + const action = checked ? 'add' : 'remove'; + const parentRow = event.target.closest('tr'); + + parentRow.classList[action](activeClass); + }; + const parseCheckbox = (checkboxSelector, activeClass) => { + doc.querySelectorAll(checkboxSelector).forEach((checkboxNode) => { + checkboxNode.addEventListener('change', onChangeHandler.bind(this, activeClass), false); + }); + }; + + ibexa.addConfig('helpers.table', { + parseCheckbox, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/tag.view.select.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/tag.view.select.helper.js new file mode 100644 index 000000000..e294c1306 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/tag.view.select.helper.js @@ -0,0 +1,23 @@ +(function (global, doc, ibexa) { + const buildItemsFromUDWResponse = (udwItems, getId, callback) => { + const { removeRootFromPathString, findLocationsByIds, buildLocationsBreadcrumbs } = window.ibexa.helpers.location; + + Promise.all( + udwItems.map( + (item) => + new Promise((resolve) => { + findLocationsByIds(removeRootFromPathString(item.pathString), (locations) => { + resolve({ + id: getId(item), + name: buildLocationsBreadcrumbs(locations), + }); + }); + }), + ), + ).then(callback); + }; + + ibexa.addConfig('helpers.tagViewSelect', { + buildItemsFromUDWResponse, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/text.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/text.helper.js new file mode 100644 index 000000000..3fee9c5fc --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/text.helper.js @@ -0,0 +1,27 @@ +(function (global, doc, ibexa) { + const escapeHTML = (string) => { + const stringTempNode = doc.createElement('div'); + + stringTempNode.appendChild(doc.createTextNode(string)); + + return stringTempNode.innerHTML; + }; + + const escapeHTMLAttribute = (string) => { + if (string === null) { + return ''; + } + + return String(string) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }; + + ibexa.addConfig('helpers.text', { + escapeHTML, + escapeHTMLAttribute, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/timezone.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/timezone.helper.js new file mode 100644 index 000000000..5272f5c05 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/timezone.helper.js @@ -0,0 +1,32 @@ +(function (global, doc, ibexa, moment) { + const userPreferredTimezone = ibexa.adminUiConfig.timezone; + const userPreferredFullDateTimeFormat = ibexa.adminUiConfig.dateFormat.fullDateTime; + const userPreferredShortDateTimeFormat = ibexa.adminUiConfig.dateFormat.shortDateTime; + + const convertDateToTimezone = (date, timezone = userPreferredTimezone, forceSameTime = false) => { + return moment(date).tz(timezone, forceSameTime); + }; + const formatDate = (date, timezone = null, format) => { + if (timezone) { + date = convertDateToTimezone(date, timezone); + } + + return moment(date).formatICU(format); + }; + const formatFullDateTime = (date, timezone = userPreferredTimezone, format = userPreferredFullDateTimeFormat) => { + return formatDate(date, timezone, format); + }; + const formatShortDateTime = (date, timezone = userPreferredTimezone, format = userPreferredShortDateTimeFormat) => { + return formatDate(date, timezone, format); + }; + const getBrowserTimezone = () => { + return Intl.DateTimeFormat().resolvedOptions().timeZone; + }; + + ibexa.addConfig('helpers.timezone', { + convertDateToTimezone, + formatFullDateTime, + formatShortDateTime, + getBrowserTimezone, + }); +})(window, window.document, window.ibexa, window.moment); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/tooltips.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/tooltips.helper.js new file mode 100644 index 000000000..38006c8f3 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/tooltips.helper.js @@ -0,0 +1,221 @@ +(function (global, doc, ibexa, bootstrap) { + let lastInsertTooltipTarget = null; + const TOOLTIPS_SELECTOR = '[title], [data-tooltip-title]'; + const observerConfig = { + childList: true, + subtree: true, + }; + const resizeEllipsisObserver = new ResizeObserver((entries) => { + entries.forEach((entry) => { + ibexa.helpers.tooltips.parse(entry.target); + }); + }); + const observer = new MutationObserver((mutationsList) => { + if (lastInsertTooltipTarget) { + mutationsList.forEach((mutation) => { + const { addedNodes, removedNodes } = mutation; + + if (addedNodes.length) { + addedNodes.forEach((addedNode) => { + if (addedNode instanceof Element) { + parse(addedNode); + } + }); + } + + if (removedNodes.length) { + removedNodes.forEach((removedNode) => { + if (removedNode.classList && !removedNode.classList.contains('ibexa-tooltip')) { + lastInsertTooltipTarget = null; + doc.querySelectorAll('.ibexa-tooltip.show').forEach((tooltipNode) => { + tooltipNode.remove(); + }); + } + }); + } + }); + } + }); + const modifyPopperConfig = (iframe, defaultBsPopperConfig) => { + if (!iframe) { + return defaultBsPopperConfig; + } + + const iframeDOMRect = iframe.getBoundingClientRect(); + const offsetX = iframeDOMRect.x; + const offsetY = iframeDOMRect.y; + const offsetModifier = { + name: 'offset', + options: { + offset: ({ placement }) => { + const [basePlacement] = placement.split('-'); + + switch (basePlacement) { + case 'top': + return [offsetX, -offsetY]; + case 'bottom': + return [offsetX, offsetY]; + case 'right': + return [offsetY, offsetX]; + case 'left': + return [offsetY, -offsetX]; + default: + return []; + } + }, + }, + }; + const offsetModifierIndex = defaultBsPopperConfig.modifiers.findIndex((modifier) => modifier.name == 'offset'); + + if (offsetModifierIndex != -1) { + defaultBsPopperConfig.modifiers[offsetModifierIndex] = offsetModifier; + } else { + defaultBsPopperConfig.modifiers.push(offsetModifier); + } + + return defaultBsPopperConfig; + }; + const getTextHeight = (text, styles) => { + const tag = doc.createElement('div'); + + tag.innerHTML = text; + + for (const key in styles) { + tag.style[key] = styles[key]; + } + + doc.body.appendChild(tag); + + const { height: texHeight } = tag.getBoundingClientRect(); + + doc.body.removeChild(tag); + + return texHeight; + }; + const isTitleEllipsized = (node) => { + const title = node.dataset.originalTitle; + const { width: nodeWidth, height: nodeHeight } = node.getBoundingClientRect(); + const computedNodeStyles = getComputedStyle(node); + const styles = { + width: `${nodeWidth}px`, + padding: computedNodeStyles.getPropertyValue('padding'), + 'font-size': computedNodeStyles.getPropertyValue('font-size'), + 'font-family': computedNodeStyles.getPropertyValue('font-family'), + 'font-weight': computedNodeStyles.getPropertyValue('font-weight'), + 'font-style': computedNodeStyles.getPropertyValue('font-style'), + 'font-variant': computedNodeStyles.getPropertyValue('font-variant'), + 'line-height': computedNodeStyles.getPropertyValue('line-height'), + 'word-break': 'break-all', + }; + + const textHeight = getTextHeight(title, styles); + + return textHeight > nodeHeight; + }; + const initializeTooltip = (tooltipNode) => { + const delay = { + show: parseInt(tooltipNode.dataset.delayShow, 10) ?? 150, + hide: parseInt(tooltipNode.dataset.delayHide, 10) ?? 75, + }; + const extraClass = tooltipNode.dataset.tooltipExtraClass ?? ''; + const placement = tooltipNode.dataset.tooltipPlacement ?? 'bottom'; + const trigger = tooltipNode.dataset.tooltipTrigger ?? 'hover focus'; + const useHtml = tooltipNode.dataset.tooltipUseHtml !== undefined; + const container = tooltipNode.dataset.tooltipContainerSelector + ? tooltipNode.closest(tooltipNode.dataset.tooltipContainerSelector) + : 'body'; + const iframe = document.querySelector(tooltipNode.dataset.tooltipIframeSelector); + + new bootstrap.Tooltip(tooltipNode, { + delay, + placement, + trigger, + container, + popperConfig: modifyPopperConfig.bind(null, iframe), + html: useHtml, + template: `
    +
    +
    +
    `, + }); + + tooltipNode.addEventListener('inserted.bs.tooltip', (event) => { + lastInsertTooltipTarget = event.currentTarget; + }); + }; + const parse = (baseElement = doc) => { + if (!baseElement) { + return; + } + + const tooltipNodes = [...baseElement.querySelectorAll(TOOLTIPS_SELECTOR)]; + + if (baseElement instanceof Element) { + tooltipNodes.push(baseElement); + } + + for (const tooltipNode of tooltipNodes) { + const hasEllipsisStyle = getComputedStyle(tooltipNode).textOverflow === 'ellipsis'; + const hasNewTitle = tooltipNode.hasAttribute('title'); + const tooltipInitialized = !!tooltipNode.dataset.originalTitle; + let shouldHaveTooltip = !hasEllipsisStyle; + + if (!tooltipInitialized && hasNewTitle) { + resizeEllipsisObserver.observe(tooltipNode); + tooltipNode.dataset.originalTitle = tooltipNode.title; + + if (!shouldHaveTooltip) { + shouldHaveTooltip = isTitleEllipsized(tooltipNode); + } + + if (shouldHaveTooltip) { + initializeTooltip(tooltipNode); + } else { + tooltipNode.removeAttribute('title'); + } + } else if (tooltipInitialized && (hasNewTitle || hasEllipsisStyle)) { + if (hasNewTitle) { + tooltipNode.dataset.originalTitle = tooltipNode.title; + } + const tooltipInstance = bootstrap.Tooltip.getInstance(tooltipNode); + const hasTooltip = !!tooltipInstance; + + if (!shouldHaveTooltip) { + shouldHaveTooltip = isTitleEllipsized(tooltipNode); + } + + if (hasTooltip && ((hasNewTitle && shouldHaveTooltip) || !shouldHaveTooltip)) { + tooltipInstance.dispose(); + } + + if (shouldHaveTooltip && (hasNewTitle || !hasTooltip)) { + tooltipNode.title = tooltipNode.dataset.originalTitle; + + initializeTooltip(tooltipNode); + } else { + tooltipNode.removeAttribute('title'); + } + } + } + }; + const hideAll = (baseElement = doc) => { + if (!baseElement) { + return; + } + + const tooltipsNode = baseElement.querySelectorAll(TOOLTIPS_SELECTOR); + + for (const tooltipNode of tooltipsNode) { + bootstrap.Tooltip.getOrCreateInstance(tooltipNode).hide(); + } + }; + const observe = (baseElement = doc) => { + observer.observe(baseElement, observerConfig); + }; + + ibexa.addConfig('helpers.tooltips', { + parse, + hideAll, + observe, + }); +})(window, window.document, window.ibexa, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/helpers/user.helper.js b/public/bundles/ibexaadminui/js/scripts/helpers/user.helper.js new file mode 100644 index 000000000..07443b4c7 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/helpers/user.helper.js @@ -0,0 +1,7 @@ +(function (global, doc, ibexa) { + const getId = () => doc.querySelector('meta[name="UserId"]').content; + + ibexa.addConfig('helpers.user', { + getId, + }); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/login.js b/public/bundles/ibexaadminui/js/scripts/login.js new file mode 100644 index 000000000..4f5952835 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/login.js @@ -0,0 +1,31 @@ +(function (global, doc) { + const AUTOFILL_TIMEOUT = 500; + const loginBtn = doc.querySelector('.ibexa-login__btn--sign-in'); + const nameInput = doc.querySelector('.ibexa-login__input--name'); + const passwordInput = doc.querySelector('.ibexa-login__input--password'); + const toggleLoginBtnState = () => { + const shouldBeDisabled = !nameInput.value || !passwordInput.value; + + loginBtn.toggleAttribute('disabled', shouldBeDisabled); + }; + const handleAutofill = () => { + const isNameInputAutofilled = nameInput.matches(':-webkit-autofill'); + const isPasswordInputAutofilled = nameInput.matches(':-webkit-autofill'); + const isAutofilled = isNameInputAutofilled && isPasswordInputAutofilled; + + if (isAutofilled) { + loginBtn.removeAttribute('disabled'); + } + }; + + if (loginBtn) { + nameInput.addEventListener('keyup', toggleLoginBtnState, false); + nameInput.addEventListener('change', toggleLoginBtnState, false); + passwordInput.addEventListener('keyup', toggleLoginBtnState, false); + passwordInput.addEventListener('change', toggleLoginBtnState, false); + + toggleLoginBtnState(); + + global.setTimeout(handleAutofill, AUTOFILL_TIMEOUT); + } +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.edit.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.edit.js new file mode 100644 index 000000000..ebf7026dc --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.edit.js @@ -0,0 +1,19 @@ +(function (global, doc) { + const editButton = doc.querySelector('.ibexa-btn--edit'); + const languageRadioOption = doc.querySelector( + '.ibexa-content-menu-wrapper .ibexa-extra-actions--edit.ibexa-extra-actions--prevent-show .ibexa-input--radio', + ); + + if (!languageRadioOption) { + return; + } + + editButton.addEventListener( + 'click', + () => { + languageRadioOption.checked = true; + languageRadioOption.dispatchEvent(new CustomEvent('change')); + }, + false, + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.hide.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.hide.js new file mode 100644 index 000000000..d04f59264 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.hide.js @@ -0,0 +1,30 @@ +(function (global, doc, bootstrap) { + const hideButton = doc.querySelector('.ibexa-btn--hide'); + const modal = doc.querySelector('#hide-content-modal'); + const form = doc.querySelector('form[name="content_visibility_update"]'); + const visiblity = doc.querySelector('#content_visibility_update_visible'); + + if (!hideButton) { + return; + } + + if (modal) { + modal.querySelector('.ibexa-btn--confirm').addEventListener('click', () => { + visiblity.value = 0; + form.submit(); + }); + } + + hideButton.addEventListener( + 'click', + () => { + if (modal) { + bootstrap.Modal.getOrCreateInstance(modal).show(); + } else { + visiblity.value = 0; + form.submit(); + } + }, + false, + ); +})(window, window.document, window.bootstrap); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.reveal.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.reveal.js new file mode 100644 index 000000000..b82f904cd --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/content.reveal.js @@ -0,0 +1,18 @@ +(function (global, doc) { + const revealButton = doc.querySelector('.ibexa-btn--reveal'); + const form = doc.querySelector('form[name="content_visibility_update"]'); + const visiblity = doc.querySelector('#content_visibility_update_visible'); + + if (!revealButton) { + return; + } + + revealButton.addEventListener( + 'click', + () => { + visiblity.value = 1; + form.submit(); + }, + false, + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/contenttype.edit.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/contenttype.edit.js new file mode 100644 index 000000000..437a1b5f8 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/contenttype.edit.js @@ -0,0 +1,26 @@ +(function (global, doc) { + const editButton = doc.querySelector('.ibexa-btn--edit'); + const languageRadioOption = doc.querySelector('.ibexa-extra-actions--edit.ibexa-extra-actions--prevent-show .ibexa-input--radio'); + const editActions = doc.querySelector('.ibexa-extra-actions--edit'); + const btns = editActions.querySelectorAll('.form-check [type="radio"]'); + const changeHandler = () => { + const form = doc.querySelector('.ibexa-extra-actions--edit form'); + + form.submit(); + }; + + btns.forEach((btn) => btn.addEventListener('change', changeHandler, false)); + + if (!languageRadioOption) { + return; + } + + editButton.addEventListener( + 'click', + () => { + languageRadioOption.checked = true; + changeHandler(); + }, + false, + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/location.create.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/location.create.js new file mode 100644 index 000000000..075e9eae5 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/location.create.js @@ -0,0 +1,37 @@ +(function (global, doc) { + const createActions = doc.querySelectorAll('.ibexa-extra-actions--create'); + + if (!createActions.length) { + return; + } + + createActions.forEach((container) => { + const radioInputs = container.querySelectorAll('.form-check [type="radio"]'); + const submitBtn = container.querySelector('.ibexa-extra-actions__btn--confirm'); + const cancelBtn = container.querySelector('.ibexa-extra-actions__btn--cancel'); + const closeBtn = container.querySelector('.ibexa-extra-actions__header .ibexa-btn--close'); + + cancelBtn.addEventListener( + 'click', + () => { + closeBtn.click(); + }, + false, + ); + radioInputs.forEach((radioInput) => + radioInput.addEventListener( + 'change', + (event) => { + const selectedItems = container.querySelectorAll('.ibexa-instant-filter__group-item--selected'); + const itemToSelect = event.currentTarget.closest('.ibexa-instant-filter__group-item'); + + selectedItems.forEach((selectedItem) => selectedItem.classList.remove('ibexa-instant-filter__group-item--selected')); + itemToSelect.classList.add('ibexa-instant-filter__group-item--selected'); + + submitBtn.removeAttribute('disabled'); + }, + false, + ), + ); + }); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/location.edit.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/location.edit.js new file mode 100644 index 000000000..14bdd9353 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/location.edit.js @@ -0,0 +1,81 @@ +(function (global, doc, ibexa, bootstrap, Routing) { + const editActions = doc.querySelectorAll('.ibexa-extra-actions--edit, .ibexa-extra-actions--edit-user'); + const resetRadioButtons = (btns) => + btns.forEach((btn) => { + btn.checked = false; + }); + const addDraft = (form) => { + form.submit(); + bootstrap.Modal.getOrCreateInstance(doc.querySelector('#version-draft-conflict-modal')).hide(); + }; + const redirectToUserEdit = (languageCode, contentId, form) => { + const versionNo = form.querySelector('#user_edit_version_info_version_no').value; + + window.location.href = Routing.generate('ibexa.user.update', { contentId, versionNo, language: languageCode }); + }; + const onModalHidden = (btns) => { + resetRadioButtons(btns); + + const event = new CustomEvent('ibexa-draft-conflict-modal-hidden'); + + doc.body.dispatchEvent(event); + }; + const attachModalListeners = (wrapper, form, btns) => { + const addDraftButton = wrapper.querySelector('.ibexa-btn--add-draft'); + const conflictModal = doc.querySelector('#version-draft-conflict-modal'); + + if (addDraftButton) { + addDraftButton.addEventListener('click', addDraft.bind(null, form), false); + } + + wrapper + .querySelectorAll('.ibexa-btn--prevented') + .forEach((btn) => btn.addEventListener('click', (event) => event.preventDefault(), false)); + + if (conflictModal) { + bootstrap.Modal.getOrCreateInstance(conflictModal).show(); + + conflictModal.addEventListener('hidden.bs.modal', onModalHidden.bind(null, btns)); + conflictModal.addEventListener('shown.bs.modal', () => ibexa.helpers.tooltips.parse()); + } + }; + const showModal = (form, btns, modalHtml) => { + const wrapper = doc.querySelector('.ibexa-modal-wrapper'); + + wrapper.innerHTML = modalHtml; + attachModalListeners(wrapper, form, btns); + }; + const changeHandler = (form, btns, event) => { + const contentIdInput = form.querySelector('.ibexa-extra-actions__form-field--content-info'); + const locationInput = form.querySelector('.ibexa-extra-actions__form-field--location'); + const contentId = contentIdInput.value; + const locationId = locationInput.value; + const checkedBtn = event.currentTarget; + const languageCode = checkedBtn.value; + const checkVersionDraftLink = Routing.generate('ibexa.version_draft.has_no_conflict', { contentId, languageCode, locationId }); + + fetch(checkVersionDraftLink, { + credentials: 'same-origin', + }).then((response) => { + if (response.status === 409) { + response.text().then(showModal.bind(null, form, btns)); + } else if (response.status === 200) { + if (form.querySelector('#user_edit_version_info')) { + redirectToUserEdit(languageCode, contentId, form); + + return; + } + + form.submit(); + } + }); + }; + const attachEventsToEditActionsWidget = (container) => { + const btns = [...container.querySelectorAll('.form-check [type="radio"]')]; + const form = container.querySelector('form'); + + btns.forEach((btn) => btn.addEventListener('change', changeHandler.bind(null, form, btns), false)); + }; + + [...editActions].forEach(attachEventsToEditActionsWidget); +})(window, window.document, window.ibexa, window.bootstrap, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/btn/user.edit.js b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/user.edit.js new file mode 100644 index 000000000..b4cb65d27 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/btn/user.edit.js @@ -0,0 +1,18 @@ +(function (global, doc) { + const editButton = doc.querySelector('.ibexa-btn--edit-user'); + const languageRadioOption = doc.querySelector('.ibexa-extra-actions--edit-user.ibexa-extra-actions--prevent-show .ibexa-input--radio'); + const editActions = doc.querySelector('.ibexa-extra-actions--edit-user'); + + if (!editActions || !languageRadioOption) { + return; + } + + editButton.addEventListener( + 'click', + () => { + languageRadioOption.checked = true; + languageRadioOption.dispatchEvent(new CustomEvent('change')); + }, + false, + ); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/extra.actions.js b/public/bundles/ibexaadminui/js/scripts/sidebar/extra.actions.js new file mode 100644 index 000000000..d35447bdf --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/extra.actions.js @@ -0,0 +1,80 @@ +(function (global, doc, ibexa) { + const CLASS_HIDDEN = 'ibexa-extra-actions--hidden'; + const CLASS_EXPANDED = 'ibexa-context-menu--expanded'; + const CLASS_PREVENT_SHOW = 'ibexa-extra-actions--prevent-show'; + const btns = [...doc.querySelectorAll('.ibexa-btn--extra-actions')]; + const menu = doc.querySelector('.ibexa-context-menu'); + const backdrop = new ibexa.core.Backdrop(); + const haveHiddenPart = (element) => element.classList.contains(CLASS_HIDDEN) && !element.classList.contains(CLASS_PREVENT_SHOW); + const removeBackdrop = () => { + backdrop.hide(); + doc.body.classList.remove('ibexa-scroll-disabled'); + }; + const closeExtraActions = (actions) => { + actions.classList.add(CLASS_HIDDEN); + + if (menu) { + menu.classList.remove(CLASS_EXPANDED); + } + + doc.body.dispatchEvent(new CustomEvent('ibexa-extra-actions:after-close')); + + removeBackdrop(); + }; + const toggleExtraActionsWidget = (widgetData) => { + const actions = doc.querySelector(`.ibexa-extra-actions[data-actions="${widgetData.actions}"]`); + + if (widgetData.validate && !parseInt(widgetData.isFormValid, 10)) { + return; + } + + const isHidden = haveHiddenPart(actions); + const focusElement = actions.querySelector(widgetData.focusElement); + const detectClickOutside = (event) => { + if (event.target.classList.contains('ibexa-backdrop')) { + closeExtraActions(actions); + doc.body.removeEventListener('click', detectClickOutside, false); + } + }; + + actions.classList.toggle(CLASS_HIDDEN, !isHidden); + + if (menu) { + menu.classList.toggle(CLASS_EXPANDED, isHidden); + } + + if (!actions.classList.contains(CLASS_HIDDEN)) { + backdrop.show(); + doc.body.addEventListener('click', detectClickOutside, false); + doc.body.classList.add('ibexa-scroll-disabled'); + } else { + doc.body.removeEventListener('click', detectClickOutside); + removeBackdrop(); + } + + if (focusElement) { + focusElement.focus(); + } + }; + + btns.forEach((btn) => { + btn.addEventListener( + 'click', + () => { + toggleExtraActionsWidget(btn.dataset); + }, + false, + ); + }); + doc.body.addEventListener('ibexa-extra-actions:toggle-widget', (event) => toggleExtraActionsWidget(event.detail), false); + + doc.querySelectorAll('.ibexa-extra-actions .ibexa-btn--close').forEach((closeBtn) => + closeBtn.addEventListener( + 'click', + (event) => { + closeExtraActions(event.currentTarget.closest('.ibexa-extra-actions')); + }, + false, + ), + ); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/instant.filter.js b/public/bundles/ibexaadminui/js/scripts/sidebar/instant.filter.js new file mode 100644 index 000000000..c0c8bf240 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/instant.filter.js @@ -0,0 +1,54 @@ +(function (global, doc) { + let filterTimeout; + const SELECTOR_ITEM = '.ibexa-instant-filter__group-item'; + const timeout = 200; + const filters = doc.querySelectorAll('.ibexa-instant-filter'); + const toggleGroupDisplay = (group) => { + const areChildrenHidden = [...group.querySelectorAll(SELECTOR_ITEM)].every((item) => item.hasAttribute('hidden')); + + group.toggleAttribute('hidden', areChildrenHidden); + }; + const filterItems = function (itemsMap, groups, event) { + window.clearTimeout(filterTimeout); + + filterTimeout = window.setTimeout(() => { + const query = event.target.value.toLowerCase(); + const results = itemsMap.filter((item) => item.label.includes(query)); + + itemsMap.forEach((item) => item.element.setAttribute('hidden', true)); + results.forEach((item) => item.element.removeAttribute('hidden')); + + groups.forEach(toggleGroupDisplay); + }, timeout); + }; + const initFilter = (filter) => { + const filterInput = filter.querySelector('.ibexa-instant-filter__input'); + const groups = [...filter.querySelectorAll('.ibexa-instant-filter__group')]; + const items = [...filter.querySelectorAll(SELECTOR_ITEM)]; + const itemsMap = items.reduce( + (total, item) => [ + ...total, + { + label: item.textContent.toLowerCase(), + element: item, + }, + ], + [], + ); + + filterInput.addEventListener('change', filterItems.bind(filter, itemsMap, groups), false); + filterInput.addEventListener('blur', filterItems.bind(filter, itemsMap, groups), false); + filterInput.addEventListener('keyup', filterItems.bind(filter, itemsMap, groups), false); + filterInput.addEventListener( + 'keydown', + (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + } + }, + false, + ); + }; + + filters.forEach(initFilter); +})(window, window.document); diff --git a/public/bundles/ibexaadminui/js/scripts/sidebar/main.menu.js b/public/bundles/ibexaadminui/js/scripts/sidebar/main.menu.js new file mode 100644 index 000000000..08e226a5a --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/sidebar/main.menu.js @@ -0,0 +1,200 @@ +(function (global, doc, ibexa) { + const SECOND_LEVEL_COLLAPSED_WIDTH = 48; + const SECOND_LEVEL_EXPANDED_WIDTH = 220; + const SECOND_LEVEL_MANUAL_RESIZE_MIN_WIDTH = 80; + const mainMenuNode = doc.querySelector('.ibexa-main-menu'); + + if (!mainMenuNode) { + return; + } + + const firstLevelMenuNode = mainMenuNode.querySelector('.ibexa-main-menu__navbar--first-level'); + const secondLevelMenuNode = mainMenuNode.querySelector('.ibexa-main-menu__navbar--second-level'); + const showFistLevelPopupButton = firstLevelMenuNode.querySelector('.ibexa-main-menu__item--more'); + const firstLevelPopupMenu = firstLevelMenuNode.querySelector('.ibexa-main-menu__first-level-popup-menu'); + const adaptiveMenuItemsContainer = firstLevelMenuNode.querySelector('.ibexa-adaptive-items'); + const selectorItem = firstLevelMenuNode.querySelector('.ibexa-adaptive-items__item--selector'); + const adaptiveItemsToPopup = firstLevelMenuNode.querySelectorAll('.ibexa-adaptive-items__item'); + const popupItemsToGenerate = [...adaptiveItemsToPopup].map((item) => { + const actionItem = item.querySelector('.ibexa-main-menu__item-action'); + const name = item.dataset.itemName; + const label = item.querySelector('.ibexa-main-menu__item-text-column')?.textContent; + const isActive = actionItem.classList.contains('active'); + + return { + name, + label, + isActive, + }; + }); + let resizeStartPositionX = 0; + let secondMenuLevelCurrentWidth = secondLevelMenuNode.getBoundingClientRect().width; + const collapseSecondLevelMenu = (event) => { + if (event.target.closest('.ibexa-main-menu__navbar') || event.target.closest('.ibexa-tooltip')) { + return; + } + + toggleSecondLevelMenu(); + + doc.removeEventListener('mousemove', collapseSecondLevelMenu); + }; + const showSecondLevelMenu = ({ currentTarget }) => { + if (!currentTarget.dataset.bsToggle) { + return; + } + + firstLevelMenuNode.classList.add('ibexa-main-menu__navbar--collapsed'); + secondLevelMenuNode.classList.remove('ibexa-main-menu__navbar--hidden'); + + currentTarget.blur(); + + if (secondLevelMenuNode.classList.contains('ibexa-main-menu__navbar--collapsed')) { + toggleSecondLevelMenu(); + + doc.addEventListener('mousemove', collapseSecondLevelMenu, false); + } else { + setWidthOfSecondLevelMenu(); + } + }; + const setWidthOfSecondLevelMenu = () => { + const secondLevelMenuWidth = ibexa.helpers.cookies.getCookie('ibexa-aui_menu-secondary-width'); + const isSecondLevelMenuHidden = secondLevelMenuNode.classList.contains('ibexa-main-menu__navbar--hidden'); + + if (!secondLevelMenuWidth || isSecondLevelMenuHidden) { + return; + } + + const secondLevelMenuListWidth = secondLevelMenuWidth; + + secondLevelMenuNode.style.width = `${secondLevelMenuWidth}px`; + secondLevelMenuNode.querySelectorAll('.ibexa-main-menu__tab-pane .ibexa-main-menu__items-list').forEach((itemList) => { + itemList.style.width = `${secondLevelMenuListWidth}px`; + }); + secondLevelMenuNode.classList.toggle( + 'ibexa-main-menu__navbar--collapsed', + secondLevelMenuWidth <= SECOND_LEVEL_MANUAL_RESIZE_MIN_WIDTH, + ); + + doc.body.dispatchEvent(new CustomEvent('ibexa-main-menu-resized')); + }; + const toggleSecondLevelMenu = () => { + const isSecondLevelMenuCollapsed = secondLevelMenuNode.classList.contains('ibexa-main-menu__navbar--collapsed'); + const newMenuWidth = isSecondLevelMenuCollapsed ? SECOND_LEVEL_EXPANDED_WIDTH : SECOND_LEVEL_COLLAPSED_WIDTH; + + ibexa.helpers.cookies.setBackOfficeCookie('ibexa-aui_menu-secondary-width', newMenuWidth); + setWidthOfSecondLevelMenu(); + }; + const parsePopup = (button) => { + const { popupTargetSelector } = button.dataset; + const popupNode = doc.querySelector(popupTargetSelector); + + if (!popupNode) { + return; + } + + new ibexa.core.PopupMenu({ + popupMenuElement: popupNode, + triggerElement: button, + }); + }; + const parseMenuTitles = () => { + ibexa.helpers.tooltips.hideAll(); + + firstLevelMenuNode.querySelectorAll('.ibexa-main-menu__item').forEach((item) => { + const labelNode = item.querySelector('.ibexa-main-menu__item-text-column'); + + if (labelNode) { + const label = labelNode.textContent; + + if (firstLevelMenuNode.classList.contains('ibexa-main-menu__navbar--collapsed')) { + item.setAttribute('title', label); + } + + ibexa.helpers.tooltips.parse(mainMenuNode); + } + }); + }; + const addResizeListeners = ({ clientX }) => { + resizeStartPositionX = clientX; + secondLevelMenuNode.classList.add('ibexa-main-menu__navbar--resizing'); + secondMenuLevelCurrentWidth = secondLevelMenuNode.getBoundingClientRect().width; + + doc.addEventListener('mousemove', triggerSecondLevelChangeWidth, false); + doc.addEventListener('mouseup', removeResizeListeners, false); + }; + const removeResizeListeners = () => { + secondLevelMenuNode.classList.remove('ibexa-main-menu__navbar--resizing'); + doc.removeEventListener('mousemove', triggerSecondLevelChangeWidth, false); + doc.removeEventListener('mouseup', removeResizeListeners, false); + }; + const triggerSecondLevelChangeWidth = ({ clientX }) => { + const resizeValue = secondMenuLevelCurrentWidth + (clientX - resizeStartPositionX); + const newMenuWidth = resizeValue > SECOND_LEVEL_MANUAL_RESIZE_MIN_WIDTH ? resizeValue : SECOND_LEVEL_COLLAPSED_WIDTH; + + ibexa.helpers.cookies.setBackOfficeCookie('ibexa-aui_menu-secondary-width', newMenuWidth); + setWidthOfSecondLevelMenu(); + }; + + parseMenuTitles(); + + firstLevelMenuNode.querySelectorAll('.ibexa-main-menu__item-action').forEach((button) => { + button.addEventListener('click', showSecondLevelMenu, false); + }); + + secondLevelMenuNode.querySelector('.ibexa-main-menu__toggler').addEventListener('click', toggleSecondLevelMenu, false); + secondLevelMenuNode.querySelector('.ibexa-main-menu__resizer').addEventListener('mousedown', addResizeListeners, false); + secondLevelMenuNode.querySelectorAll('.ibexa-main-menu__tooltip-trigger').forEach(parsePopup); + secondLevelMenuNode.addEventListener( + 'transitionend', + (event) => { + if (event.propertyName === 'width') { + doc.body.dispatchEvent(new CustomEvent('ibexa-content-resized')); + } + }, + false, + ); + + if (showFistLevelPopupButton && selectorItem) { + const adaptiveItems = new ibexa.core.AdaptiveItems({ + itemHiddenClass: 'ibexa-context-menu__item--hidden', + container: adaptiveMenuItemsContainer, + isVertical: true, + selectorItem, + getActiveItem: () => {}, + onAdapted: (visibleItems, hiddenItems) => { + const hiddenItemNames = [...hiddenItems].map((item) => item.dataset.itemName); + + popupMenu.toggleItems((popupMenuItem) => !hiddenItemNames.includes(popupMenuItem.dataset.relatedItemName)); + popupMenu.updatePosition(); + }, + }); + const popupMenu = new ibexa.core.PopupMenu({ + popupMenuElement: firstLevelPopupMenu, + triggerElement: showFistLevelPopupButton, + onItemClick: ({ currentTarget }) => { + const { relatedItemName } = currentTarget.dataset; + const relatedItemAction = doc.querySelector(`[data-item-name="${relatedItemName}"] .ibexa-main-menu__item-action`); + + relatedItemAction.click(); + }, + position: () => { + const popupLeftOffset = 5; + const targetTopPosition = selectorItem.offsetTop; + const targetLeftPosition = selectorItem.offsetLeft + selectorItem.offsetWidth + popupLeftOffset; + + firstLevelPopupMenu.style.top = `${targetTopPosition}px`; + firstLevelPopupMenu.style.left = `${targetLeftPosition}px`; + }, + }); + + popupMenu.generateItems(popupItemsToGenerate, (itemElement, item) => { + const itemElementContent = itemElement.querySelector('.ibexa-popup-menu__item-content'); + + itemElement.dataset.relatedItemName = item.name; + itemElementContent.classList.toggle('ibexa-popup-menu__item-content--current', item.isActive); + }); + + popupMenu.updatePosition(); + adaptiveItems.init(); + } +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/toggle.button.state.toggle.js b/public/bundles/ibexaadminui/js/scripts/toggle.button.state.toggle.js new file mode 100644 index 000000000..1a33ef8ea --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/toggle.button.state.toggle.js @@ -0,0 +1,7 @@ +(function (global, doc, eZ) { + doc.querySelectorAll('.ibexa-toggle').forEach((toggleNode) => { + const toggleButton = new eZ.core.ToggleButton({ toggleNode }); + + toggleButton.init(); + }); +})(window, window.document, window.eZ); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/browse.js b/public/bundles/ibexaadminui/js/scripts/udw/browse.js new file mode 100644 index 000000000..d413ba703 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/browse.js @@ -0,0 +1,34 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator, Routing) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-browse'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + global.location.href = Routing.generate('ibexa.content.view', { + contentId: items[0].ContentInfo.Content._id, + locationId: items[0].id, + }); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Browse content")*/ 'browse.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + multiple: false, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator, window.Routing); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/copy.js b/public/bundles/ibexaadminui/js/scripts/udw/copy.js new file mode 100644 index 000000000..79e138e58 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/copy.js @@ -0,0 +1,35 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-copy'); + const form = doc.querySelector('form[name="location_copy"]'); + const input = form.querySelector('#location_copy_new_parent_location'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + input.value = items[0].id; + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Select Location")*/ 'copy.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + multiple: false, + containersOnly: true, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/copy_subtree.js b/public/bundles/ibexaadminui/js/scripts/udw/copy_subtree.js new file mode 100644 index 000000000..1cba73486 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/copy_subtree.js @@ -0,0 +1,35 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-copy-subtree'); + const form = doc.querySelector('form[name="location_copy_subtree"]'); + const input = form.querySelector('#location_copy_subtree_new_parent_location'); + const udwContainer = doc.querySelector('#react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + input.value = items[0].id; + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const title = Translator.trans(/*@Desc("Select Location")*/ 'subtree.title', {}, 'universal_discovery_widget'); + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + multiple: false, + containersOnly: true, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/locations.tab.js b/public/bundles/ibexaadminui/js/scripts/udw/locations.tab.js new file mode 100644 index 000000000..9e8d38bb2 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/locations.tab.js @@ -0,0 +1,42 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-add'); + const submitButton = doc.querySelector('#content_location_add_add'); + const form = doc.querySelector('form[name="content_location_add"]'); + + if (!form) { + return; + } + + const input = form.querySelector('#content_location_add_new_locations'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + input.value = items[0].id; + submitButton.click(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + event.stopPropagation(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Select Location")*/ 'add_location.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + containersOnly: true, + title, + multiple: false, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/move.js b/public/bundles/ibexaadminui/js/scripts/udw/move.js new file mode 100644 index 000000000..fcb8701ac --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/move.js @@ -0,0 +1,40 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-move'); + const form = doc.querySelector('form[name="location_move"]'); + + if (!form) { + return; + } + + const input = form.querySelector('#location_move_new_parent_location'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + input.value = items[0].id; + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Select destination")*/ 'move.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + multiple: false, + containersOnly: true, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/select.location.js b/public/bundles/ibexaadminui/js/scripts/udw/select.location.js new file mode 100644 index 000000000..810bd854a --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/select.location.js @@ -0,0 +1,130 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-select-location'); + const udwContainer = doc.getElementById('react-udw'); + const token = doc.querySelector('meta[name="CSRF-Token"]').content; + const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content; + let udwRoot = null; + const findLocationsByIdList = (idList, callback) => { + const body = JSON.stringify({ + ViewInput: { + identifier: `udw-locations-by-path-string-${idList.join('-')}`, + public: false, + LocationQuery: { + FacetBuilders: {}, + SortClauses: { SectionIdentifier: 'ascending' }, + Filter: { LocationIdCriterion: idList.join(',') }, + limit: 50, + offset: 0, + }, + }, + }); + const request = new Request('/api/ibexa/v2/views', { + method: 'POST', + headers: { + Accept: 'application/vnd.ibexa.api.View+json; version=1.1', + 'Content-Type': 'application/vnd.ibexa.api.ViewInput+json; version=1.1', + 'X-Requested-With': 'XMLHttpRequest', + 'X-Siteaccess': siteaccess, + 'X-CSRF-Token': token, + }, + body, + mode: 'same-origin', + credentials: 'same-origin', + }); + const errorMessage = Translator.trans( + /*@Desc("Cannot find children Locations with ID %idList%")*/ 'select_location.error', + { idList: idList.join(',') }, + 'universal_discovery_widget', + ); + + fetch(request) + .then(ibexa.helpers.request.getJsonFromResponse) + .then(callback) + .catch(() => ibexa.helpers.notification.showErrorNotification(errorMessage)); + }; + const removeRootFromPathString = (pathString) => { + const pathArray = pathString.split('/').filter((val) => val); + + return pathArray.splice(1, pathArray.length - 1); + }; + const buildBreadcrumbsString = (viewData) => { + const searchHitList = viewData.View.Result.searchHits.searchHit; + + return searchHitList.map((searchHit) => searchHit.value.Location.ContentInfo.Content.TranslatedName).join(' / '); + }; + const toggleVisibility = (btn, isLocationSelected) => { + const contentBreadcrumbsWrapper = doc.querySelector(btn.dataset.contentBreadcrumbsSelector); + + btn.hidden = isLocationSelected; + + if (contentBreadcrumbsWrapper) { + contentBreadcrumbsWrapper.hidden = !isLocationSelected; + } + }; + const updateBreadcrumbsState = (btn, pathString) => { + const pathStringInput = doc.querySelector(btn.dataset.locationPathInputSelector); + const contentBreadcrumbsContainer = doc.querySelector(btn.dataset.contentBreadcrumbsSelector); + const contentBreadcrumbs = contentBreadcrumbsContainer.querySelector('.ibexa-tag__content'); + const contentBreadcrumbsSpinner = contentBreadcrumbsContainer.querySelector('.ibexa-tag__spinner'); + + pathStringInput.value = pathString; + pathStringInput.dispatchEvent(new Event('change')); + + if (!contentBreadcrumbs || !contentBreadcrumbsSpinner) { + return; + } + + if (!pathString) { + contentBreadcrumbs.innerHTML = ''; + contentBreadcrumbs.hidden = true; + } else { + contentBreadcrumbsSpinner.hidden = false; + findLocationsByIdList(removeRootFromPathString(pathString), (data) => { + contentBreadcrumbs.innerHTML = buildBreadcrumbsString(data); + contentBreadcrumbsSpinner.hidden = true; + contentBreadcrumbs.hidden = false; + }); + } + }; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (btn, items) => { + closeUDW(); + + const [{ pathString }] = items; + + updateBreadcrumbsState(btn, pathString); + toggleVisibility(btn, !!pathString); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm: onConfirm.bind(null, event.currentTarget), + onCancel, + title: event.currentTarget.dataset.universalDiscoveryTitle, + multiple: false, + ...config, + }), + ); + }; + const clearSelection = (btn) => { + updateBreadcrumbsState(btn, ''); + toggleVisibility(btn, false); + }; + + btns.forEach((btn) => { + btn.addEventListener('click', openUDW, false); + + const tag = doc.querySelector(btn.dataset.contentBreadcrumbsSelector); + const clearBtn = tag.querySelector('.ibexa-tag__remove-btn'); + + if (clearBtn) { + clearBtn.addEventListener('click', clearSelection.bind(null, btn), false); + } + }); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/udw/swap.js b/public/bundles/ibexaadminui/js/scripts/udw/swap.js new file mode 100644 index 000000000..7870294c0 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/udw/swap.js @@ -0,0 +1,39 @@ +(function (global, doc, ibexa, React, ReactDOM, Translator) { + const btns = doc.querySelectorAll('.ibexa-btn--udw-swap'); + const form = doc.querySelector('form[name="location_swap"]'); + + if (!form) { + return; + } + + const input = form.querySelector('#location_swap_new_location'); + const udwContainer = doc.getElementById('react-udw'); + let udwRoot = null; + const closeUDW = () => udwRoot.unmount(); + const onConfirm = (items) => { + closeUDW(); + + input.value = items[0].id; + form.submit(); + }; + const onCancel = () => closeUDW(); + const openUDW = (event) => { + event.preventDefault(); + + const config = JSON.parse(event.currentTarget.dataset.udwConfig); + const title = Translator.trans(/*@Desc("Select Location to swap with")*/ 'swap.title', {}, 'universal_discovery_widget'); + + udwRoot = ReactDOM.createRoot(udwContainer); + udwRoot.render( + React.createElement(ibexa.modules.UniversalDiscovery, { + onConfirm, + onCancel, + title, + multiple: false, + ...config, + }), + ); + }; + + btns.forEach((btn) => btn.addEventListener('click', openUDW, false)); +})(window, window.document, window.ibexa, window.React, window.ReactDOM, window.Translator); diff --git a/public/bundles/ibexaadminui/js/scripts/user.group.invitation.js b/public/bundles/ibexaadminui/js/scripts/user.group.invitation.js new file mode 100644 index 000000000..954974fb8 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/user.group.invitation.js @@ -0,0 +1,64 @@ +import { UserInvitationModal } from './user.invitation.modal'; + +(function (global, doc) { + const modal = doc.querySelector('.ibexa-user-group-invitation'); + + if (!modal) { + return; + } + + class UserGroupInvitationModal extends UserInvitationModal { + processCSVInvitationFile(file) { + return file.text().then((text) => { + const lineRegexp = /^([^;\r\n]+)$/gm; + const matchedData = [...text.matchAll(lineRegexp)]; + const invitationsData = matchedData.map(([email]) => ({ email })); + + return invitationsData; + }); + } + + resetEntry(entry) { + super.resetEntry(entry); + + const emailInput = entry.querySelector('.ibexa-user-group-invitation__entry-email'); + + emailInput.value = null; + } + + isEntryEmpty(entry) { + const emailInput = entry.querySelector('.ibexa-user-group-invitation__entry-email'); + + return !emailInput.value; + } + + addEntry(isFileRelated = false, invitationData = null) { + const addEntryData = super.addEntry(isFileRelated, invitationData); + const { insertedEntry } = addEntryData; + + const email = invitationData?.email ?? null; + const emailInput = insertedEntry.querySelector('.ibexa-user-group-invitation__entry-email'); + + emailInput.value = email; + + return addEntryData; + } + + checkEntryMatchesSearch(entry, searchText) { + const emailInput = entry.querySelector('.ibexa-user-group-invitation__entry-email'); + const email = emailInput.value; + + return email.includes(searchText); + } + + checkIsEntryDuplicate(invitationData, entryToCompare) { + const entryToCompareEmailInput = entryToCompare.querySelector('.ibexa-user-group-invitation__entry-email'); + + return invitationData.email === entryToCompareEmailInput.value; + } + } + + const userInvitationModal = new UserGroupInvitationModal({ modal }); + + userInvitationModal.init(); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/user.invitation.modal.js b/public/bundles/ibexaadminui/js/scripts/user.invitation.modal.js new file mode 100644 index 000000000..6b5297cb1 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/user.invitation.modal.js @@ -0,0 +1,507 @@ +const { ibexa, Translator } = window; + +export class UserInvitationModal { + constructor(options = {}) { + if (!options.modal) { + throw new Error('No valid modal option provided'); + } + + this.modal = options.modal; + this.stickyTopContainer = this.modal.querySelector('.ibexa-user-invitation-modal__sticky-top'); + this.searchInput = this.modal.querySelector('.ibexa-user-invitation-modal__search-input'); + this.searchBtn = this.modal.querySelector('.ibexa-input-text-wrapper__action-btn--search'); + this.searchNoEntries = this.modal.querySelector('.ibexa-user-invitation-modal__search-no-entries'); + this.badFileAlert = this.modal.querySelector('.ibexa-user-invitation-modal__bad-file-alert'); + this.badFileAlertCloseBtn = this.badFileAlert.querySelector('.ibexa-alert__close-btn'); + this.issuesAlert = this.modal.querySelector('.ibexa-user-invitation-modal__issues-alert'); + this.issuesAlertIssuesContainer = this.modal.querySelector('.ibexa-user-invitation-modal__issues-alert-issues'); + this.issuesAlertCloseBtn = this.issuesAlert.querySelector('.ibexa-alert__close-btn'); + this.goToNextIssueBtn = this.issuesAlert.querySelector('.ibexa-user-invitation-modal__next-issue-btn'); + this.addNextBtn = this.modal.querySelector('.ibexa-user-invitation-modal__add-next-btn'); + this.entriesContainer = this.modal.querySelector('.ibexa-user-invitation-modal__entries'); + this.entryPrototype = this.entriesContainer.dataset.prototype; + this.fileUploadMessage = this.modal.querySelector('.ibexa-user-invitation-modal__upload-file-message'); + this.dropZone = this.modal.querySelector('.ibexa-user-invitation-modal__drop'); + this.uploadLocalFileBtn = this.modal.querySelector('.ibexa-user-invitation-modal__file-select'); + this.fileInput = this.modal.querySelector('.ibexa-user-invitation-modal__file-input'); + this.fakeSubmitBtn = this.modal.querySelector('.ibexa-user-invitation-modal__fake-submit-btn'); + this.realSubmitBtn = this.modal.querySelector('.ibexa-user-invitation-modal__real-submit-btn'); + this.lastScrolledToEntryWithIssue = null; + + this.attachEntryListeners = this.attachEntryListeners.bind(this); + this.preventDefaultAction = this.preventDefaultAction.bind(this); + this.handleEntryAdd = this.handleEntryAdd.bind(this); + this.handleEntryDelete = this.handleEntryDelete.bind(this); + this.handleDropUpload = this.handleDropUpload.bind(this); + this.handleInputUpload = this.handleInputUpload.bind(this); + this.handleSearch = this.handleSearch.bind(this); + this.handleEmailValidation = this.handleEmailValidation.bind(this); + this.scrollToNextIssue = this.scrollToNextIssue.bind(this); + } + + // eslint-disable-next-line no-unused-vars + processCSVInvitationFile(file) { + throw new Error('processCSVInvitationFile should be overridden in subclass.'); + } + + countFilledLinesInFile(file) { + return file.text().then((text) => { + const nonEmptyLineRegexp = /^([^\r\n]+)$/gm; + const matchedData = [...text.matchAll(nonEmptyLineRegexp)]; + + return matchedData.length; + }); + } + + resetEntry(entry) { + this.toggleInvalidEmailState(entry, { isEmptyError: false, isInvalidFormatError: false }); + this.toggleDuplicateEntryState(entry, false); + } + + // eslint-disable-next-line no-unused-vars + isEntryEmpty(entry) { + throw new Error('isEntryEmpty should be overridden in subclass.'); + } + + // eslint-disable-next-line no-unused-vars + checkEntryMatchesSearch(entry, searchText) { + throw new Error('checkEntryMatchesSearch should be overridden in subclass.'); + } + + // eslint-disable-next-line no-unused-vars + checkIsEntryDuplicate(invitationData, entryToCompare) { + throw new Error('checkIsEntryDuplicate should be overridden in subclass.'); + } + + checkHasEntryIssue(entry) { + const hasEmptyEmailIssue = !!entry.querySelector('.ibexa-user-invitation-modal__issue-email-empty'); + const hasInvalidEmailIssue = !!entry.querySelector('.ibexa-user-invitation-modal__issue-email-invalid-format'); + const hasDuplicateIssue = !!entry.querySelector('.ibexa-user-invitation-modal__issue-duplicate'); + + return hasEmptyEmailIssue || hasInvalidEmailIssue || hasDuplicateIssue; + } + + findDuplicateEntry(invitationData, entriesToCompare) { + for (const entryToCompare of entriesToCompare) { + if (this.checkIsEntryDuplicate(invitationData, entryToCompare)) { + return entryToCompare; + } + } + + return null; + } + + toggleIssueNode(entry, issueNode, show, position, template) { + const entryIssuesContainer = entry.querySelector('.ibexa-user-invitation-modal__entry-issues'); + + if (show) { + if (!issueNode) { + entryIssuesContainer.insertAdjacentHTML(position, template); + } + } else { + if (issueNode) { + issueNode.remove(); + } + } + } + + toggleDuplicateEntryState(entry, isDuplicate) { + const duplicateEntryIssueNode = entry.querySelector('.ibexa-user-invitation-modal__issue-duplicate'); + const { issueDuplicateInfoTemplate } = this.entriesContainer.dataset; + + this.toggleIssueNode(entry, duplicateEntryIssueNode, isDuplicate, 'beforeend', issueDuplicateInfoTemplate); + } + + toggleInvalidEmailState(entry, { isEmptyError, isInvalidFormatError }) { + const emptyEmailIssueNode = entry.querySelector('.ibexa-user-invitation-modal__issue-email-empty'); + const invalidEmailIssueNode = entry.querySelector('.ibexa-user-invitation-modal__issue-email-invalid-format'); + const { issueInvalidEmailTemplate, issueEmptyEmailTemplate } = this.entriesContainer.dataset; + const emailInput = entry.querySelector('.ibexa-user-invitation-modal__email-wrapper .ibexa-input--text'); + + emailInput.classList.toggle('is-invalid', isEmptyError || isInvalidFormatError); + + this.toggleIssueNode(entry, emptyEmailIssueNode, isEmptyError, 'afterbegin', issueEmptyEmailTemplate); + this.toggleIssueNode(entry, invalidEmailIssueNode, isInvalidFormatError, 'afterbegin', issueInvalidEmailTemplate); + } + + validateEmail(emailInput) { + const isEmpty = !emailInput.value.trim(); + + if (isEmpty) { + return { isEmptyError: isEmpty, isInvalidFormatError: false }; + } + + const isValid = ibexa.errors.emailRegexp.test(emailInput.value); + + return { isEmptyError: false, isInvalidFormatError: !isValid }; + } + + validateEntryEmail(entry) { + const emailInput = entry.querySelector('.ibexa-user-invitation-modal__email-wrapper .ibexa-input--text'); + const errors = this.validateEmail(emailInput); + + this.toggleInvalidEmailState(entry, errors); + this.manageIssuesAlert(); + + return errors.isEmptyError || errors.isInvalidFormatError; + } + + handleEmailValidation(event) { + const emailInput = event.currentTarget; + const entry = emailInput.closest('.ibexa-user-invitation-modal__entry'); + + this.validateEntryEmail(entry); + } + + prepareIssuesAlert(emptyEmailsCount, invalidEmailsCount, duplicateEntryCount) { + const messages = []; + + if (emptyEmailsCount) { + const emptyEmailsMessage = Translator.trans( + /*@Desc("Empty emails (%count%)")*/ 'modal.entry_issues.alert.empty_emails', + { count: emptyEmailsCount }, + 'user_invitation', + ); + + messages.push(emptyEmailsMessage); + } + + if (invalidEmailsCount) { + const invalidEmailsMessage = Translator.trans( + /*@Desc("Invalid emails (%count%)")*/ 'modal.entry_issues.alert.invalid_emails', + { count: invalidEmailsCount }, + 'user_invitation', + ); + + messages.push(invalidEmailsMessage); + } + + if (duplicateEntryCount) { + const duplicatedEmailsMessage = Translator.trans( + /*@Desc("Duplicated emails (%count%)")*/ 'modal.entry_issues.alert.duplicate_emails', + { count: duplicateEntryCount }, + 'user_invitation', + ); + + messages.push(duplicatedEmailsMessage); + } + + this.issuesAlertIssuesContainer.innerText = messages.join(' | '); + } + + manageIssuesAlert() { + const emptyEmailsCount = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__issue-email-empty').length; + const invalidEmailsCount = this.entriesContainer.querySelectorAll( + '.ibexa-user-invitation-modal__issue-email-invalid-format', + ).length; + const duplicateEntryCount = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__issue-duplicate').length; + const isAnyIssue = emptyEmailsCount || invalidEmailsCount || duplicateEntryCount; + + if (isAnyIssue) { + this.prepareIssuesAlert(emptyEmailsCount, invalidEmailsCount, duplicateEntryCount); + } + + this.toggleIssuesAlert(isAnyIssue); + } + + toggleIssuesAlert(show) { + this.issuesAlert.classList.toggle('ibexa-user-invitation-modal__issues-alert--hidden', !show); + } + + toggleBadFileAlert(show) { + this.badFileAlert.classList.toggle('ibexa-user-invitation-modal__bad-file-alert--hidden', !show); + } + + // eslint-disable-next-line no-unused-vars + addEntry(isFileRelated = false, invitationData = null) { + const entryPrototypeRendered = this.entryPrototype.replaceAll('__name__', this.entryCounter); + + this.entryCounter = this.entryCounter + 1; + this.entriesContainer.insertAdjacentHTML('beforeend', entryPrototypeRendered); + + const insertedEntry = this.entriesContainer.querySelector(':scope > :last-child'); + + if (isFileRelated) { + insertedEntry.classList.add('ibexa-user-invitation-modal__entry--file-related'); + } + + this.attachEntryListeners(insertedEntry); + document.body.dispatchEvent(new CustomEvent('ibexa-inputs:added')); + + return { insertedEntry }; + } + + deleteEntry(entry, isForceRemove = false) { + const entryNodes = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry'); + const isLastEntry = entryNodes.length === 1; + + if (isLastEntry && !isForceRemove) { + this.resetEntry(entry); + } else { + if (entry === this.lastScrolledToEntryWithIssue) { + this.lastScrolledToEntryWithIssue = this.lastScrolledToEntryWithIssue.previousElementSibling; + } + + entry.remove(); + } + } + + deleteTrailingEntriesIfEmpty() { + const lastEntry = this.entriesContainer.querySelector(':scope > :last-child'); + + if (!lastEntry) { + return; + } + + if (this.isEntryEmpty(lastEntry)) { + this.deleteEntry(lastEntry, true); + this.deleteTrailingEntriesIfEmpty(); + this.manageIssuesAlert(); + this.updateModalTitle(); + } + } + + handleEntryAdd() { + this.addEntry(); + this.manageIssuesAlert(); + this.updateModalTitle(); + } + + handleEntryDelete(event) { + const deleteBtn = event.currentTarget; + const entry = deleteBtn.closest('.ibexa-user-invitation-modal__entry'); + + this.deleteEntry(entry); + this.manageIssuesAlert(); + this.updateModalTitle(); + } + + attachEntryListeners(entry) { + const deleteEntryBtn = entry.querySelector('.ibexa-user-invitation-modal__entry-delete-btn'); + const emailInput = entry.querySelector('.ibexa-user-invitation-modal__email-wrapper .ibexa-input--text'); + + deleteEntryBtn.addEventListener('click', this.handleEntryDelete, false); + emailInput.addEventListener('blur', this.handleEmailValidation, false); + } + + getNextEntryWithIssue() { + const entries = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry'); + const firstEntryWithIssue = [...entries].find(this.checkHasEntryIssue); + + if (!firstEntryWithIssue) { + return; + } + + let nextEntryWithIssue = null; + + if (!this.lastScrolledToEntryWithIssue) { + nextEntryWithIssue = firstEntryWithIssue; + } else { + let currentlyCheckedEntry = this.lastScrolledToEntryWithIssue; + + while (currentlyCheckedEntry.nextElementSibling) { + currentlyCheckedEntry = currentlyCheckedEntry.nextElementSibling; + + if (this.checkHasEntryIssue(currentlyCheckedEntry)) { + nextEntryWithIssue = currentlyCheckedEntry; + break; + } + } + + if (!nextEntryWithIssue) { + nextEntryWithIssue = firstEntryWithIssue; + } + } + + return nextEntryWithIssue; + } + + scrollToNextIssue() { + const nextEntryWithIssue = this.getNextEntryWithIssue(); + const scrollTopOffset = this.stickyTopContainer.offsetHeight; + const entryScrollPosition = nextEntryWithIssue.getBoundingClientRect().top + window.pageYOffset - scrollTopOffset; + + this.modal.scrollTo({ top: entryScrollPosition, behavior: 'smooth' }); + this.lastScrolledToEntryWithIssue = nextEntryWithIssue; + } + + searchEntries(searchText) { + const entries = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry'); + + entries.forEach((entry) => { + const doesEntryMatchSearch = this.checkEntryMatchesSearch(entry, searchText); + + entry.classList.toggle('ibexa-user-invitation-modal__entry--not-matching-search', !doesEntryMatchSearch); + }); + } + + toggleSearchNoEntriesBasedOnSearch() { + const isAnyEntryShowed = !!this.modal.querySelectorAll( + '.ibexa-user-invitation-modal__entry:not(.ibexa-user-invitation-modal__entry--not-matching-search)', + ).length; + + this.searchNoEntries.classList.toggle('ibexa-user-invitation-modal__search-no-entries--hidden', isAnyEntryShowed); + } + + toggleUpload(isForceHide) { + this.fileUploadMessage.classList.toggle('ibexa-user-invitation-modal__upload-file-message--hidden', isForceHide); + this.dropZone.classList.toggle('ibexa-user-invitation-modal__drop--hidden', isForceHide); + } + + showUploadedFileNotification(fileName) { + const message = Translator.trans( + /*@Desc("File %fileName% was uploaded")*/ 'modal.file_uploaded.message', + { fileName }, + 'user_invitation', + ); + + ibexa.helpers.notification.showInfoNotification(message); + } + + clearForm() { + const entries = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry'); + + entries.forEach((entry) => this.deleteEntry(entry)); + this.manageIssuesAlert(); + this.updateModalTitle(); + this.toggleUpload(false); + } + + preventDefaultAction(event) { + event.preventDefault(); + event.stopPropagation(); + } + + async handleInvitationFile(file) { + this.toggleUpload(true); + this.showUploadedFileNotification(file.name); + + const numberOfNonEmptyLines = await this.countFilledLinesInFile(file); + const invitationsData = await this.processCSVInvitationFile(file); + + if (numberOfNonEmptyLines === 0 || numberOfNonEmptyLines !== invitationsData.length) { + this.toggleBadFileAlert(true); + this.toggleUpload(false); + + return; + } + + this.toggleBadFileAlert(false); + this.deleteTrailingEntriesIfEmpty(); + + const entriesBeforeFileAdded = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry'); + + invitationsData.forEach((invitationData) => { + const duplicateEntry = this.findDuplicateEntry(invitationData, entriesBeforeFileAdded); + + if (duplicateEntry) { + this.toggleDuplicateEntryState(duplicateEntry, true); + this.manageIssuesAlert(); + } else { + const { insertedEntry } = this.addEntry(true, invitationData); + + this.validateEntryEmail(insertedEntry); + } + }); + this.updateModalTitle(); + } + + handleInputUpload(event) { + this.preventDefaultAction(event); + + const file = this.fileInput.files[0]; + + if (file) { + this.handleInvitationFile(file); + } + } + + handleDropUpload(event) { + this.preventDefaultAction(event); + + const file = event.dataTransfer.files[0]; + + if (file) { + this.handleInvitationFile(file); + } + } + + handleSearch() { + this.searchEntries(this.searchInput.value); + this.toggleSearchNoEntriesBasedOnSearch(); + } + + updateModalTitle() { + const titleNode = this.modal.querySelector('.modal-title'); + const invitationsCount = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry').length; + + titleNode.innerText = Translator.trans( + /*@Desc("Invite members (%invitations_count%)")*/ 'modal.title', + { invitations_count: invitationsCount }, + 'user_invitation', + ); + } + + init() { + this.initialEntries = this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry'); + this.entryCounter = this.initialEntries.length; + + this.initialEntries.forEach((initialEntry) => { + this.attachEntryListeners(initialEntry); + + const emailInput = initialEntry.querySelector('.ibexa-user-invitation-modal__email-wrapper .ibexa-input--text'); + const isEmailEmpty = !emailInput.value; + + if (!isEmailEmpty) { + this.validateEntryEmail(initialEntry); + } + }); + + this.modal.addEventListener('shown.bs.modal', () => { + window.addEventListener('drop', this.preventDefaultAction, false); + window.addEventListener('dragover', this.preventDefaultAction, false); + }); + + this.modal.addEventListener('hidden.bs.modal', () => { + window.removeEventListener('drop', this.preventDefaultAction, false); + window.removeEventListener('dragover', this.preventDefaultAction, false); + this.clearForm(); + }); + + this.addNextBtn.addEventListener('click', this.handleEntryAdd, false); + + this.dropZone.addEventListener('drop', this.handleDropUpload, false); + this.uploadLocalFileBtn.addEventListener( + 'click', + (event) => { + event.preventDefault(); + this.fileInput.value = ''; + this.fileInput.click(); + }, + false, + ); + this.fileInput.addEventListener('change', this.handleInputUpload, false); + + this.badFileAlertCloseBtn.addEventListener('click', () => this.toggleBadFileAlert(false), false); + this.issuesAlertCloseBtn.addEventListener('click', () => this.toggleIssuesAlert(false), false); + this.goToNextIssueBtn.addEventListener('click', this.scrollToNextIssue, false); + + this.searchInput.addEventListener('keyup', this.handleSearch, false); + this.searchBtn.addEventListener('keyup', this.handleSearch, false); + + this.fakeSubmitBtn.addEventListener( + 'click', + () => { + const allEntries = [...this.entriesContainer.querySelectorAll('.ibexa-user-invitation-modal__entry')]; + const isFormValid = allEntries.map((entry) => this.validateEntryEmail(entry)).every((isError) => !isError); + + if (isFormValid) { + this.realSubmitBtn.click(); + } + }, + false, + ); + + this.updateModalTitle(); + } +} diff --git a/public/bundles/ibexaadminui/js/scripts/user_password.change.js b/public/bundles/ibexaadminui/js/scripts/user_password.change.js new file mode 100644 index 000000000..e917a625e --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/user_password.change.js @@ -0,0 +1,114 @@ +(function (global, doc, ibexa) { + const form = doc.querySelector('form[name="user_password_change"]'); + const submitBtns = form.querySelectorAll('[type="submit"]:not([formnovalidate])'); + const oldPasswordInput = form.querySelector('#user_password_change_oldPassword'); + const newPasswordInput = form.querySelector('#user_password_change_newPassword_first'); + const confirmPasswordInput = form.querySelector('#user_password_change_newPassword_second'); + const SELECTOR_FIELD = '.ibexa-field'; + const SELECTOR_LABEL = '.ibexa-field__label'; + const CLASS_INVALID = 'is-invalid'; + + /** + * Creates an error node + * + * @method createErrorNode + * @param {String} message + * @returns {HTMLElement} + */ + const createErrorNode = (message) => { + return ibexa.helpers.formValidation.formatErrorLine(message); + }; + + /** + * Toggles the error + * + * @method toggleError + * @param {Boolean} isError + * @param {String} message + * @param {HTMLElement} target + */ + const toggleError = (isError, message, target) => { + const methodName = isError ? 'add' : 'remove'; + const field = target.closest(SELECTOR_FIELD); + const errorsWrapper = field.querySelector('.ibexa-form-error'); + const errorNodes = errorsWrapper.querySelectorAll('.ibexa-form-error__row'); + + field.classList[methodName](CLASS_INVALID); + target.classList[methodName](CLASS_INVALID); + + errorNodes.forEach((el) => el.remove()); + + if (isError) { + errorsWrapper.append(createErrorNode(message)); + } + }; + + /** + * Compares passwords + * + * @method comparePasswords + * @return {Boolean} + */ + const comparePasswords = () => { + const newPassword = newPasswordInput.value.trim(); + const confirmPassword = confirmPasswordInput.value.trim(); + const isNotEmptyPassword = checkIsNotEmpty(newPasswordInput) && checkIsNotEmpty(confirmPasswordInput); + const passwordMatch = newPassword === confirmPassword; + const areBothPasswordsFilled = newPassword !== '' && confirmPassword !== ''; + const message = ibexa.errors.notSamePasswords; + + if (!passwordMatch && areBothPasswordsFilled) { + toggleError(!passwordMatch, message, confirmPasswordInput); + } + + return passwordMatch && isNotEmptyPassword; + }; + + /** + * Checks if input has not empty value + * + * @method checkIsNotEmpty + * @param {HTMLElement} target + * @return {Boolean} + */ + const checkIsNotEmpty = (target) => { + const isRequired = target.required; + const isEmpty = !target.value.trim(); + const isError = isRequired && isEmpty; + const fieldContainer = target.closest(SELECTOR_FIELD); + const message = ibexa.errors.emptyField.replace('{fieldName}', fieldContainer.querySelector(SELECTOR_LABEL).innerHTML); + + toggleError(isError, message, target); + + return !isError; + }; + + form.setAttribute('novalidate', true); + + submitBtns.forEach((btn) => { + const clickHandler = (event) => { + if (!parseInt(btn.dataset.isFormValid, 10)) { + event.preventDefault(); + + const requiredFields = [...form.querySelectorAll('.ibexa-field input[required]')]; + const isFormValid = requiredFields.map(checkIsNotEmpty).every((result) => result) && comparePasswords(); + + if (isFormValid) { + btn.dataset.isFormValid = 1; + // for some reason trying to fire click event inside the event handler flow is impossible + // the following line breaks the flow so it's possible to fire click event on a button again. + global.setTimeout(() => btn.click(), 0); + } + } + }; + + btn.dataset.isFormValid = 0; + btn.addEventListener('click', clickHandler, false); + }); + + oldPasswordInput.addEventListener('blur', (event) => checkIsNotEmpty(event.currentTarget), false); + newPasswordInput.addEventListener('blur', (event) => checkIsNotEmpty(event.currentTarget), false); + confirmPasswordInput.addEventListener('blur', (event) => checkIsNotEmpty(event.currentTarget), false); + newPasswordInput.addEventListener('blur', comparePasswords, false); + confirmPasswordInput.addEventListener('blur', comparePasswords, false); +})(window, window.document, window.ibexa); diff --git a/public/bundles/ibexaadminui/js/scripts/widgets/flatpickr.js b/public/bundles/ibexaadminui/js/scripts/widgets/flatpickr.js new file mode 100644 index 000000000..f8b066a56 --- /dev/null +++ b/public/bundles/ibexaadminui/js/scripts/widgets/flatpickr.js @@ -0,0 +1,8 @@ +import flatpickrLanguages from '@ibexa-admin-ui-assets/src/bundle/Resources/public/vendors/flatpickr/dist/l10n'; + +(function (global, doc, ibexa, flatpickr) { + const { backOfficeLanguage } = ibexa.adminUiConfig; + const flatpickrLanguage = flatpickrLanguages[backOfficeLanguage] ?? flatpickrLanguages.default; + + flatpickr.localize(flatpickrLanguage); +})(window, window.document, window.ibexa, window.flatpickr); diff --git a/public/bundles/ibexaadminui/scss/_adaptive-filters.scss b/public/bundles/ibexaadminui/scss/_adaptive-filters.scss new file mode 100644 index 000000000..816f5ecdc --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_adaptive-filters.scss @@ -0,0 +1,186 @@ +.ibexa-adaptive-filters { + display: flex; + flex-direction: column; + padding: calculateRem(4px) calculateRem(16px) 0 calculateRem(16px); + border-radius: $ibexa-border-radius; + border: calculateRem(1px) solid $ibexa-color-light; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + &--no-labels { + padding-top: calculateRem(16px); + + .ibexa-adaptive-filters { + &__items { + height: 0; + } + } + } + + &--no-collapsible-items { + .ibexa-adaptive-filters { + &__static-left { + width: calculateRem(450px); + border-right-width: 0; + } + } + } + + &--inside-container { + margin: calculateRem(-33px) calculateRem(-33px) calculateRem(24px) calculateRem(-33px); + } + + &--inside-tabs { + margin: calculateRem(-11px) calculateRem(-25px) 0 calculateRem(-25px); + border-top: 0; + border-radius: 0 0 $ibexa-border-radius $ibexa-border-radius; + } + + &__visible { + display: flex; + align-items: flex-end; + width: 100%; + margin-bottom: calculateRem(16px); + } + + &__static-left { + flex-grow: 0; + display: flex; + align-items: flex-end; + height: calculateRem(48px); + width: calculateRem(300px); + padding-right: calculateRem(16px); + margin-right: calculateRem(16px); + border-right: calculateRem(1px) solid $ibexa-color-light; + + .form-group { + width: 100%; + } + } + + &__actions { + display: flex; + align-items: flex-end; + } + + &__toggler-wrapper { + display: flex; + flex-direction: column; + align-items: flex-end; + margin-left: auto; + padding: calculateRem(8px) calculateRem(2px) calculateRem(8px); + border-left: calculateRem(1px) solid $ibexa-color-light; + + &.ibexa-adaptive-filters__item--hidden { + display: none; + } + } + + &__items { + flex-grow: 2; + display: flex; + align-items: flex-end; + height: calculateRem(79px); + overflow: hidden; + + &--after-initialization { + overflow: visible; + } + } + + &__collapsible { + border-top: calculateRem(1px) solid $ibexa-color-light; + transition: none; + + &--collapsed { + border-top-color: transparent; + } + } + + &__collapsible-content { + display: flex; + flex-wrap: wrap; + padding: calculateRem(8px) 0 calculateRem(16px); + opacity: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &--collapsed { + opacity: 0; + } + } + + &__item { + display: flex; + align-items: flex-end; + padding-right: calculateRem(16px); + + .ibexa-label { + margin-top: 0; + } + } + + &__submit-btn { + &:last-child { + margin-right: calculateRem(16px); + } + } + + &__toggler { + font-weight: bold; + opacity: 1; + + .ibexa-icon { + transform: rotate(-90deg); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + .ibexa-btn { + &__label { + &--more { + display: none; + } + } + } + + &.ibexa-adaptive-filters__item--hidden { + opacity: 0; + } + + &--collapsed { + .ibexa-icon { + transform: rotate(90deg); + } + + .ibexa-btn { + &__label { + &--less { + display: none; + } + + &--more { + display: initial; + } + } + } + } + + &--fake.ibexa-btn.ibexa-btn { + height: 0; + padding-top: 0; + padding-bottom: 0; + overflow: hidden; + pointer-events: none; + } + } + + &--initialized { + .ibexa-adaptive-filters { + &__items { + overflow: visible; + } + + &__collapsible { + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_add-to-bookmarks.scss b/public/bundles/ibexaadminui/scss/_add-to-bookmarks.scss new file mode 100644 index 000000000..249cfe06e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_add-to-bookmarks.scss @@ -0,0 +1,26 @@ +.ibexa-add-to-bookmarks { + position: relative; + width: calculateRem(36px); + height: calculateRem(36px); + margin-top: calculateRem(-4px); + + &__icon-wrapper { + &--add, + &--remove { + position: absolute; + z-index: 2; + top: 0; + left: 0; + width: calculateRem(36px); + height: calculateRem(36px); + padding: calculateRem(5px); + transition: $ibexa-admin-widget-open-transition; + } + } + + &--checked .ibexa-add-to-bookmarks__icon-wrapper--add, + &:not(.ibexa-add-to-bookmarks--checked) .ibexa-add-to-bookmarks__icon-wrapper--remove { + opacity: 0; + transform: scale(0); + } +} diff --git a/public/bundles/ibexaadminui/scss/_add-translation.scss b/public/bundles/ibexaadminui/scss/_add-translation.scss new file mode 100644 index 000000000..dd2f4b48c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_add-translation.scss @@ -0,0 +1,27 @@ +.ibexa-translation { + .modal-dialog { + max-width: calculateRem(790px); + } + + .modal-body { + display: flex; + padding-bottom: calculateRem(140px); + + .ibexa-label { + margin-top: 0; + } + } + + .form-group { + width: calculateRem(330px); + } + + &__arrow { + margin-top: calculateRem(32px); + height: calculateRem(48px); + transform: rotate(180deg); + display: flex; + align-items: center; + padding: 0 calculateRem(16px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_admin.section-view.scss b/public/bundles/ibexaadminui/scss/_admin.section-view.scss new file mode 100644 index 000000000..5d13c385e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_admin.section-view.scss @@ -0,0 +1,11 @@ +.ibexa-section-view { + .ibexa-details { + margin-bottom: calculateRem(42px); + } + + [name='section_content_assign'] { + .form-group { + margin-bottom: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_alerts.scss b/public/bundles/ibexaadminui/scss/_alerts.scss new file mode 100644 index 000000000..dfb259aaa --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_alerts.scss @@ -0,0 +1,202 @@ +.ibexa-alert { + display: grid; + grid-template: 'icon content actions close-btn'; + grid-template-columns: calculateRem(32px) 1fr auto calculateRem(32px); + grid-column-gap: calculateRem(8px); + padding: calculateRem(16px) calculateRem(19px); + border-radius: 0 $ibexa-border-radius $ibexa-border-radius 0; + border-width: 0 0 0 calculateRem(3px); + border-left-style: solid; + + &--no-close-btn { + grid-template: 'icon content actions'; + grid-template-columns: calculateRem(32px) 1fr auto; + } + + &__icon-wrapper { + grid-area: icon; + align-items: center; + display: flex; + } + + &__close-btn { + grid-area: close-btn; + fill: inherit; + width: calculateRem(28px); + height: calculateRem(28px); + margin-left: calculateRem(17px); + margin-top: calculateRem(-6px); + } + + &__actions { + grid-area: actions; + } + + &__content { + grid-area: content; + display: flex; + flex-wrap: wrap; + align-items: baseline; + + &--subtitle-below { + flex-direction: column; + flex-wrap: nowrap; + } + } + + &__title { + grid-area: title; + font-size: calculateRem(14px); + font-weight: 600; + margin-right: calculateRem(8px); + white-space: pre-line; + } + + &__subtitle { + font-size: calculateRem(12px); + } + + &__title, + &__subtitle { + word-break: break-word; + } + + &__extra_content { + width: 100%; + } + + &--info { + color: $ibexa-color-info; + background-color: $ibexa-color-info-100; + border-color: $ibexa-color-info-300 $ibexa-color-info-300 $ibexa-color-info-300 $ibexa-color-info; + + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &--error { + color: $ibexa-color-danger; + background-color: $ibexa-color-danger-100; + border-color: $ibexa-color-danger-300 $ibexa-color-danger-300 $ibexa-color-danger-300 $ibexa-color-danger; + + .ibexa-icon { + fill: $ibexa-color-danger; + } + } + + &--warning { + color: $ibexa-color-accent-600; + background-color: $ibexa-color-accent-100; + border-color: $ibexa-color-accent-300 $ibexa-color-accent-300 $ibexa-color-accent-300 $ibexa-color-accent; + + .ibexa-icon { + fill: $ibexa-color-accent; + } + } + + &--success { + color: $ibexa-color-success-600; + background-color: $ibexa-color-success-100; + border-color: $ibexa-color-success-300 $ibexa-color-success-300 $ibexa-color-success-300 $ibexa-color-success; + + .ibexa-icon { + fill: $ibexa-color-success; + } + } + + &--toast { + padding: calculateRem(12px); + + &.ibexa-alert { + border-radius: $ibexa-border-radius; + + &--info { + border: calculateRem(1px) solid $ibexa-color-info; + + .ibexa-alert { + &__icon-wrapper { + border-radius: 50%; + background: $ibexa-color-info; + } + } + } + + &--error { + border: calculateRem(1px) solid $ibexa-color-danger; + + .ibexa-alert { + &__icon-wrapper { + border-radius: $ibexa-border-radius-small; + background: $ibexa-color-danger; + transform: rotate(45deg); + + .ibexa-icon { + transform: rotate(-45deg); + } + } + } + } + + &--warning { + border: calculateRem(1px) solid $ibexa-color-accent; + + .ibexa-alert { + &__icon-wrapper { + position: relative; + + &:before { + display: inline-block; + margin-left: calculateRem(3px); + border: solid calculateRem(15px) transparent; + border-top-width: 0; + border-bottom-width: calculateRem(25px); + border-bottom-color: $ibexa-color-accent; + clip-path: circle(54% at 50% 69%); + vertical-align: bottom; + content: ''; + } + + .ibexa-icon { + position: absolute; + top: calculateRem(9px); + left: calculateRem(8px); + } + } + } + } + + &--success { + border: calculateRem(1px) solid $ibexa-color-success; + + .ibexa-alert { + &__icon-wrapper { + border-radius: $ibexa-border-radius-small; + background: $ibexa-color-success; + } + } + } + } + + .ibexa-alert { + &__icon-wrapper { + width: calculateRem(24px); + height: calculateRem(24px); + justify-content: center; + align-items: center; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + + &__close-btn { + margin: 0; + } + + &__content { + margin-top: calculateRem(4px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_anchor-navigation.scss b/public/bundles/ibexaadminui/scss/_anchor-navigation.scss new file mode 100644 index 000000000..9d72a8eb0 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_anchor-navigation.scss @@ -0,0 +1,190 @@ +.ibexa-anchor-navigation { + $self: &; + + &__section-group { + display: none; + + &--active { + display: block; + } + + .ibexa-edit-content__container:first-of-type { + .ibexa-content-type-edit__section-column-header { + margin-top: 0; + } + } + } + + &__section-header { + padding-top: calculateRem(64px); + margin-top: calculateRem(64px); + border-top: calculateRem(1px) solid $ibexa-color-light; + } + + &__section-help { + color: $ibexa-color-dark-400; + } + + &__sections { + .card { + position: unset; + } + } + + &__section:first-of-type { + .ibexa-field-edit:first-of-type { + .ibexa-label { + margin-top: 0; + } + } + + #{$self}__section-header { + padding-top: calculateRem(16px); + margin-top: 0; + border-top: 0; + } + } +} + +.ibexa-anchor-navigation-menu { + &__header { + height: calculateRem(87px); + padding: calculateRem(20px) 0 0 calculateRem(17px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &__body { + height: calc(100% - #{calculateRem(87px)}); + overflow: auto; + padding: calculateRem(25px); + font-size: $ibexa-text-font-size-medium; + } + + &__close { + font-weight: 600; + } + + &__section-groups { + min-width: calculateRem(280px); + max-width: calculateRem(420px); + width: calc(25vw - #{calculateRem(50px)}); + height: calculateRem(48px); + + &--list { + padding: calculateRem(4px); + border-radius: $ibexa-border-radius; + background-color: $ibexa-color-light-300; + display: flex; + } + } + + &__section-groups-item { + height: calculateRem(40px); + padding: calculateRem(10px); + border-radius: $ibexa-border-radius; + border: 0; + flex-basis: 100%; + text-align: center; + overflow: hidden; + + &--active { + background-color: $ibexa-color-white; + font-weight: 600; + } + } + + &__sections { + min-width: calculateRem(240px); + list-style: none; + display: none; + padding-left: 0; + + &:not(:first-child) { + margin: calculateRem(24px) 0 0; + padding: calculateRem(24px) 0 0; + border-top: calculateRem(1px) solid $ibexa-color-light; + } + + &--active { + display: block; + } + } + + &__sections-item-btn { + display: inline-flex; + width: 100%; + padding: calculateRem(11px) calculateRem(15px); + border: calculateRem(1px) solid transparent; + border-radius: $ibexa-border-radius; + text-align: left; + + &::before { + content: ''; + display: block; + width: calculateRem(8px); + height: calculateRem(8px); + margin: calculateRem(8px) calculateRem(16px) 0 0; + border-radius: 50%; + background-color: $ibexa-color-light; + } + + &::after { + content: '*'; + width: calculateRem(16px); + display: inline-block; + opacity: 0; + margin: calculateRem(4px) 0 0 calculateRem(4px); + color: $ibexa-color-danger; + font-size: $ibexa-text-font-size-small; + } + + &:hover { + color: $ibexa-color-info; + font-weight: 600; + + &::before { + background-color: $ibexa-color-info; + } + } + + &--active { + color: $ibexa-color-info; + background: $ibexa-color-info-100; + font-weight: 600; + + &::before { + background-color: $ibexa-color-info; + } + } + + &--invalid { + &::after { + opacity: 1; + } + } + } + + &__sections-item-label { + max-width: calc(100% - #{calculateRem(45px)}); + } + + &__item-label { + text-overflow: ellipsis; + overflow: hidden; + } + + &__item-error { + margin-top: calculateRem(-3px); + fill: $ibexa-color-danger; + + &--hidden { + display: none; + } + } + + &__error { + &--hidden { + display: none; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_animations.scss b/public/bundles/ibexaadminui/scss/_animations.scss new file mode 100644 index 000000000..e721ec54b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_animations.scss @@ -0,0 +1,37 @@ +@keyframes background-to-transparent { + 0% { + transform: scale(1); + box-shadow: none; + background-color: $ibexa-color-white; + } + 25% { + box-shadow: inset 10px 10px 10px 4px rgba(237, 237, 237, 0.1), inset -10px -10px 10px 4px rgba(237, 237, 237, 0.1), + inset 10px -10px 10px 4px rgba(237, 237, 237, 0.1), inset -10px 10px 10px 4px rgba(237, 237, 237, 0.1); + } + 50% { + transform: scale(0.75); + box-shadow: none; + } + 100% { + transform: scale(1); + box-shadow: none; + background-color: transparent; + } +} + +@keyframes background-to-white { + 0% { + transform: scale(1); + background-color: transparent; + } + 50% { + transform: scale(0.75); + box-shadow: inset 10px 10px 10px 4px rgba(237, 237, 237, 0.1), inset -10px -10px 10px 4px rgba(237, 237, 237, 0.1), + inset 10px -10px 10px 4px rgba(237, 237, 237, 0.1), inset -10px 10px 10px 4px rgba(237, 237, 237, 0.1); + background-color: rgba(237, 237, 237, 0.1); + } + 100% { + transform: scale(1); + background-color: $ibexa-color-white; + } +} diff --git a/public/bundles/ibexaadminui/scss/_assign.scss b/public/bundles/ibexaadminui/scss/_assign.scss new file mode 100644 index 000000000..37fb1e526 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_assign.scss @@ -0,0 +1,22 @@ +.ibexa-assign { + &__groups { + margin-top: calculateRem(12px); + } + + &__section:not(:first-child) { + margin-top: calculateRem(32px); + } + + &__limitations-item { + margin-bottom: calculateRem(16px); + + .ibexa-dropdown { + max-width: calculateRem(300px); + margin-top: calculateRem(8px); + } + } + + &__limitations-item-subtree { + margin-top: calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_autosave.scss b/public/bundles/ibexaadminui/scss/_autosave.scss new file mode 100644 index 000000000..5c43560b5 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_autosave.scss @@ -0,0 +1,57 @@ +.ibexa-autosave { + display: flex; + align-items: center; + justify-content: center; + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size-small; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + .ibexa-icon { + fill: $ibexa-color-dark-400; + } + + &--light { + color: $ibexa-color-white; + fill: $ibexa-color-white; + } + + $states: 'error', 'off', 'on', 'saved', 'saving'; + + @each $state in $states { + &__icon-#{$state} { + margin-right: calculateRem(8px); + } + + &__status-#{$state} { + white-space: nowrap; + } + + &__icon-#{$state}, + &__status-#{$state} { + display: none; + } + + &--#{$state} { + .ibexa-autosave__icon-#{$state}, + .ibexa-autosave__status-#{$state} { + display: initial; + } + } + } + + &--saved { + color: $ibexa-color-success; + + .ibexa-autosave__icon-saved { + fill: $ibexa-color-success; + } + } + + &--error { + color: $ibexa-color-danger; + + .ibexa-autosave__icon-error { + fill: $ibexa-color-danger; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_back-to-top.scss b/public/bundles/ibexaadminui/scss/_back-to-top.scss new file mode 100644 index 000000000..764785efe --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_back-to-top.scss @@ -0,0 +1,43 @@ +.ibexa-back-to-top { + position: fixed; + bottom: calculateRem(16px); + right: calculateRem(32px); + + .btn.ibexa-back-to-top__btn { + height: calculateRem(62px); + min-width: calculateRem(62px); + border-radius: calculateRem(31px); + padding: calculateRem(15px) calculateRem(18px); + display: flex; + justify-content: center; + align-items: center; + background-color: $ibexa-color-white; + opacity: 0; + visibility: hidden; + transition: opacity $ibexa-admin-transition-duration $ibexa-admin-transition; + + &--visible { + opacity: 1; + visibility: visible; + } + } + + &__title { + display: none; + padding-right: calculateRem(8px); + + &--visible { + display: inline-block; + } + } + + &__icon.ibexa-icon { + transform: rotate(90deg); + margin-right: 0; + fill: $ibexa-color-dark; + } +} + +.ibexa-back-to-top-scroll-container { + padding-bottom: calculateRem(64px); +} diff --git a/public/bundles/ibexaadminui/scss/_backdrop.scss b/public/bundles/ibexaadminui/scss/_backdrop.scss new file mode 100644 index 000000000..2eb239550 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_backdrop.scss @@ -0,0 +1,22 @@ +.ibexa-backdrop { + display: none; + position: fixed; + z-index: 100; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba($ibexa-color-dark, 0.4); + + &--active { + display: block; + } + + &--transparent { + background-color: transparent; + } + + & ~ main .ibexa-edit-header { + z-index: auto; + } +} diff --git a/public/bundles/ibexaadminui/scss/_badges.scss b/public/bundles/ibexaadminui/scss/_badges.scss new file mode 100644 index 000000000..680d16d1d --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_badges.scss @@ -0,0 +1,79 @@ +.ibexa-badge { + height: calculateRem(24px); + padding: calculateRem(4px) calculateRem(10px); + font-size: calculateRem(16px); + font-size: $ibexa-text-font-size-small; + line-height: calculateRem(16px); + font-weight: normal; + border-radius: calculateRem(12px); + background-color: $ibexa-color-light-500; + white-space: nowrap; + display: inline-block; + + &--status { + position: relative; + padding-left: calculateRem(16px); + padding-top: calculateRem(3px); + padding-bottom: calculateRem(3px); + border-width: calculateRem(1px); + border-style: solid; + + &::before { + content: ''; + position: absolute; + left: calculateRem(8px); + width: calculateRem(4px); + height: calculateRem(4px); + border-radius: 50%; + top: 50%; + transform: translateY(-50%); + } + } + + @mixin version-properties($color, $background-color) { + color: $color; + background-color: $background-color; + border-color: $color; + + .ibexa-icon { + fill: $color; + } + + &::before { + background-color: $color; + } + } + + &--primary { + @include version-properties($ibexa-color-primary, $ibexa-color-primary-200); + } + + &--secondary { + @include version-properties($ibexa-color-dark, $ibexa-color-light-500); + } + + &--info { + @include version-properties($ibexa-color-info, $ibexa-color-info-200); + } + + &--danger { + @include version-properties($ibexa-color-danger, $ibexa-color-danger-200); + } + + &--success { + @include version-properties($ibexa-color-success, $ibexa-color-success-200); + } + + &--complementary { + @include version-properties($ibexa-color-complementary, $ibexa-color-complementary-200); + } + + &--custom-colors { + @include version-properties(var(--primary-color), var(--secondary-color)); + } + + &--ghost { + background-color: transparent; + border-color: transparent; + } +} diff --git a/public/bundles/ibexaadminui/scss/_breadcrumb.scss b/public/bundles/ibexaadminui/scss/_breadcrumb.scss new file mode 100644 index 000000000..355403c78 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_breadcrumb.scss @@ -0,0 +1,21 @@ +.breadcrumb { + flex-wrap: nowrap; + margin-bottom: 0; + + &--increased-left-margin { + margin-left: calculateRem(55px); + } + + .breadcrumb-item { + cursor: not-allowed; + color: $ibexa-color-dark-300; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: calculateRem(300px); + + &::before { + color: $ibexa-color-dark; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_buttons.scss b/public/bundles/ibexaadminui/scss/_buttons.scss new file mode 100644 index 000000000..8b7f293f6 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_buttons.scss @@ -0,0 +1,427 @@ +@import 'extra-actions'; + +.ibexa-btn { + display: inline-flex; + white-space: nowrap; + padding: calculateRem(14px) calculateRem(15px); + outline: none; + border: calculateRem(1px) solid transparent; + border-radius: $ibexa-border-radius; + text-decoration: none; + font-size: calculateRem(14px); + line-height: calculateRem(18px); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &:focus { + box-shadow: $ibexa-btn-focus-box-shadow; + border-color: transparent; + } + + &:hover { + border-color: transparent; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + + &--primary.ibexa-btn { + color: $ibexa-color-white; + fill: $ibexa-color-white; + background-image: $ibexa-gradient-danger-primary; + border-width: 0; + padding: calculateRem(15px) calculateRem(16px); + + &:hover { + color: $ibexa-color-white; + box-shadow: 0 0 0 transparent, $ibexa-btn-hover-box-shadow; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + + &:hover:focus { + box-shadow: $ibexa-btn-focus-box-shadow, $ibexa-btn-hover-box-shadow; + } + + &:focus { + color: $ibexa-color-white; + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-400; + fill: $ibexa-color-dark-400; + background-image: none; + background-color: $ibexa-color-light; + box-shadow: none; + } + } + + &--secondary.ibexa-btn { + color: $ibexa-color-primary; + fill: $ibexa-color-primary; + background-color: transparent; + border-color: $ibexa-color-primary; + + &:focus { + color: $ibexa-color-primary; + border-color: $ibexa-color-primary; + } + + &:hover { + color: $ibexa-color-dark; + border-color: $ibexa-color-dark; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + + &:active { + color: $ibexa-color-primary; + border-color: $ibexa-color-primary; + } + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-400; + fill: $ibexa-color-dark-400; + border-color: $ibexa-color-dark-200; + background-color: rgba($ibexa-color-light, 0.4); + } + } + + &--tertiary.ibexa-btn { + color: $ibexa-color-dark; + fill: $ibexa-color-dark; + background-color: transparent; + border-color: $ibexa-color-light; + + &:hover { + border-color: $ibexa-color-dark; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + &:focus { + border-color: $ibexa-color-light; + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-300; + fill: $ibexa-color-dark-300; + border-color: $ibexa-color-light; + background-color: $ibexa-color-light-300; + } + } + + &--ghost.ibexa-btn { + color: $ibexa-color-dark; + fill: $ibexa-color-dark; + + &:hover { + color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + + &:focus { + color: $ibexa-color-primary; + border-color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-300; + fill: $ibexa-color-dark-300; + border-color: transparent; + } + } + + &--ghost-info.ibexa-btn { + color: $ibexa-color-dark; + fill: $ibexa-color-dark; + + &:hover { + color: $ibexa-color-info; + + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &:focus { + color: $ibexa-color-info; + border-color: $ibexa-color-info; + + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-300; + fill: $ibexa-color-dark-300; + border-color: transparent; + } + } + + &--dark.ibexa-btn { + color: $ibexa-color-white; + fill: $ibexa-color-white; + background-color: $ibexa-color-dark; + border-color: $ibexa-color-dark; + + &:hover { + color: $ibexa-color-white; + fill: $ibexa-color-white; + background-color: $ibexa-color-dark; + box-shadow: 0 0 0 transparent, $ibexa-btn-hover-box-shadow-dark; + + .ibexa-icon { + fill: $ibexa-color-white; + } + + &:focus { + box-shadow: $ibexa-btn-focus-box-shadow, $ibexa-btn-hover-box-shadow-dark; + } + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-400; + fill: $ibexa-color-dark-400; + background-color: $ibexa-color-light; + border-color: $ibexa-color-light; + box-shadow: none; + } + } + + &--filled-info.ibexa-btn { + color: $ibexa-color-white; + fill: $ibexa-color-white; + border-color: $ibexa-color-info; + background-color: $ibexa-color-info; + + &:focus { + box-shadow: $ibexa-btn-focus-box-shadow-info; + } + + &:hover { + color: $ibexa-color-white; + box-shadow: 0 0 0 transparent, $ibexa-btn-hover-box-shadow-info; + background-color: $ibexa-color-info; + + .ibexa-icon { + fill: $ibexa-color-white; + } + + &:focus { + color: $ibexa-color-white; + box-shadow: $ibexa-btn-focus-box-shadow-info, $ibexa-btn-hover-box-shadow-info; + } + } + } + + &--info.ibexa-btn { + color: $ibexa-color-info; + fill: $ibexa-color-info; + border-color: $ibexa-color-info; + + &:focus { + box-shadow: $ibexa-btn-focus-box-shadow-info; + } + + &:hover { + color: $ibexa-color-dark; + fill: $ibexa-color-dark; + border-color: $ibexa-color-dark; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + &.ibexa-btn--inverted-hover { + &:hover { + color: $ibexa-color-white; + fill: $ibexa-color-white; + border-color: $ibexa-color-white; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + } + + &:focus { + box-shadow: $ibexa-btn-focus-box-shadow-info; + } + + &.disabled, + &[disabled], + &:disabled { + color: $ibexa-color-dark-400; + fill: $ibexa-color-dark-400; + border-color: $ibexa-color-dark-200; + background-color: $ibexa-color-light-300; + } + } + + &--neon-info.ibexa-btn { + border-radius: $ibexa-border-radius; + + .ibexa-icon { + fill: $ibexa-color-info; + } + + &:hover { + border-color: $ibexa-color-info; + box-shadow: 0 0 0 transparent, $ibexa-btn-hover-box-shadow-info; + } + + &:focus { + box-shadow: none; + } + } + + &--selector.ibexa-btn { + color: $ibexa-color-dark; + fill: $ibexa-color-dark; + padding: calculateRem(11px) calculateRem(12px); + + &.ibexa-btn--selected { + background-color: $ibexa-color-info-200; + fill: $ibexa-color-info; + } + + &.ibexa-btn--error { + background-color: $ibexa-color-danger-100; + border-color: $ibexa-color-danger; + fill: $ibexa-color-danger; + } + + &:hover { + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &:not(.ibexa-btn--selected) { + &:hover, + &:focus { + border-color: $ibexa-color-info; + } + } + + &:focus { + box-shadow: $ibexa-btn-focus-box-shadow-info; + } + } + + &--small { + padding-top: calculateRem(6px); + padding-bottom: calculateRem(6px); + height: calculateRem(32px); + + &.ibexa-btn--primary { + padding-top: calculateRem(7px); + padding-bottom: calculateRem(7px); + } + } + + &--no-text { + &.ibexa-btn--small { + padding-left: calculateRem(7px); + padding-right: calculateRem(7px); + + &.ibexa-btn--primary { + padding-left: calculateRem(8px); + padding-right: calculateRem(8px); + } + } + } + + &--add-translation { + .ibexa-icon { + margin-right: 0; + } + } + + &__label { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .ibexa-icon { + margin-right: calculateRem(12px); + } + + &--icon-right { + .ibexa-icon { + margin-right: 0; + margin-left: calculateRem(12px); + } + } + + &--no-text { + .ibexa-icon { + margin-right: 0; + } + } +} + +.btn.disabled, +.btn[disabled] { + opacity: 1; +} + +.ibexa-content-view, +.ibexa-trash-list-view { + .ibexa-modal--send-to-trash { + .modal-footer { + .form-check-inline { + margin-right: 0; + + .btn-danger { + margin-right: 0; + } + } + } + } +} + +.ibexa-btn--content-edit { + background-color: transparent; + cursor: pointer; +} + +.ibexa-btn--content-tree-expanded { + background: $ibexa-color-white; + border-color: $ibexa-color-white; + color: $ibexa-color-black; +} + +button:focus { + outline: 0; +} diff --git a/public/bundles/ibexaadminui/scss/_card.scss b/public/bundles/ibexaadminui/scss/_card.scss new file mode 100644 index 000000000..0b76fd7d0 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_card.scss @@ -0,0 +1,203 @@ +.ibexa-card { + border: none; + background-color: transparent; + + .form-group { + width: 70%; + } + + .col-form-label { + font-weight: 700; + } + + &__header { + display: flex; + color: $ibexa-color-black; + border-radius: $ibexa-border-radius $ibexa-border-radius 0 0; + padding: calculateRem(8px); + + &--secondary { + color: $ibexa-color-primary; + font-weight: 400; + } + + &--sticky-top { + // -webkit-sticky fixes bug for Safari 12.0 + position: -webkit-sticky; + position: sticky; + top: 0; + padding: calculateRem(4px) calculateRem(20px); + justify-content: space-between; + z-index: 1040; + } + + &--section-title { + display: flex; + align-items: center; + color: $ibexa-color-dark; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + padding: calculateRem(24px); + font-weight: bold; + } + + .form-inline { + .btn-danger { + display: flex; + height: calculateRem(48px); + } + } + } + + &__title { + padding: calculateRem(24px) 0 calculateRem(16px) 0; + font-weight: bold; + font-size: $h2-font-size; + } + + &__body { + padding: calculateRem(8px); + + &--incresed-margin { + margin: calculateRem(32px) calculateRem(16px); + } + } + + &__field-control { + background-color: $ibexa-color-white; + border-radius: $ibexa-border-radius; + padding: calculateRem(4px); + + .form-control { + margin-bottom: 0; + } + } + + &--no-padding { + .ibexa-card__body { + padding: 0; + } + } + + &--light { + background: $ibexa-color-white; + } + + &--more-space { + .ibexa-card__body { + padding-left: calculateRem(16px); + padding-right: calculateRem(16px); + } + } + + .ibexa-header, + .ibexa-tab-content { + margin-right: 0; + margin-left: 0; + width: 100%; + } + + .table { + margin-bottom: 0; + } +} + +.ibexa-card--toggle-group { + background: $ibexa-color-white; + + &.ibexa-card--collapsed { + .ibexa-card { + &__header { + &:hover { + background: $ibexa-color-light-200; + } + } + + &__body { + max-height: 0; + overflow: hidden; + padding-top: 0; + padding-bottom: 0; + } + + &__body-display-toggler { + .ibexa-icon--caret-down { + display: none; + } + } + } + } + + &:not(.ibexa-card--collapsed) { + .ibexa-card { + &__header { + background-color: $ibexa-color-light-500; + font-weight: bold; + } + + &__body { + background: $ibexa-color-light-200; + } + + &__body-display-toggler { + .ibexa-icon--caret-next { + display: none; + } + } + } + } + + .ibexa-card { + &__header { + line-height: calculateRem(40px); + padding: calculateRem(12px) calculateRem(8px); + display: flex; + + .form-check { + display: flex; + align-items: center; + } + + .form-check-input { + margin-top: 0; + } + + .form-check-label { + margin-left: calculateRem(8px); + margin-bottom: 0; + color: $ibexa-color-black; + font-size: calculateRem(16px); + } + + .ibexa-card__body-display-toggler { + margin: calculateRem(4px) calculateRem(4px) calculateRem(4px) 0; + height: calculateRem(32px); + width: calculateRem(32px); + padding: 0; + cursor: pointer; + transition: background 0.3s $ibexa-admin-transition; + display: flex; + align-items: center; + justify-content: center; + + &:focus { + outline: none; + box-shadow: none; + } + + .ibexa-icon { + fill: $ibexa-color-black; + } + } + } + + &__body { + padding: calculateRem(24px) calculateRem(40px); + } + } + + & + & { + .ibexa-card__header { + border-top: calculateRem(1px) solid $ibexa-color-light; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_chart.scss b/public/bundles/ibexaadminui/scss/_chart.scss new file mode 100644 index 000000000..3b788707c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_chart.scss @@ -0,0 +1,93 @@ +.ibexa-chart { + display: flex; + flex-direction: column; + height: 100%; + max-height: calculateRem(1000px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + padding: calculateRem(16px) calculateRem(32px); + box-shadow: $ibexa-edit-header-box-shadow; + + &--no-data { + .ibexa-chart { + &__canvas, + &__legend, + &__summary { + opacity: 0.4; + } + } + } + + &__header { + display: flex; + justify-content: space-between; + align-items: baseline; + } + + &__title { + line-height: calculateRem(33px); + } + + &__time-range, + &__time-period { + color: $ibexa-color-dark-500; + font-size: $ibexa-text-font-size-medium; + } + + &__message { + position: absolute; + z-index: 1; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + font-weight: bold; + width: calculateRem(400px); + height: calculateRem(226px); + border-radius: $ibexa-border-radius; + border: calculateRem(1px) solid $ibexa-color-light; + background: $ibexa-color-white; + + .ibexa-icon { + margin-bottom: calculateRem(12px); + } + } + + &__body { + position: relative; + padding: calculateRem(16px) 0; + } + + &__canvas { + max-height: calculateRem(600px); + width: 100%; + } + + &__legend { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding: calculateRem(16px) calculateRem(2px) 0 calculateRem(4px); + } + + &__legend-checkbox-label { + display: flex; + height: calculateRem(20px); + align-items: center; + margin-right: calculateRem(15px); + font-size: $ibexa-text-font-size-medium; + + .ibexa-input { + margin-right: calculateRem(4px); + + &--legend-checkbox { + width: calculateRem(16px); + height: calculateRem(16px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_collapse.scss b/public/bundles/ibexaadminui/scss/_collapse.scss new file mode 100644 index 000000000..8849fe5c2 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_collapse.scss @@ -0,0 +1,91 @@ +.ibexa-collapse { + overflow: hidden; + height: auto; + opacity: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + background-color: $ibexa-color-white; + + &__header { + display: flex; + height: calculateRem(53px); + align-items: center; + padding: 0 calculateRem(4px); + background-color: $ibexa-color-white; + border-top-right-radius: $ibexa-border-radius; + border-top-left-radius: $ibexa-border-radius; + } + + &__header-label { + margin: 0; + font-size: $ibexa-text-font-size; + } + + &__toggle { + &--status { + margin-left: auto; + } + } + + &__body { + border-bottom-right-radius: $ibexa-border-radius; + border-bottom-left-radius: $ibexa-border-radius; + } + + &--hidden { + height: 0; + opacity: 0; + } + + &--collapsed { + .ibexa-collapse { + &__header { + border-color: $ibexa-color-white; + } + } + } + + &__toggle-btn { + &--title { + max-width: calc(100% - #{calculateRem(120px)}); + } + + &--status { + &.collapsed { + transform: rotate(180deg); + } + } + + .ibexa-collapse__header-label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + + &--heavy { + box-shadow: inset 0 0 0 calculateRem(1px) $ibexa-color-light, + calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + border-radius: $ibexa-border-radius; + transition: all $ibexa-admin-transition-duration; + + .ibexa-collapse { + &__header { + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(19px) calculateRem(-10px) rgba($ibexa-color-info, 0.05); + } + + &__body { + background: transparent; + } + } + &.ibexa-collapse--collapsed { + box-shadow: none; + } + } + + &.is-invalid { + box-shadow: none; + border: calculateRem(1px) solid $ibexa-color-danger; + } +} diff --git a/public/bundles/ibexaadminui/scss/_content-edit.scss b/public/bundles/ibexaadminui/scss/_content-edit.scss new file mode 100644 index 000000000..798e5e705 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_content-edit.scss @@ -0,0 +1,15 @@ +.ibexa-edit-content { + @include edit-right-side-container; + + &__container { + max-width: calculateRem(820px); + + &--wide { + max-width: calculateRem(1600px); + } + } + + &__section-header { + padding-top: calculateRem(16px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_content-locations.scss b/public/bundles/ibexaadminui/scss/_content-locations.scss new file mode 100644 index 000000000..468f4fa7b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_content-locations.scss @@ -0,0 +1,22 @@ +.ibexa-content-locations { + &__visibility-toggler-label { + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size-small; + + .ibexa-icon { + fill: $ibexa-color-dark-400; + } + + &--hidden { + display: none; + } + } + + .ibexa-table { + &__header-cell { + &--visibility-toggler { + width: calculateRem(300px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_content-tree.scss b/public/bundles/ibexaadminui/scss/_content-tree.scss new file mode 100644 index 000000000..22ee27999 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_content-tree.scss @@ -0,0 +1,31 @@ +.ibexa-content-view, +.ibexa-bookmark-list-view, +.ibexa-search-view, +.ibexa-trash-list-view, +.ibexa-drafts-list-view { + .ibexa-content-container { + min-width: 0; + } + + .ibexa-content-tree-container { + position: relative; + top: 0; + flex: 0 0 auto; + background: $ibexa-color-white; + color: inherit; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + &__root { + position: -webkit-sticky; + position: sticky; + top: 0; + height: 100%; + overflow: auto; + } + } + + .ibexa-view-container { + flex: 1 1 auto; + min-width: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/_content-type-edit.scss b/public/bundles/ibexaadminui/scss/_content-type-edit.scss new file mode 100644 index 000000000..404db9431 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_content-type-edit.scss @@ -0,0 +1,378 @@ +.ibexa-available-field-types { + @include sidebar-drag-items(); + + min-height: calculateRem(700px); + max-height: calc(100vh - #{calculateRem(200px)}); + margin-left: calculateRem(32px); +} + +.ibexa-available-field-type { + @include sidebar-drag-item; +} + +.ibexa-content-type-edit { + &__sections { + padding: 0; + } + + .ibexa-edit-content__container--meta { + .ibexa-content-type-edit { + &__section-column-header { + border-top: calculateRem(1px) solid $ibexa-color-light; + padding-top: calculateRem(16px); + margin-top: calculateRem(40px); + } + } + } + + &__section { + display: flex; + flex-wrap: wrap; + margin: 0 0 calculateRem(32px) 0; + + &--one-column-layout { + .ibexa-content-type-edit__section-column { + &--left-col { + width: 100%; + } + } + } + } + + &__section-column { + margin: 0 0 calculateRem(50px) 0; + + &--left-col { + width: 60%; + } + + &--right-col { + width: 40%; + } + } + + &__section-column-header { + margin-top: calculateRem(32px); + margin-bottom: 0; + } + + &__section-column-body { + .form-check { + margin-top: calculateRem(16px); + + .ibexa-label { + margin-bottom: 0; + } + } + } + + &__section-column { + padding: 0; + + &--available-fields { + .ibexa-content-type-edit__section-column-body { + position: sticky; + top: calculateRem(-34px); + } + } + + &--field-definitions, + &--assigned-attributes { + min-height: calculateRem(700px); + padding: calculateRem(16px) calculateRem(34px); + background: $ibexa-color-light-300; + border-radius: $ibexa-border-radius; + + .ibexa-content-type-edit__section-column-header { + margin-top: 0; + margin-bottom: calculateRem(17px); + } + } + + .ibexa-collapse { + &--field-definitions-group { + margin-bottom: calculateRem(22px); + border-radius: $ibexa-border-radius; + + &.ibexa-collapse--hidden { + margin: 0; + } + + .ibexa-collapse { + &__header { + padding: 0 calculateRem(12px); + + .ibexa-btn { + padding: calculateRem(10px); + } + } + + &__body-content { + padding: 0 calculateRem(24px) calculateRem(20px); + min-height: calculateRem(410px); + } + } + } + + &--active-field-definitions-group { + border: calculateRem(1px) solid $ibexa-color-info; + } + + &--field-definition { + position: relative; + margin-bottom: calculateRem(12px); + border-radius: $ibexa-border-radius; + border: calculateRem(1px) solid $ibexa-color-light; + box-shadow: $ibexa-content-type-edit-field-shadow; + + &:hover { + border-color: $ibexa-color-dark; + + .ibexa-collapse__draggable-btn .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + .ibexa-collapse { + &__header { + box-shadow: $ibexa-content-type-edit-field-shadow; + border-radius: $ibexa-border-radius; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + + .ibexa-btn { + padding: calculateRem(10px); + } + } + + &__header-label { + font-size: $ibexa-text-font-size !important; + font-weight: normal; + line-height: calculateRem(22px); + } + + &__toggle--status { + margin-left: 0; + } + + &__toggle-btn, + &__extra-action-button { + &:hover { + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + + &--remove-field-definitions { + margin-left: auto; + } + } + + &__toggle-btn:not(.ibexa-collapse__toggle-btn--status) { + cursor: grab; + margin-right: auto; + } + + &__draggable-btn { + cursor: grab; + + .ibexa-icon { + fill: $ibexa-color-light; + } + } + } + + &.ibexa-collapse { + &[draggable='true'] { + .ibexa-collapse { + &__header { + &:hover { + cursor: grab; + } + } + + &__toggle-btn:not(.ibexa-collapse__toggle-btn--status) { + cursor: grab; + } + } + } + } + } + + &--field-definition-removing { + border-color: $ibexa-color-light-300; + animation: field-remove-pulse 0.2s 1; + transform-origin: center; + pointer-events: none; + + &:hover { + border-color: $ibexa-color-light-300; + } + + .ibexa-collapse__header { + background-color: $ibexa-color-light-300; + } + + .ibexa-collapse__header-label { + color: $ibexa-color-light-500; + } + + .ibexa-collapse__draggable-btn .ibexa-icon, + .ibexa-icon { + fill: $ibexa-color-light-500; + } + } + + &--field-definition-remove-animation { + animation: remove-field 1s 1; + } + + &--field-definition-loading { + animation: field-add-pulse 1s 1; + pointer-events: none; + } + + &--field-definition-highlighted { + border-color: $ibexa-color-info; + + .ibexa-collapse__header { + background-color: $ibexa-color-info-100; + } + + .ibexa-collapse__header-label { + color: $ibexa-color-info; + } + + .ibexa-collapse__draggable-btn .ibexa-icon, + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &--field-definition-error { + border-color: $ibexa-color-danger; + + .ibexa-collapse__header { + background-color: $ibexa-color-danger-100; + } + + .ibexa-collapse__header-label { + color: $ibexa-color-danger; + } + + .ibexa-collapse__draggable-btn .ibexa-icon, + .ibexa-icon { + fill: $ibexa-color-danger; + } + } + + &--field-definition.ibexa-collapse--collapsed { + .ibexa-collapse__header { + border-bottom: none; + box-shadow: none; + } + } + } + + .ibexa-popup-menu { + top: calculateRem(70px); + } + } + + &__field-definition-content { + padding: calculateRem(20px); + } + + &__add-field-definitions-group { + display: flex; + justify-content: center; + align-items: center; + position: relative; + height: calculateRem(80px); + margin-bottom: calculateRem(24px); + border: calculateRem(1px) dashed $ibexa-color-light-600; + border-radius: $ibexa-border-radius; + } + + &__add-field-definitions-group-btn { + min-width: calculateRem(210px); + justify-content: center; + } + + &__empty-group-image { + margin: calculateRem(32px) auto calculateRem(48px); + } + + &__empty-group-label { + color: $ibexa-color-dark-400; + margin-bottom: calculateRem(16px); + } + + &__field-settings-group { + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + } + + &__field-settings-field + &__field-settings-field { + margin-left: calculateRem(35px); + } +} + +.ibexa-field-definitions-placeholder { + @include drag-item-placeholder; +} + +.ibexa-field-definitions-placeholder-full { + @include drag-item-placeholder-full; +} + +.ibexa-field-definitions-empty-group { + @include empty-drop-zone; +} + +@keyframes remove-field { + 100% { + height: 0; + margin-bottom: 0; + opacity: 0; + transform: scale(0); + } +} + +@keyframes field-remove-pulse { + 0% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 0 $ibexa-color-light-300; + } + 10% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 0 $ibexa-color-light-300; + } + 20% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 calculateRem(10px) $ibexa-color-light-300; + } + 100% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 0 $ibexa-color-light-300; + } +} + +@keyframes field-add-pulse { + 0% { + border-color: $ibexa-color-info-100; + box-shadow: 0 0 0 0 $ibexa-color-info-100; + } + 10% { + border-color: $ibexa-color-info-100; + box-shadow: 0 0 0 0 $ibexa-color-info-100; + } + 20% { + border-color: $ibexa-color-info-100; + box-shadow: 0 0 0 calculateRem(10px) $ibexa-color-info-100; + } + 100% { + border-color: $ibexa-color-info-100; + box-shadow: 0 0 0 0 $ibexa-color-info-100; + } +} diff --git a/public/bundles/ibexaadminui/scss/_content-type-selector.scss b/public/bundles/ibexaadminui/scss/_content-type-selector.scss new file mode 100644 index 000000000..79040d214 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_content-type-selector.scss @@ -0,0 +1,74 @@ +.ibexa-content-type-selector { + .accordion-item { + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &__group-title { + .accordion-button { + justify-content: space-between; + font-size: $ibexa-text-font-size-medium; + font-weight: 600; + border-bottom: calculateRem(1px) solid transparent; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + .ibexa-icon--toggle { + transition: var(--bs-accordion-btn-icon-transition); + } + + &:not(.collapsed) { + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + border-bottom-color: $ibexa-color-light; + + .ibexa-icon--toggle { + transform: var(--bs-accordion-btn-icon-transform); + } + } + + &:hover { + color: $ibexa-color-primary; + + .ibexa-icon--toggle { + fill: $ibexa-color-primary; + } + } + + &::after { + display: none; + } + } + } + + &__list-padding-wrapper { + padding: calculateRem(16px); + } + + &__list { + list-style: none; + padding-left: 0; + margin-bottom: 0; + margin-top: 0; + } + + &__item { + margin-top: calculateRem(12px); + + .form-check { + display: block; + } + } + + &__show-more { + display: inline-block; + margin-top: calculateRem(12px); + text-decoration: none; + font-size: $ibexa-text-font-size-medium; + + &:hover { + text-decoration: none; + } + } + + &__show-more-text { + text-decoration: underline; + } +} diff --git a/public/bundles/ibexaadminui/scss/_context-menu.scss b/public/bundles/ibexaadminui/scss/_context-menu.scss new file mode 100644 index 000000000..2da833389 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_context-menu.scss @@ -0,0 +1,49 @@ +.ibexa-context-menu-wrapper { + display: flex; +} + +.ibexa-context-menu { + display: flex; + justify-content: flex-end; + height: calculateRem(48px); + width: 100%; + padding: 0; + margin: 0; + list-style: none; + + &--before-adaptive-items-init { + overflow: hidden; + display: flex; + flex-wrap: wrap; + height: calculateRem(48px); + padding: 0; + } + + &__item { + padding-left: calculateRem(16px); + + &--hidden { + width: 0; + height: 0; + margin: 0; + padding: 0; + border: none; + overflow: hidden; + } + + &--more { + position: relative; + } + } + + .ibexa-popup-menu { + position: absolute; + right: 0; + top: calculateRem(70px); + z-index: 50; + + &--hidden { + display: none; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_custom-tag.scss b/public/bundles/ibexaadminui/scss/_custom-tag.scss new file mode 100644 index 000000000..38934a244 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_custom-tag.scss @@ -0,0 +1,122 @@ +.ibexa-custom-tag { + max-width: 50%; + border: calculateRem(1px) solid $ibexa-color-primary; + margin: calculateRem(16px) 0; + border-radius: calculateRem(5px); + + & & { + max-width: 100%; + } + + &__header { + display: flex; + justify-content: space-between; + align-items: center; + background-color: $ibexa-color-white; + padding: calculateRem(2px) calculateRem(2px) calculateRem(2px) calculateRem(8px); + border-top-left-radius: calculateRem(5px); + border-top-right-radius: calculateRem(5px); + + &-label { + font-weight: bold; + } + + &-btns { + background-color: $ibexa-color-white; + border: calculateRem(2px) solid $ibexa-color-primary; + border-radius: calculateRem(5px); + display: flex; + padding: calculateRem(2px); + } + + &-btn { + display: flex; + border-radius: calculateRem(5px); + padding: calculateRem(6px) calculateRem(8px); + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + + &__icon-wrapper { + white-space: initial; + display: flex; + align-items: center; + } + + & > [data-ezelement='ezattributes'], + & > [data-ezelement='ezcontent'] { + display: none; + padding: calculateRem(8px) calculateRem(24px); + } + + &--attributes-visible { + & > [data-ezelement='ezattributes'] { + display: block; + } + + & > .ibexa-custom-tag__header { + .ibexa-custom-tag__header-btn--attributes { + background-color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + } + } + + &--content-visible { + & > [data-ezelement='ezcontent'] { + display: inherit; + } + + &[data-ezelement='eztemplateinline'] { + padding: 0 calculateRem(8px); + margin: 0 calculateRem(4px); + background-color: $ibexa-color-white; + border: none; + display: inline-flex; + max-width: none; + + & > [data-ezelement='ezcontent'] { + padding: 0; + } + } + + & > .ibexa-custom-tag__header { + .ibexa-custom-tag__header-btn--content { + background-color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + } + } +} + +.ibexa-field-edit--ezrichtext { + .cke_widget_ezcustomtag, + .ibexa-custom-tag { + &[data-ezalign='right'] { + float: none; + margin-left: auto; + margin-right: 0; + } + + &[data-ezalign='left'] { + float: none; + margin-left: 0; + margin-right: auto; + } + + &[data-ezalign='center'] { + text-align: inherit; + margin-left: auto; + margin-right: auto; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_custom-url-form.scss b/public/bundles/ibexaadminui/scss/_custom-url-form.scss new file mode 100644 index 000000000..50c6a2ff4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_custom-url-form.scss @@ -0,0 +1,33 @@ +.ibexa-custom-url-from { + &__item { + &:first-child { + .ibexa-label { + margin-top: 0; + } + } + + .ibexa-dropdown, + .ibexa-input-text-wrapper { + width: calculateRem(352px); + } + } + + &__info-text { + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + + &--checked { + display: none; + + .ibexa-toggle--is-checked + & { + display: block; + } + } + + &--unchecked { + .ibexa-toggle--is-checked + .ibexa-custom-url-from__info-text--checked + & { + display: none; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_custom.scss b/public/bundles/ibexaadminui/scss/_custom.scss new file mode 100644 index 000000000..78f77e572 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_custom.scss @@ -0,0 +1,372 @@ +@import 'functions/calculate.rem'; + +// Ibexa transition function +$ibexa-admin-transition: cubic-bezier(0.25, 0.8, 0.25, 1); +$ibexa-admin-transition-duration: 0.4s; +$ibexa-admin-widget-open-transition: all 0.3s ease-in; +$ibexa-admin-widget-close-transition: all 0.3s ease-out; + +// Ibexa colors +$ibexa-color-primary: #ae1164; +$ibexa-color-primary-900: #230314; +$ibexa-color-primary-800: #460728; +$ibexa-color-primary-700: #780c45; +$ibexa-color-primary-600: #8b0e50; +$ibexa-color-primary-500: #b7397c; +$ibexa-color-primary-400: #ce70a2; +$ibexa-color-primary-300: #de9fc1; +$ibexa-color-primary-200: #eecfe0; +$ibexa-color-primary-100: #f6e7ef; + +$ibexa-color-danger: #db0032; +$ibexa-color-danger-900: #2c000a; +$ibexa-color-danger-800: #580014; +$ibexa-color-danger-700: #990023; +$ibexa-color-danger-600: #af0028; +$ibexa-color-danger-500: #db2c54; +$ibexa-color-danger-400: #e96684; +$ibexa-color-danger-300: #f099ad; +$ibexa-color-danger-200: #f7ccd6; +$ibexa-color-danger-100: #fbe5ea; + +$ibexa-color-warning: #ff4713; +$ibexa-color-warning-900: #330e04; +$ibexa-color-warning-800: #661c08; +$ibexa-color-warning-700: #992b0b; +$ibexa-color-warning-600: #cc390f; +$ibexa-color-warning-500: #f7633a; +$ibexa-color-warning-400: #ff9071; +$ibexa-color-warning-300: #ffb5a0; +$ibexa-color-warning-200: #ffdacf; +$ibexa-color-warning-100: #ffece7; + +$ibexa-color-success: #00a42b; +$ibexa-color-success-900: #002109; +$ibexa-color-success-800: #004211; +$ibexa-color-success-700: #00621a; +$ibexa-color-success-600: #008322; +$ibexa-color-success-500: #33b655; +$ibexa-color-success-400: #66c880; +$ibexa-color-success-300: #99dbaa; +$ibexa-color-success-200: #ccedd5; +$ibexa-color-success-100: #e5f5e9; + +$ibexa-color-info: #4191ff; +$ibexa-color-info-900: #0d1d33; +$ibexa-color-info-800: #1a3a66; +$ibexa-color-info-700: #275799; +$ibexa-color-info-600: #3474cc; +$ibexa-color-info-500: #619eff; +$ibexa-color-info-400: #8dbdff; +$ibexa-color-info-300: #b3d3ff; +$ibexa-color-info-200: #d9e9ff; +$ibexa-color-info-100: #ecf4ff; + +$ibexa-color-black: #000000; +$ibexa-color-black-900: #040608; +$ibexa-color-black-800: #080b0f; +$ibexa-color-black-700: #0b1117; +$ibexa-color-black-600: #0f161e; +$ibexa-color-black-500: #2c2c2c; +$ibexa-color-black-400: #666666; +$ibexa-color-black-300: #999999; +$ibexa-color-black-200: #cccccc; +$ibexa-color-black-100: #e5e5e5; + +$ibexa-color-dark: #131c26; +$ibexa-color-dark-500: #3b424a; +$ibexa-color-dark-400: #71767c; +$ibexa-color-dark-300: #a0a4a8; +$ibexa-color-dark-200: #cfd1d3; +$ibexa-color-dark-100: #e7e8e9; + +$ibexa-color-light: #e0e0e8; +$ibexa-color-light-900: #2d2d2e; +$ibexa-color-light-800: #5a5a5d; +$ibexa-color-light-700: #86868b; +$ibexa-color-light-600: #b3b3ba; +$ibexa-color-light-500: #e6e6ed; +$ibexa-color-light-400: #ececf1; +$ibexa-color-light-300: #f3f3f6; +$ibexa-color-light-200: #f9f9fa; +$ibexa-color-light-100: #fbfbfc; + +$ibexa-color-white: #ffffff; +$ibexa-color-white-900: #333333; +$ibexa-color-white-800: #666666; +$ibexa-color-white-700: #999999; +$ibexa-color-white-600: #cccccc; + +$ibexa-color-accent-soft: #ecdfd1; +$ibexa-color-accent-soft-900: #2f2d2a; +$ibexa-color-accent-soft-800: #5e5954; +$ibexa-color-accent-soft-700: #8e867d; +$ibexa-color-accent-soft-600: #bdb2a7; +$ibexa-color-accent-soft-500: #f0e5da; +$ibexa-color-accent-soft-400: #f4ece3; +$ibexa-color-accent-soft-300: #f7f2ed; +$ibexa-color-accent-soft-200: #fbf9f6; +$ibexa-color-accent-soft-100: #fbf9f6; + +$ibexa-color-accent: #fcae42; +$ibexa-color-accent-900: #32230d; +$ibexa-color-accent-800: #65461a; +$ibexa-color-accent-700: #976828; +$ibexa-color-accent-600: #ca8b35; +$ibexa-color-accent-500: #f4b65f; +$ibexa-color-accent-400: #fdce8d; +$ibexa-color-accent-300: #fddeb3; +$ibexa-color-accent-200: #feeed9; +$ibexa-color-accent-100: #fff7ec; + +$ibexa-color-accent-strong: #f18a6b; +$ibexa-color-accent-strong-900: #301c15; +$ibexa-color-accent-strong-800: #60372b; +$ibexa-color-accent-strong-700: #915340; +$ibexa-color-accent-strong-600: #c16e56; +$ibexa-color-accent-strong-500: #eb9980; +$ibexa-color-accent-strong-400: #f6b8a6; +$ibexa-color-accent-strong-300: #f9d0c3; +$ibexa-color-accent-strong-200: #fce7e1; +$ibexa-color-accent-strong-100: #fdf3f0; + +$ibexa-color-complementary: #47bedb; +$ibexa-color-complementary-900: #0e262c; +$ibexa-color-complementary-800: #1c4c58; +$ibexa-color-complementary-700: #2b7283; +$ibexa-color-complementary-600: #2e7a8c; +$ibexa-color-complementary-500: #63c3da; +$ibexa-color-complementary-400: #90d8e9; +$ibexa-color-complementary-300: #b5e5f0; +$ibexa-color-complementary-200: #daf2f7; +$ibexa-color-complementary-100: #ecf8fb; + +$ibexa-color-complementary-strong: #004d5d; +$ibexa-color-complementary-strong-900: #000f13; +$ibexa-color-complementary-strong-800: #001f25; +$ibexa-color-complementary-strong-700: #002e38; +$ibexa-color-complementary-strong-600: #003e4a; +$ibexa-color-complementary-strong-500: #2b6875; +$ibexa-color-complementary-strong-400: #66949d; +$ibexa-color-complementary-strong-300: #99b7be; +$ibexa-color-complementary-strong-200: #ccdbde; +$ibexa-color-complementary-strong-100: #e5edee; + +// Ibexa fonts - part 1 +$ibexa-font-family: 'Noto Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !default; +$ibexa-font-family-headings: 'Work Sans', sans-serif; + +// boostrap variables +$white: $ibexa-color-white; +$gray-100: $ibexa-color-light-300; +$gray-200: $ibexa-color-light-300; +$gray-300: $ibexa-color-light-200; +$gray-400: $ibexa-color-light-200; +$gray-500: $ibexa-color-light-500; +$gray-600: $ibexa-color-light-500; +$gray-700: $ibexa-color-light; +$gray-800: $ibexa-color-light; +$gray-900: $ibexa-color-dark-300; +$black: $ibexa-color-black; + +$grays: ( + 100: $ibexa-color-light-300, + 200: $ibexa-color-light-300, + 300: $ibexa-color-light-200, + 400: $ibexa-color-light-200, + 500: $ibexa-color-light-500, + 600: $ibexa-color-light-500, + 700: $ibexa-color-light, + 800: $ibexa-color-light, + 900: $ibexa-color-dark-300, +); + +$blue: $ibexa-color-primary; +$red: $ibexa-color-primary; +$orange: $ibexa-color-primary; +$yellow: $ibexa-color-warning; +$green: $ibexa-color-success; +$teal: $ibexa-color-white; +$pink: #e83e8c !default; +$indigo: #6610f2 !default; +$purple: #6f42c1 !default; +$cyan: #17a2b8 !default; + +$colors: ( + 'blue': $ibexa-color-primary, + 'red': $ibexa-color-primary, + 'orange': $ibexa-color-primary, + 'yellow': $ibexa-color-warning, + 'green': $ibexa-color-success, + 'teal': $ibexa-color-white, + 'white': $ibexa-color-white, + 'gray': $ibexa-color-dark-300, + 'gray-dark': $pink, + 'indigo': $indigo, + 'purple': $purple, + 'pink': $pink, + 'cyan': $cyan, +); + +$theme-colors: ( + primary: $ibexa-color-primary, + secondary: $ibexa-color-dark-400, + success: $ibexa-color-success, + warning: $ibexa-color-warning, + danger: $ibexa-color-danger, + light: $ibexa-color-light-200, + dark: $ibexa-color-dark, + info: $cyan, +); + +// Typography +$base-font-size: 16px; +$small-font-size: calculateRem(14px) !default; +$h1-font-size: calculateRem(28px) !default; +$h2-font-size: calculateRem(22px) !default; +$h3-font-size: calculateRem(18px) !default; +$h4-font-size: calculateRem(16px) !default; +$h5-font-size: calculateRem(14px) !default; +$h6-font-size: calculateRem(12px) !default; + +$headings-font-weight: 700; +$headings-font-family: $ibexa-font-family-headings; + +$text-muted: $ibexa-color-dark-400 !default; + +// Fonts +$font-family-sans-serif: $ibexa-font-family; + +//Border +$ibexa-border-radius: calculateRem(10px); +$ibexa-border-radius-small: calculateRem(5px); + +// Tables +$table-cell-padding: calculateRem(12px) calculateRem(16px); +$table-bg: $white; +$table-border-width: 0; +$table-border-color: $ibexa-color-light-600; +$table-hover-bg: $ibexa-color-light-300; + +// Breadcrumbs +$breadcrumb-font-size: calculateRem(12px); +$breadcrumb-padding-y: 0; +$breadcrumb-padding-x: 0; +$breadcrumb-item-padding: calculateRem(8px); +$breadcrumb-bg: transparent; +$breadcrumb-divider: quote('>'); + +// Links +$link-decoration: underline; +$link-color: $ibexa-color-dark; +$link-hover-decoration: underline; +$link-hover-color: $ibexa-color-primary; + +// Body +$body-bg: $ibexa-color-white; +$body-color: $ibexa-color-dark; + +// Pagination +$pagination-color: $ibexa-color-dark; +$pagination-bg: $ibexa-color-white; +$pagination-border-width: calculateRem(1px); +$pagination-border-color: transparent; +$pagination-padding-y: 0; +$pagination-padding-x: 0; + +$pagination-focus-color: $ibexa-color-dark; +$pagination-focus-bg: transparent; + +$pagination-active-color: $ibexa-color-dark; +$pagination-active-bg: $ibexa-color-light-300; +$pagination-active-border-color: transparent; + +$pagination-hover-bg: transparent; +$pagination-hover-color: $ibexa-color-dark; +$pagination-hover-border-color: $ibexa-color-dark; + +$pagination-disabled-color: $ibexa-color-dark-200; +$pagination-disabled-bg: transparent; +$pagination-disabled-border-color: transparent; + +// Modals +$modal-header-padding-y: calculateRem(16px); +$modal-header-padding-x: 0; +$modal-header-border-width: calculateRem(1px); +$modal-header-border-color: $ibexa-color-light-500; +$modal-title-font-size: calculateRem(28px); +$modal-content-border-width: 0; +$modal-content-border-radius: $ibexa-border-radius; +$modal-inner-padding: calculateRem(24px); +$modal-footer-padding: calculateRem(24px) 0; +$modal-footer-border-width: 0; +//Components +$border-radius: $ibexa-border-radius; + +//Offcanvas +$offcanvas-padding-y: calculateRem(24px); +$offcanvas-padding-x: 0; + +//Cards +$card-spacer-x: 0; + +//Grid +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1470px, +) !default; + +//Inputs +$input-bg: transparent; +$input-color: $ibexa-color-dark; +$input-border-color: $ibexa-color-dark-300; +$input-box-shadow: none; + +$input-focus-bg: transparent; +$input-focus-border-color: $ibexa-color-primary; +$input-focus-color: $ibexa-color-dark-300; +$input-focus-box-shadow: 0 0 calculateRem(2px) 0 rgba($ibexa-color-primary, 0.75); + +//Buttons +$btn-line-height: calculateRem(16px); +$btn-font-size: calculateRem(15px); +$btn-padding-y: calculateRem(11px); +$btn-padding-x: calculateRem(16px); +$btn-border-width: 0; +$btn-focus-box-shadow: none; + +//Accordion +$accordion-border-width: 0; +$accordion-border-radius: 0; +$accordion-button-padding-y: calculateRem(8px); +$accordion-button-padding-x: calculateRem(12px); +$accordion-button-active-bg: $ibexa-color-white; +$accordion-button-active-color: $ibexa-color-dark; + +// Ibexa fonts - part 2 +$ibexa-text-font-size-extra-large: calculateRem(22px); +$ibexa-text-font-size-large: calculateRem(18px); +$ibexa-text-font-size: calculateRem(16px); +$ibexa-text-font-size-medium: calculateRem(14px); +$ibexa-text-font-size-small: calculateRem(12px); + +$ibexa-font-weight-normal: normal; +$ibexa-font-weight-bold: 600; + +// Ibexa shadows +$ibexa-btn-focus-box-shadow: 0 0 0 calculateRem(3px) rgba($ibexa-color-primary, 0.2); +$ibexa-btn-focus-box-shadow-info: 0 0 0 calculateRem(3px) rgba($ibexa-color-info, 0.2); +$ibexa-btn-hover-box-shadow: 0 calculateRem(22px) calculateRem(24px) 0 rgba($ibexa-color-danger, 0.2); +$ibexa-btn-hover-box-shadow-dark: 0 calculateRem(22px) calculateRem(24px) 0 rgba($ibexa-color-dark, 0.2); +$ibexa-btn-hover-box-shadow-info: 0 calculateRem(22px) calculateRem(24px) 0 rgba($ibexa-color-info, 0.5); +$ibexa-edit-header-box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.15); +$ibexa-edit-content-box-shadow: calculateRem(4px) calculateRem(35px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.15); +$ibexa-anchor-btn-hover-box-shadow: 0 0 calculateRem(14px) 0 rgba($ibexa-color-black, 0.05); +$ibexa-context-menu-box-shadow: 0 calculateRem(22px) calculateRem(24px) 0 rgba($ibexa-color-info, 0.15); +$ibexa-content-type-edit-field-shadow: calculateRem(4px) calculateRem(22px) calculateRem(19px) calculateRem(-10px) + rgba($ibexa-color-info, 0.05); + +// Ibexa gradients +$ibexa-gradient-danger-primary: linear-gradient(to right, $ibexa-color-danger 0%, $ibexa-color-primary 100%); diff --git a/public/bundles/ibexaadminui/scss/_custom.tooltip.scss b/public/bundles/ibexaadminui/scss/_custom.tooltip.scss new file mode 100644 index 000000000..48e48ffce --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_custom.tooltip.scss @@ -0,0 +1,160 @@ +.ibexa-tooltip { + z-index: 1500; + + &.show { + opacity: 1; + } + + &.bs-tooltip-top, + &[data-popper-placement='top'] { + .ibexa-tooltip__arrow { + height: calculateRem(8px); + + &::before { + border-top-color: $ibexa-color-white; + } + } + } + + &.bs-tooltip-end, + &[data-popper-placement='right'] { + .ibexa-tooltip__arrow { + width: calculateRem(8px); + + &::before { + border-right-color: $ibexa-color-white; + } + } + } + + &.bs-tooltip-bottom, + &[data-popper-placement='bottom'] { + .ibexa-tooltip__arrow { + height: calculateRem(8px); + + &::before { + border-bottom-color: $ibexa-color-white; + } + } + } + + &.bs-tooltip-start, + &[data-popper-placement='left'] { + .ibexa-tooltip__arrow { + width: calculateRem(8px); + + &::before { + border-left-color: $ibexa-color-white; + } + } + } + + &__inner { + padding: calculateRem(6px) calculateRem(11px); + max-width: calculateRem(300px); + border: calculateRem(1px) solid $ibexa-color-light-200; + border-radius: $ibexa-border-radius-small; + background-color: $ibexa-color-white; + color: $ibexa-color-dark; + font-size: $ibexa-text-font-size; + text-align: left; + line-height: calculateRem(21px); + box-shadow: 0 calculateRem(4px) calculateRem(6px) rgba(135, 135, 135, 0.35); + } + + &--ground-dark { + .ibexa-tooltip { + &__inner { + color: $ibexa-color-white; + background-color: $ibexa-color-complementary-strong; + } + } + + &.ibexa-tooltip { + &.bs-tooltip-top, + &[data-popper-placement='top'] { + .ibexa-tooltip__arrow { + &::before { + border-top-color: $ibexa-color-complementary-strong; + } + } + } + + &.bs-tooltip-end, + &[data-popper-placement='right'] { + .ibexa-tooltip__arrow { + &::before { + border-right-color: $ibexa-color-complementary-strong; + } + } + } + + &.bs-tooltip-bottom, + &[data-popper-placement='bottom'] { + .ibexa-tooltip__arrow { + &::before { + border-bottom-color: $ibexa-color-complementary-strong; + } + } + } + + &.bs-tooltip-start, + &[data-popper-placement='left'] { + .ibexa-tooltip__arrow { + &::before { + border-left-color: $ibexa-color-complementary-strong; + } + } + } + } + } + + &--info-neon { + .ibexa-tooltip { + &__inner { + color: $ibexa-color-dark; + background-color: $ibexa-color-info; + border-color: transparent; + box-shadow: 0 calculateRem(4px) calculateRem(6px) rgba($ibexa-color-info, 0.1); + } + } + + &.ibexa-tooltip { + &.bs-tooltip-top, + &[data-popper-placement='top'] { + .ibexa-tooltip__arrow { + &::before { + border-top-color: $ibexa-color-info; + } + } + } + + &.bs-tooltip-end, + &[data-popper-placement='right'] { + .ibexa-tooltip__arrow { + &::before { + border-right-color: $ibexa-color-info; + } + } + } + + &.bs-tooltip-bottom, + &[data-popper-placement='bottom'] { + .ibexa-tooltip__arrow { + &::before { + border-bottom-color: $ibexa-color-info; + } + } + } + + &.bs-tooltip-start, + &[data-popper-placement='left'] { + .ibexa-tooltip__arrow { + &::before { + border-left-color: $ibexa-color-info; + } + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_dashboard.scss b/public/bundles/ibexaadminui/scss/_dashboard.scss new file mode 100644 index 000000000..a5fa44ff5 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_dashboard.scss @@ -0,0 +1,10 @@ +.ibexa-dashboard { + &__create { + display: flex; + justify-content: flex-end; + } + + .table:not(.ibexa-table--draft-conflict) { + margin-bottom: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/_date-time-picker.scss b/public/bundles/ibexaadminui/scss/_date-time-picker.scss new file mode 100644 index 000000000..250f06c99 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_date-time-picker.scss @@ -0,0 +1,59 @@ +.ibexa-date-time-picker { + width: calculateRem(308px); + position: relative; + + &__input { + width: 100%; + padding: calculateRem(6px) calculateRem(36px) calculateRem(6px) calculateRem(12px); + + &[readonly] { + background-color: $ibexa-color-white; + } + + &[disabled] { + background-color: $ibexa-color-light-300; + } + } + + .flatpickr-wrapper { + width: 100%; + } + + .ibexa-input-text-wrapper { + &__actions { + top: calculateRem(24px); + } + } + + &--small { + .ibexa-input-text-wrapper__actions { + top: calculateRem(16px); + } + } + + &--inline-datetime-popup { + .ibexa-date-time-picker { + &__input { + margin-bottom: calculateRem(4px); + } + } + + .ibexa-input-text-wrapper__action-btn--calendar { + &:hover { + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + &:focus { + color: transparent; + border-color: transparent; + box-shadow: none; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_default-location.scss b/public/bundles/ibexaadminui/scss/_default-location.scss new file mode 100644 index 000000000..6442a3980 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_default-location.scss @@ -0,0 +1,29 @@ +.ibexa-default-location { + &__path-selector { + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-radius: $ibexa-border-radius; + padding: calculateRem(6px); + width: 80%; + display: flex; + align-items: center; + + .ibexa-btn__label--change { + display: none; + } + + &--filled { + .ibexa-btn__label--change { + display: inline; + } + + .ibexa-btn__label--select { + display: none; + } + } + } + + &__selected-path { + max-width: 70%; + margin-left: calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_details.scss b/public/bundles/ibexaadminui/scss/_details.scss new file mode 100644 index 000000000..94756c986 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_details.scss @@ -0,0 +1,43 @@ +.ibexa-details { + &:not(:first-child) { + margin-top: calculateRem(40px); + } + + &__items { + display: flex; + flex-wrap: wrap; + + &--vertical { + display: block; + } + } + + &__item { + flex-basis: 25%; + padding: calculateRem(8px) calculateRem(8px) calculateRem(8px) 0; + + .ibexa-label { + margin-top: calculateRem(8px); + margin-bottom: 0; + } + + &--break { + flex-basis: 100%; + height: 0; + } + } + + &__item-content { + .ibexa-dropdown { + margin-left: 0; + } + } + + &__header { + &--inline-headline { + .ibexa-table-header { + justify-content: flex-start; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_double-input-range.scss b/public/bundles/ibexaadminui/scss/_double-input-range.scss new file mode 100644 index 000000000..83e64e50b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_double-input-range.scss @@ -0,0 +1,17 @@ +.ibexa-double-input-range { + display: flex; + + &__separator { + border-bottom: calculateRem(1px) solid $ibexa-color-dark-300; + width: calculateRem(10px); + margin: calculateRem(24px) calculateRem(8px); + } + + &__inputs-wrapper { + display: flex; + } + + &--single-label { + flex-direction: column; + } +} diff --git a/public/bundles/ibexaadminui/scss/_dropdown-popover.scss b/public/bundles/ibexaadminui/scss/_dropdown-popover.scss new file mode 100644 index 000000000..ccb447bc8 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_dropdown-popover.scss @@ -0,0 +1,17 @@ +.ibexa-dropdown-popover { + &.popover { + max-width: initial; + background: initial; + border: 0; + pointer-events: all; // for popovers inside .modal-dialog + } + + .popover-arrow { + display: none; + } + + .popover-body { + padding: 0; + color: initial; + } +} diff --git a/public/bundles/ibexaadminui/scss/_dropdown.scss b/public/bundles/ibexaadminui/scss/_dropdown.scss new file mode 100644 index 000000000..d226bb4db --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_dropdown.scss @@ -0,0 +1,506 @@ +.ibexa-dropdown { + position: relative; + font-size: $ibexa-text-font-size-medium; + min-width: calculateRem(200px); + + select { + height: 100%; + width: 100%; + } + + &__source { + position: absolute; + height: 100%; + width: 100%; + opacity: 0; + } + + &__wrapper { + position: relative; + } + + &__selection-info { + color: $ibexa-color-dark; + line-height: calculateRem(21px); + height: calculateRem(48px); + padding: 0 calculateRem(36px) 0 calculateRem(16px); + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-radius: $ibexa-border-radius; + position: relative; + cursor: pointer; + display: flex; + align-items: center; + flex-wrap: nowrap; + margin-bottom: 0; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &::before, + &::after { + content: ''; + position: absolute; + z-index: 1; + top: 50%; + width: calculateRem(10px); + height: calculateRem(1px); + background: $ibexa-color-dark; + } + + &::before { + transform: rotate(135deg); + right: calculateRem(12px); + } + + &::after { + transform: rotate(-135deg); + right: calculateRem(19px); + } + + &.is-invalid { + @include input-invalid; + + .ibexa-dropdown__selected-item { + color: $ibexa-color-danger; + } + + &::before, + &::after { + background-color: $ibexa-color-danger; + } + } + } + + &__remove-selection { + display: inherit; + position: absolute; + top: 50%; + right: calculateRem(3px); + width: calculateRem(16px); + height: calculateRem(16px); + transform: translateY(-50%); + + &::before, + &::after { + content: ''; + width: calculateRem(1px); + height: calculateRem(11px); + background: $ibexa-color-dark; + position: absolute; + top: 50%; + left: 50%; + } + + &::before { + transform: translate(50%, -50%) rotate(-45deg); + } + + &::after { + transform: translate(50%, -50%) rotate(45deg); + } + } + + &__selected-item { + @include tag; + + margin-top: 0; + padding-left: calculateRem(8px); + padding-top: 0; + padding-bottom: 0; + margin-right: calculateRem(8px); + display: inline-block; + max-width: calculateRem(380px); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &--has-icon { + border-radius: 0; + } + } + + &__selected-item + &__selected-placeholder { + display: none; + } + + &__selected-placeholder, + &--single &__selected-item { + font-size: $ibexa-text-font-size-medium; + color: $ibexa-color-black-300; + background: transparent; + border: 0; + padding-right: 0; + padding-left: 0; + + .ibexa-dropdown__remove-selection { + display: none; + } + } + + &--single:not(&--disabled) &__selected-item:not(&__selected-placeholder) { + color: $ibexa-color-dark; + } + + &__selected-overflow-number { + padding-right: calculateRem(8px); + &:before { + content: '+'; + position: relative; + display: inline-block; + } + } + + &__selected-item-icon { + .ibexa-icon { + margin-right: calculateRem(8px); + } + } + + &__selection-toggler-btn { + display: flex; + margin: calculateRem(8px) calculateRem(21px) 0; + padding: 0; + border: none; + outline: none; + font-size: $ibexa-text-font-size-medium; + text-decoration: underline; + } + + &__items { + width: 100%; + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + color: $ibexa-color-dark; + border-radius: $ibexa-border-radius; + display: flex; + flex-direction: column; + + .ibexa-input-text-wrapper { + width: 100%; + padding: calculateRem(8px) calculateRem(12px); + + &__actions { + right: calculateRem(16px); + } + } + + &--search-hidden { + .ibexa-input-text-wrapper { + display: none; + } + } + } + + & &__items { + display: none; + } + + &__items-list { + list-style: none; + padding: calculateRem(8.5px); + margin: 0; + overflow-y: auto; + } + + &__item-check { + position: absolute; + right: calculateRem(4px); + display: none; + align-items: center; + justify-content: center; + width: calculateRem(20px); + height: calculateRem(20px); + border-radius: 50%; + background: $ibexa-color-light-400; + } + + &__item { + padding: calculateRem(9px) calculateRem(15px); + line-height: calculateRem(21px); + min-height: calculateRem(40px); + transition: background $ibexa-admin-transition-duration $ibexa-admin-transition; + border-radius: $ibexa-border-radius; + cursor: pointer; + display: flex; + align-items: center; + + &--hidden { + display: none; + } + + &--selected { + position: relative; + padding-right: calculateRem(36px); + + .ibexa-dropdown__item-check { + display: flex; + } + } + + .ibexa-input { + margin: 0 calculateRem(16px) 0 0; + } + + .ibexa-icon:not(.ibexa-dropdown__item-check-icon) { + margin-right: calculateRem(8px); + } + + &:hover { + background-color: $ibexa-color-light-300; + } + + &[disabled] { + color: $ibexa-color-dark-300; + + &:hover { + cursor: not-allowed; + } + } + + &[data-value=''] { + position: relative; + + &:after { + display: block; + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + } + } + + &__item-group { + &--hidden { + display: none; + } + } + + &__item-group-label { + font-weight: bold; + } + + &__item-group-list { + padding-left: 0; + } + + &__separator { + background-color: $ibexa-color-light-600; + } + + &__items-filter { + &.form-control { + margin-bottom: 0; + } + } + + &--focused { + .ibexa-dropdown { + &__selection-info { + border-color: $ibexa-color-primary; + box-shadow: 0 0 0 calculateRem(2px) rgba($ibexa-color-primary, 0.2); + } + } + } + + &--selector { + .ibexa-dropdown { + &__selection-info { + height: calculateRem(24px); + padding-left: calculateRem(8px); + border-radius: calculateRem(12px); + + &::before, + &::after { + width: calculateRem(6px); + } + + &::after { + right: calculateRem(16px); + } + } + + &__selected-item { + font-size: $ibexa-text-font-size-small; + } + } + + &.ibexa-dropdown:not(.ibexa-dropdown--disabled):not(.ibexa-dropdown--ghost):not(.is-invalid):hover { + .ibexa-dropdown { + &__selection-info { + border-color: $ibexa-color-dark; + background-color: transparent; + + &::before, + &::after { + background-color: $ibexa-color-dark; + } + } + + &__selected-item { + color: $ibexa-color-dark; + fill: $ibexa-color-dark; + } + } + } + + &:not(.ibexa-dropdown--disabled):not(:hover) { + &.ibexa-dropdown { + $versions: 'primary' $ibexa-color-primary $ibexa-color-primary $ibexa-color-primary-200, + 'secondary' $ibexa-color-dark $ibexa-color-dark $ibexa-color-light-400, + 'info' $ibexa-color-info $ibexa-color-info $ibexa-color-info-200, + 'danger' $ibexa-color-danger $ibexa-color-danger $ibexa-color-danger-200, + 'success' $ibexa-color-success-600 $ibexa-color-success $ibexa-color-success-200, + 'complementary' $ibexa-color-complementary $ibexa-color-complementary $ibexa-color-complementary-200; + + @each $name, $color-text, $color-border, $color-background in $versions { + &--#{$name} { + .ibexa-dropdown { + &__selection-info { + border-color: $color-border; + background-color: $color-background; + + &::before, + &::after { + background-color: $color-border; + } + } + + &__selected-item { + color: $color-text; + fill: $color-text; + } + } + } + } + } + } + } + + &:not(&--disabled):not(&--ghost):not(.is-invalid) { + .ibexa-dropdown { + &__selection-info { + &:hover { + border-color: $ibexa-color-primary; + + &::before, + &::after { + background-color: $ibexa-color-primary; + } + } + } + } + } + + &.is-invalid:not(&--disabled) { + .ibexa-dropdown { + &__selection-info { + background-image: none; + border-color: $ibexa-color-danger; + background-color: $ibexa-color-danger-100; + + &::before, + &::after { + background-color: $ibexa-color-danger; + } + } + + &__selected-item { + color: $ibexa-color-danger; + } + } + } + + &--small { + .ibexa-dropdown { + &__selection-info { + height: calculateRem(32px); + padding-top: 0; + padding-bottom: 0; + border-radius: $ibexa-border-radius-small; + } + } + } + + &--overflow { + .ibexa-dropdown { + &__selected-item { + max-width: calc(100% - #{calculateRem(40px)}); + } + } + } + + &--disabled { + .ibexa-dropdown { + &__selection-info { + background: $ibexa-color-light-300; + cursor: not-allowed; + + &::before, + &::after { + background-color: $ibexa-color-dark-400; + } + } + } + } + + &--ghost { + min-width: auto; + + .ibexa-dropdown { + &__selection-info { + border: none; + padding: 0 calculateRem(24px) 0 calculateRem(16px); + } + } + + &.ibexa-dropdown--disabled { + .ibexa-dropdown__selection-info { + background-color: transparent; + color: $ibexa-color-dark-300; + + &::before, + &::after { + background-color: $ibexa-color-dark-300; + } + } + } + } + + &--switcher { + .ibexa-dropdown { + &__selection-info { + border: none; + + &:hover { + .ibexa-dropdown__selected-item { + color: $ibexa-color-primary; + } + } + } + + &__item-label { + font-size: $ibexa-text-font-size-small; + } + } + } + + &--expanded { + .ibexa-dropdown__selection-info { + &::before { + transform: rotate(45deg); + } + + &::after { + transform: rotate(-45deg); + } + } + } +} + +.form-inline { + .ibexa-dropdown { + margin: calculateRem(5px) calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_edit-header.scss b/public/bundles/ibexaadminui/scss/_edit-header.scss new file mode 100644 index 000000000..71ad2675a --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_edit-header.scss @@ -0,0 +1,202 @@ +.ibexa-edit-header { + display: flex; + flex-direction: column; + background-color: $ibexa-color-white; + border-width: calculateRem(1px) calculateRem(1px) 0; + border-style: solid; + border-color: $ibexa-color-light-400; + border-top-left-radius: $ibexa-border-radius; + border-top-right-radius: $ibexa-border-radius; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition, border-bottom-width 0; + z-index: 1050; + + &__container { + display: flex; + flex-direction: column; + padding: 0 calculateRem(36px); + } + + &__title { + display: flex; + } + + &__name { + &--ellipsized { + display: none; + } + + &--full { + display: inline-block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + } + } + + &__row { + display: flex; + flex-wrap: nowrap; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &--top { + height: calculateRem(85px); + + .ibexa-edit-header__title { + height: 0; + opacity: 0; + } + } + + &--bottom { + flex-direction: column; + min-width: 60%; + min-height: calculateRem(150px); + } + } + + &__column { + position: static; + + &--main { + display: flex; + flex-direction: column; + justify-content: center; + padding-left: 0; + + .ibexa-icon { + margin-right: calculateRem(8px); + fill: $ibexa-color-dark-400; + } + } + + &--left { + max-width: 75%; + + .ibexa-label { + margin-bottom: 0; + color: $ibexa-color-dark-400; + } + } + + &--right { + .ibexa-autosave { + position: absolute; + top: calculateRem(96px); + right: calculateRem(64px); + } + } + } + + &__context-actions { + display: flex; + position: absolute; + top: calculateRem(36px); + right: calculateRem(64px); + width: 55%; + } + + &__tooltip { + margin-left: calculateRem(8px); + display: flex; + align-items: center; + justify-content: center; + } + + &__action-name-container { + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &__action-name { + color: $ibexa-color-dark-400; + opacity: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &__subtitle { + opacity: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &__separate-div { + position: relative; + z-index: 1; + width: 100%; + height: calculateRem(1px); + background: $ibexa-color-light; + transform: scaleX(0); + transition-duration: $ibexa-admin-transition-duration; + } + + &__extra-bottom-content { + margin-top: calculateRem(10px); + } + + &__bottom-row-line { + margin-top: auto; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + .ibexa-autosave { + opacity: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &--slim { + &.ibexa-edit-header--has-extra-content { + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + .ibexa-edit-header { + &__row { + &--bottom { + z-index: 1; + min-width: initial; + margin-top: calculateRem(-40px); + } + } + + &__row { + &--bottom { + min-height: initial; + } + } + + &__bottom-row-line { + border-bottom: none; + } + + &__action-name-container { + margin-top: calculateRem(-30px); + } + + &__separate-div { + transform: scaleX(1); + } + + &__subtitle { + opacity: 0; + height: 0; + overflow: hidden; + } + + &__title { + min-height: calculateRem(34px); + } + + &__name { + &--ellipsized { + display: inline-block; + } + + &--full { + display: none; + } + } + } + + .ibexa-autosave { + opacity: 0; + height: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_error-page.scss b/public/bundles/ibexaadminui/scss/_error-page.scss new file mode 100644 index 000000000..728afe3a4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_error-page.scss @@ -0,0 +1,31 @@ +.ibexa-error-page { + text-align: center; + + &__messages-container { + display: flex; + flex-direction: column; + } + + &__icon-wrapper { + display: flex; + justify-content: center; + align-items: center; + padding-top: calculateRem(46px); + } + + &__title { + margin-bottom: calculateRem(32px); + line-height: calculateRem(36px); + } + + &__subtitle { + font-weight: normal; + margin: 0; + line-height: calculateRem(27px); + } + + &__message { + padding-top: calculateRem(33px); + line-height: calculateRem(24px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_extra-actions.scss b/public/bundles/ibexaadminui/scss/_extra-actions.scss new file mode 100644 index 000000000..fee3821da --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_extra-actions.scss @@ -0,0 +1,213 @@ +.ibexa-extra-actions { + @include container-box-shadow-left; + + background-color: $ibexa-color-white; + padding: calculateRem(16px) 0; + width: calculateRem(700px); + + &__action { + display: block; + background: none; + border: 0 none; + width: 100%; + text-align: left; + border-radius: calculateRem(4px); + padding: 0 calculateRem(16px); + line-height: calculateRem(45px); + background: $ibexa-color-white; + color: $ibexa-color-primary; + text-decoration: none; + cursor: pointer; + transition: all 0.2s $ibexa-admin-transition; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + + &:hover, + &:focus { + background: $ibexa-color-light; + } + + &:active { + background: $ibexa-color-primary; + color: $ibexa-color-white; + } + } + + &__action + &__action { + margin-top: calculateRem(8px); + } + + &__header { + padding: calculateRem(8px) calculateRem(32px) calculateRem(24px); + font-weight: bold; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-start; + } + + &__header-subtitle { + width: 100%; + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size; + font-weight: normal; + } + + &__content { + padding: calculateRem(32px) 25% calculateRem(32px) calculateRem(32px); + max-height: calc(100% - #{calculateRem(90px)}); + overflow: auto; + + .form-group { + margin-bottom: 0; + } + + &--create { + padding-top: 0; + padding-bottom: 0; + } + } + + &__btns { + margin-top: calculateRem(42px); + display: flex; + + .ibexa-btn + .ibexa-btn { + margin-left: calculateRem(16px); + } + } + + &__confirm-wrapper { + margin-top: calculateRem(4px); + padding: calculateRem(16px) calculateRem(32px); + display: flex; + gap: calculateRem(16px); + } + + &--edit-user, + &--edit { + .form-check { + padding-left: 0; + } + + .ibexa-label { + background: $ibexa-color-white; + display: flex; + width: 100%; + padding: calculateRem(13px) calculateRem(10px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.05); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + cursor: pointer; + + &:hover { + border-color: $ibexa-color-dark; + transform: scale(1.02) translateX(-10px); + box-shadow: calculateRem(4px) calculateRem(10px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.2); + } + } + + .ibexa-input[type='radio'] { + display: none; + } + } + + &__section-content { + padding-bottom: calculateRem(32px); + background: $ibexa-color-white; + font-size: calculateRem(16px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + + select { + display: inline-block; + width: 75%; + } + } + + &--create { + .ibexa-extra-actions { + &__content { + max-height: calc(100% - #{calculateRem(157px)}); + overflow: auto; + } + + &__section-content--content-type { + padding: 0; + border: none; + } + } + + .form-check { + cursor: pointer; + transition: all 0.2s $ibexa-admin-transition; + margin-bottom: 0; + padding-left: 0; + + &:active, + &:hover, + &:focus { + color: $ibexa-color-primary; + } + } + + .form-check-label { + display: block; + margin: 0 0 0 calculateRem(42px); + } + + .form-check-input[type='radio'] { + display: none; + } + + .form-group { + button.btn { + &[type='submit'] { + display: none; + } + } + } + } +} + +.ibexa-extra-actions-container { + &__backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 150; + background-color: rgba($ibexa-color-dark, 0.4); + } + + .ibexa-extra-actions { + height: calc(100vh - #{calculateRem(73px)}); + position: fixed; + top: calculateRem(73px); + right: 0; + z-index: 200; + transform: translate(0, 0) scaleX(1); + transform-origin: right center; + transition: $ibexa-admin-widget-open-transition; + + &--hidden { + transform: translate(calc(100%), 0) scaleX(0); + transition: $ibexa-admin-widget-close-transition; + } + } +} + +.ibexa-main-container { + &--edit-container { + .ibexa-extra-actions { + top: calculateRem(16px); + height: calc(100vh - #{calculateRem(16px)}); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_field-group.scss b/public/bundles/ibexaadminui/scss/_field-group.scss new file mode 100644 index 000000000..bc71e0a46 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_field-group.scss @@ -0,0 +1,170 @@ +.ibexa-view-rawcontentview { + margin-bottom: calculateRem(25px); + background-color: $ibexa-color-white; + + .ibexa-raw-content-title { + margin-top: calculateRem(30px); + padding: 0 0 calculateRem(15px) 0; + color: $ibexa-color-black; + align-items: center; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + display: flex; + justify-content: space-between; + align-items: flex-end; + + h3 { + margin: 0; + } + + &__text { + margin: 0; + font-size: $ibexa-text-font-size-large; + line-height: calculateRem(33px); + color: $ibexa-color-black; + font-weight: 600; + } + + &__language-form { + display: flex; + + .ibexa-label { + margin: calculateRem(8px) calculateRem(8px) 0; + } + + .ibexa-dropdown { + margin: 0; + } + } + } +} + +.ibexa-fieldgroup { + &__header { + display: flex; + justify-content: space-between; + align-items: center; + font-weight: bold; + min-height: calculateRem(70px); + } + + &__name { + color: $ibexa-color-dark; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + padding: calculateRem(24px) calculateRem(8px); + font-weight: normal; + font-size: $ibexa-text-font-size; + } + + &__toggler-label-show { + display: none; + } + + &__toggler-label-hide { + display: inline; + } + + &__toggler { + position: relative; + display: block; + padding: calculateRem(24px) calculateRem(16px); + font-size: $ibexa-text-font-size-medium; + font-weight: normal; + color: $ibexa-color-black; + text-decoration: none; + + &:focus, + &:hover { + color: $ibexa-color-primary; + text-decoration: none; + + &::after { + border-top: calculateRem(5px) solid $ibexa-color-primary; + } + } + + &::after { + position: absolute; + top: calculateRem(33px); + right: 0; + content: ''; + border-left: calculateRem(5px) solid transparent; + border-right: calculateRem(5px) solid transparent; + border-top: calculateRem(5px) solid $ibexa-color-black; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &.collapsed { + .ibexa-fieldgroup { + &__toggler-label-show { + display: inline; + } + + &__toggler-label-hide { + display: none; + } + } + + &:after { + transform: rotate(180deg); + } + } + } + + &__content { + padding-left: calculateRem(32px); + padding-right: calculateRem(32px); + } + + .ibexa-content-field { + display: flex; + flex-direction: column; + margin-bottom: calculateRem(24px); + + &__name { + margin-bottom: calculateRem(8px); + color: $ibexa-color-dark-300; + font-size: $ibexa-text-font-size-small; + } + + &__value { + width: 100%; + + .ezstring-field, + .eztext-field { + display: inline-block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + } + + .ezcountry-field { + margin-bottom: 0; + } + + .ibexa-table-header { + margin-top: 0; + } + } + } + + .ibexa-field-preview { + &--ezobjectrelationlist { + .table { + margin-bottom: 0; + } + } + + &__meta-title-row { + th { + font-weight: normal; + padding-bottom: calculateRem(24px); + } + } + + &__meta-value-row { + td { + padding-bottom: calculateRem(10px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_filters.scss b/public/bundles/ibexaadminui/scss/_filters.scss new file mode 100644 index 000000000..826f5f6eb --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_filters.scss @@ -0,0 +1,119 @@ +.ibexa-filters { + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + padding-bottom: calculateRem(24px); + + .accordion-button { + &::after { + width: calculateRem(12px); + height: calculateRem(12px); + background-size: unset; + } + } + + &__btns { + text-align: center; + } + + &__item { + padding: calculateRem(4px) calculateRem(24px); + + &--language-selector { + padding-bottom: calculateRem(16px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &--content-type { + padding: 0; + } + + &--creator { + position: relative; + } + + &--subtree { + .ibexa-tag-view-select { + &__selected-list { + margin: 0; + } + + &__selected-item-tag { + margin-bottom: calculateRem(8px); + } + } + } + + .ibexa-dropdown__selection-info { + margin-bottom: 0; + } + + .ibexa-label { + font-size: $ibexa-text-font-size-medium; + font-weight: 600; + color: $ibexa-color-dark; + margin-top: calculateRem(16px); + margin-bottom: calculateRem(4px); + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + } + } + + &__range-wrapper { + height: 0; + opacity: 0; + background: $ibexa-color-white; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + pointer-events: none; + + &--visible { + height: calculateRem(40px); + opacity: 1; + pointer-events: auto; + margin-top: calculateRem(16px); + } + } + + &__range-select { + outline: none; + border-radius: $ibexa-border-radius-small; + } + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + padding: calculateRem(16px) calculateRem(24px); + } + + &__user-list { + padding: 0; + list-style: none; + position: absolute; + right: 0; + min-width: 100%; + border-radius: $ibexa-border-radius-small; + margin-bottom: 0; + background-color: $ibexa-color-light-200; + max-height: calculateRem(300px); + overflow: auto; + transform: scaleY(1); + transform-origin: top center; + transition: transform $ibexa-admin-transition-duration $ibexa-admin-transition; + z-index: 1; + + &--hidden { + transform: scaleY(0); + } + } + + &__user-item { + padding: calculateRem(8px) calculateRem(16px); + cursor: pointer; + } + + &__title { + margin-bottom: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/_flatpickr.scss b/public/bundles/ibexaadminui/scss/_flatpickr.scss new file mode 100644 index 000000000..e31d0fb92 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_flatpickr.scss @@ -0,0 +1,34 @@ +.ibexa-content-view .flatpickr-calendar { + &.animate.open { + -webkit-animation: eZfpFadeInDown 300ms cubic-bezier(0.23, 1, 0.32, 1); + animation: eZfpFadeInDown 300ms cubic-bezier(0.23, 1, 0.32, 1); + } +} + +.flatpickr-calendar { + .flatpickr-confirm { + .ibexa-icon { + margin-left: calculateRem(8px); + } + } +} + +@-webkit-keyframes eZfpFadeInDown { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes eZfpFadeInDown { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} diff --git a/public/bundles/ibexaadminui/scss/_fonts.scss b/public/bundles/ibexaadminui/scss/_fonts.scss new file mode 100644 index 000000000..4e589a315 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_fonts.scss @@ -0,0 +1,48 @@ +@font-face { + font-family: 'Noto Sans'; + src: url('/bundles/ibexaadminui/font/NotoSans-Regular.ttf'); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: 'Noto Sans'; + src: url('/bundles/ibexaadminui/font/NotoSans-SemiBold.ttf'); + font-weight: 600; + font-style: normal; +} + +@font-face { + font-family: 'Noto Sans'; + src: url('/bundles/ibexaadminui/font/NotoSans-Bold.ttf'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Noto Sans'; + src: url('/bundles/ibexaadminui/font/NotoSans-Italic.ttf'); + font-weight: 400; + font-style: italic; +} + +@font-face { + font-family: 'Noto Sans'; + src: url('/bundles/ibexaadminui/font/NotoSans-SemiBoldItalic.ttf'); + font-weight: 600; + font-style: italic; +} + +@font-face { + font-family: 'Noto Sans'; + src: url('/bundles/ibexaadminui/font/NotoSans-BoldItalic.ttf'); + font-weight: 700; + font-style: italic; +} + +@font-face { + font-family: 'Work Sans'; + src: url('/bundles/ibexaadminui/font/WorkSans-SemiBold.ttf'); + font-weight: 600; + font-style: normal; +} diff --git a/public/bundles/ibexaadminui/scss/_footer.scss b/public/bundles/ibexaadminui/scss/_footer.scss new file mode 100644 index 000000000..c37a6d4b4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_footer.scss @@ -0,0 +1,47 @@ +.ibexa-footer { + position: absolute; + bottom: 0; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + height: calculateRem(50px); + margin-top: calculateRem(24px); + padding: 0 calculateRem(24px); + background-color: $ibexa-color-white; + font-size: calculateRem(14px); + color: $ibexa-color-dark-300; + + &__brand-img { + margin-right: calculateRem(16px); + max-width: calculateRem(32px); + } + + &__link { + display: inline-block; + margin-left: calculateRem(24px); + font-size: calculateRem(14px); + color: $ibexa-color-dark-300; + } +} + +.ibexa-bookmark-list-view, +.ibexa-drafts-list-view { + .ibexa-main-row { + .ibexa-content-container { + .ibexa-footer { + margin: auto 0 0; + } + } + } +} + +.ibexa-main-row { + .ibexa-content-container { + .ibexa-footer { + position: relative; + width: auto; + margin: auto calculateRem(15px) 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_forms.scss b/public/bundles/ibexaadminui/scss/_forms.scss new file mode 100644 index 000000000..be7a1f706 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_forms.scss @@ -0,0 +1,111 @@ +form:not(.form-inline) { + .col-form-legend { + @include label-required(); + + font-weight: 700; + font-size: calculateRem(16px); + color: $ibexa-color-black; + margin-bottom: 0; + margin-top: calculateRem(20px); + } + + .form-control { + background-color: $ibexa-color-white; + } + + .form-control:not(.flatpickr-input)[readonly] { + color: $ibexa-color-dark-300; + background-color: $ibexa-color-light-300; + + &:focus { + outline: none; + box-shadow: none; + } + } + + .form-control:focus { + @include input-active; + } +} + +.ibexa-form-inline { + display: flex; + flex-flow: row wrap; + justify-content: flex-end; + + &--align-left { + justify-content: flex-start; + } + + .col-form-label, + .form-control, + .ibexa-field-edit__label { + margin-right: calculateRem(8px); + } +} + +.ibexa-table--no-border { + .ibexa-form-inline { + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + } +} + +.ibexa-field { + &__label { + @include label-required(); + } +} + +.ibexa-trash-with-asset-checkbox-list { + .form-check-input { + position: absolute; + } +} + +.ibexa-content-create[readonly] { + pointer-events: none; +} + +.ibexa-form-error { + display: flex; + font-size: $ibexa-text-font-size-small; + font-style: normal; + color: $ibexa-color-danger; + line-height: calculateRem(18px); + box-sizing: border-box; + + &:empty { + margin-top: 0; + } + + &:not(& > &) { + flex-direction: column; + } + + &__row { + display: flex; + align-items: center; + font-style: normal; + margin-top: calculateRem(4px); + } + + &__icon { + fill: $ibexa-color-danger; + margin-right: calculateRem(4px); + } +} + +.ibexa-form-help { + display: flex; + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + line-height: calculateRem(18px); + margin-top: calculateRem(8px); + + &__icon { + fill: $ibexa-color-dark-400; + margin-right: calculateRem(4px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_general.scss b/public/bundles/ibexaadminui/scss/_general.scss new file mode 100644 index 000000000..dd827bbe5 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_general.scss @@ -0,0 +1,208 @@ +html { + min-height: 100vh; + width: 100%; + font-size: $base-font-size; + line-height: 1.5; + letter-spacing: calculateRem(0.12px); +} + +body { + position: relative; + min-height: 100vh; + overflow: hidden; +} + +a { + transition: color $ibexa-admin-transition-duration $ibexa-admin-transition; + + &[disabled] { + color: $ibexa-color-dark-300; + } + + &:active, + &:focus, + &:hover { + color: $ibexa-color-primary; + } + + &:focus { + outline: none; + } +} + +button { + background: none; +} + +img { + display: inline-block; + max-width: 100%; + width: auto; + height: auto; +} + +.ibexa-scroll-disabled { + overflow: hidden; +} + +.ibexa-main-row { + min-height: calc(100vh - #{calculateRem(58px)}); + + &--edit { + background: $ibexa-color-white; + } +} + +.btn { + white-space: normal; + cursor: pointer; + transition: opacity 0.3s $ibexa-admin-transition, background 0.3s $ibexa-admin-transition; +} + +.ezrichtext-field { + display: inline-block; + width: 100%; + + .align-left { + float: left; + } + + .align-center { + text-align: center; + } + + .align-right { + float: right; + } + + blockquote { + margin: calculateRem(16px) calculateRem(40px); + } + + table { + td { + border-width: calculateRem(1px); + } + } +} + +.ibexa-login-view { + .ibexa-main-container { + height: 100vh; + display: block; + } +} + +.ibexa-visually-hidden, +.ibexa-visually-hidden[readonly] { + height: calculateRem(1px); + opacity: 0; + position: relative; + z-index: 0; +} + +.ibexa-spin { + animation: spin 1.75s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +.ibexa-content-preview { + .ibexa-main-container__content-column { + @include drag-module-backdrop-background; + } +} + +[disabled] { + cursor: not-allowed; +} + +select { + &.form-control:disabled, + &.form-control[disabled] { + opacity: 0.3; + } +} + +.ibexa-info-view, +.ibexa-content-view, +.ibexa-content-type-view, +.ibexa-content-type-group-list-view, +.ibexa-language-view, +.ibexa-language-list-view, +.ibexa-link-manager-view, +.ibexa-role-view, +.ibexa-role-list-view, +.ibexa-search-view, +.ibexa-section-view, +.ibexa-section-list-view, +.ibexa-trash-list-view, +.ibexa-bookmark-list-view, +.ibexa-object-state-group-list-view, +.ibexa-workflow-list-view, +.ibexa-segment-group-list-view { + background-color: $ibexa-color-white; + + .ibexa-main-container { + background-color: $ibexa-color-white; + } +} + +.ibexa-sticky-container { + position: -webkit-sticky; + position: sticky; + top: calculateRem(16px); + + > .btn { + .ibexa-icon { + margin-bottom: calculateRem(3px); + } + } +} + +.ibexa-dashboard-row { + flex-direction: column; +} + +.ibexa-scrollable-wrapper { + overflow: auto; + margin-bottom: calculateRem(12px); +} + +.ibexa-prevent-click, +.ibexa-prevent-click * { + pointer-events: none !important; +} + +.ibexa-is-tree-resizing { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.ibexa-container { + padding: calculateRem(32px); + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: $ibexa-edit-header-box-shadow; + margin-bottom: calculateRem(32px); + + .ibexa-table-header { + margin-top: 0; + } +} + +.ibexa-error-site { + .ibexa-main-container { + padding: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/_grid-view-item.scss b/public/bundles/ibexaadminui/scss/_grid-view-item.scss new file mode 100644 index 000000000..da3b1f7d4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_grid-view-item.scss @@ -0,0 +1,114 @@ +.ibexa-grid-view-item { + display: flex; + flex-direction: column; + position: relative; + padding: calculateRem(16px); + min-height: calculateRem(238px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: calculateRem(5px); + background: $ibexa-color-white; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-black, 0.05); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + min-width: calculateRem(216px); + max-width: calculateRem(216px); + margin: 0 calculateRem(14px) calculateRem(32px); + + &:link { + text-decoration: none; + } + + &:active, + &:hover, + &:focus { + color: $ibexa-color-dark; + border-color: $ibexa-color-dark; + text-decoration: none; + } + + &__content-type { + position: absolute; + z-index: 2; + top: 0; + left: 0; + width: calculateRem(30px); + height: calculateRem(30px); + background: $ibexa-color-white; + } + + &__content-type .ibexa-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + + &__image { + display: block; + width: auto; + height: auto; + max-width: calculateRem(184px); + max-height: calculateRem(248px); + } + + &__image-wrapper { + flex-grow: 1; + border-radius: calculateRem(5px); + margin-bottom: calculateRem(16px); + background: $ibexa-color-light-200; + + display: flex; + align-items: center; + justify-content: center; + } + + &__title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-decoration: none; + font-weight: 600; + line-height: calculateRem(21px); + } + + &__sub-title { + margin-top: calculateRem(4px); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-decoration: none; + font-size: $ibexa-text-font-size-small; + line-height: calculateRem(24px); + } + + &__checkbox { + position: absolute; + top: calculateRem(8px); + right: calculateRem(8px); + line-height: 1; + } + + &__info { + display: flex; + height: calculateRem(64px); + } + + &__status-container { + width: calculateRem(20px); + display: flex; + } + + &__title-container { + width: calc(100% - #{calculateRem(40px)}); + } + + &__actions-container { + position: relative; + display: flex; + justify-content: flex-end; + width: calculateRem(20px); + + .ibexa-popup-menu { + left: calculateRem(22px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_grid-view.scss b/public/bundles/ibexaadminui/scss/_grid-view.scss new file mode 100644 index 000000000..81de17f3f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_grid-view.scss @@ -0,0 +1,6 @@ +.ibexa-grid-view { + display: flex; + flex-wrap: wrap; + padding-top: calculateRem(24px); + margin: 0; +} diff --git a/public/bundles/ibexaadminui/scss/_header-user-menu.scss b/public/bundles/ibexaadminui/scss/_header-user-menu.scss new file mode 100644 index 000000000..d714a0ea3 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_header-user-menu.scss @@ -0,0 +1,85 @@ +.ibexa-header-user-menu { + display: flex; + justify-content: flex-end; + align-items: center; + + &__popup-menu { + z-index: 1060; + top: calculateRem(65px); + right: calculateRem(24px); + min-width: calculateRem(200px); + padding: 0; + + ul { + margin-bottom: 0; + padding: calculateRem(8px); + } + } + + &__popup-menu-title { + padding: calculateRem(16px) calculateRem(24px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size-small; + } + + &__toggler { + display: flex; + align-items: center; + margin-left: calculateRem(8px); + border: none; + + &::after { + content: ''; + width: 0; + height: 0; + margin-left: calculateRem(8px); + border-left: calculateRem(4px) solid transparent; + border-right: calculateRem(4px) solid transparent; + border-top: calculateRem(4px) solid $ibexa-color-white; + } + + &:hover { + &::after { + border-top: calculateRem(4px) solid $ibexa-color-info; + } + } + } + + &__thumbnail-wrapper { + display: flex; + border: calculateRem(3px) solid $ibexa-color-black; + border-radius: 50%; + } + + &__notifications-toggler { + display: flex; + align-items: flex-end; + position: relative; + height: calculateRem(24px); + padding-bottom: calculateRem(4px); + cursor: pointer; + + &:hover { + .ibexa-icon { + fill: $ibexa-color-info; + } + } + } + + &__notice-dot { + width: calculateRem(6px); + height: calculateRem(6px); + border-radius: 50%; + background: $ibexa-color-danger; + opacity: 1; + cursor: pointer; + position: absolute; + left: calculateRem(10px); + top: 0; + + &--no-notice { + opacity: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_header.scss b/public/bundles/ibexaadminui/scss/_header.scss new file mode 100644 index 000000000..d313ef677 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_header.scss @@ -0,0 +1,44 @@ +.ibexa-header { + &, + & + .container { + padding: 0; + } + + &--light { + background: $ibexa-color-white; + } + + &--content-edit { + padding-top: calculateRem(24px); + padding-bottom: calculateRem(24px); + background: $ibexa-color-white; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } +} + +.ibexa-page-header-wrapper { + display: flex; + flex-wrap: wrap; + padding: calculateRem(20px) 0; + + .ibexa-breadcrums-wrapper, + .ibexa-content-menu-wrapper { + flex-basis: 50%; + max-width: 50%; + } + + .breadcrumb, + .ibexa-context-menu { + min-height: calculateRem(64px); + } + + .ibexa-context-menu { + &--before-adaptive-items-init { + min-height: 0; + } + } + + .ibexa-header-wrapper { + width: 100%; + } +} diff --git a/public/bundles/ibexaadminui/scss/_icon-tag.scss b/public/bundles/ibexaadminui/scss/_icon-tag.scss new file mode 100644 index 000000000..8255794a9 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_icon-tag.scss @@ -0,0 +1,12 @@ +.ibexa-icon-tag { + display: flex; + align-items: center; + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size-medium; + margin-bottom: calculateRem(24px); + + .ibexa-icon { + margin-right: calculateRem(8px); + fill: $ibexa-color-dark-400; + } +} diff --git a/public/bundles/ibexaadminui/scss/_icons.scss b/public/bundles/ibexaadminui/scss/_icons.scss new file mode 100644 index 000000000..943aff288 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_icons.scss @@ -0,0 +1,109 @@ +.ibexa-icon { + width: calculateRem(32px); + height: calculateRem(32px); + transition: fill 0.3s $ibexa-admin-transition; + + &--tiny { + width: calculateRem(8px); + height: calculateRem(8px); + } + + &--tiny-small { + width: calculateRem(12px); + height: calculateRem(12px); + } + + &--small { + width: calculateRem(16px); + height: calculateRem(16px); + } + + &--small-medium { + width: calculateRem(20px); + height: calculateRem(20px); + } + + &--medium { + width: calculateRem(24px); + height: calculateRem(24px); + } + + &--medium-large { + width: calculateRem(38px); + height: calculateRem(38px); + } + + &--large { + width: calculateRem(48px); + height: calculateRem(48px); + } + + &--extra-large { + width: calculateRem(64px); + height: calculateRem(64px); + } + + &--dark { + fill: $ibexa-color-black; + } + + &--light { + fill: $ibexa-color-white; + } + + &--base-dark { + fill: $ibexa-color-dark-300; + } + + &--primary { + fill: $ibexa-color-primary; + } + + &--secondary { + fill: $ibexa-color-black; + } +} + +.ibexa-btn--extra-actions { + .ibexa-icon { + pointer-events: none; + } +} + +.ibexa-icon--logo { + width: calculateRem(128px); + height: calculateRem(112px); + display: block; + margin: 0 auto; +} + +.ibexa-preview__action { + .ibexa-icon { + width: calculateRem(24px); + height: calculateRem(24px); + fill: $ibexa-color-dark-300; + } + + &:hover, + &:focus { + .ibexa-icon { + fill: $ibexa-color-white; + } + } + + &.ibexa-preview__action--selected { + .ibexa-icon { + fill: $ibexa-color-white; + } + } +} + +.ibexa-btn--content-tree-expanded { + .ibexa-icon { + fill: $ibexa-color-black; + } +} + +.ibexa-icon--hidden { + display: none; +} diff --git a/public/bundles/ibexaadminui/scss/_inputs.scss b/public/bundles/ibexaadminui/scss/_inputs.scss new file mode 100644 index 000000000..5dada0493 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_inputs.scss @@ -0,0 +1,427 @@ +.form-control { + &--is-invalid { + @include input-invalid; + } +} + +.form-check-inline { + .ibexa-input { + position: relative; + + &--checkbox { + margin-bottom: calculateRem(1px); + } + + &--radio { + margin-bottom: 0; + } + } +} + +.ibexa-input { + outline: none; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + border: calculateRem(1px) solid $ibexa-color-dark-300; + + &:hover { + border-color: $ibexa-color-primary; + } + + &:focus, + &.ibexa-input--text.form-control:focus, + &.ibexa-input--date.form-control:focus { + border-color: $ibexa-color-primary; + box-shadow: 0 0 calculateRem(3px) 0 rgba($ibexa-color-primary, 0.75); + } + + &:disabled { + cursor: not-allowed; + border-color: $ibexa-color-dark-200; + } + + &--text, + &--textarea, + &--date { + font-size: $ibexa-text-font-size-medium; + color: $ibexa-color-dark; + line-height: calculateRem(21px); + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-radius: $ibexa-border-radius; + position: relative; + + &:focus, + &.form-control:focus { + color: $ibexa-color-dark; + } + + &:hover:not(:disabled) { + border-color: $ibexa-color-primary; + } + + &:active:not(:disabled) { + border-color: $ibexa-color-dark; + } + + &:disabled, + &.form-control:disabled { + color: $ibexa-color-dark-300; + background-color: $ibexa-color-light-300; + } + + &.form-control.is-invalid { + color: $ibexa-color-danger; + background-image: none; + border-color: $ibexa-color-danger; + background-color: $ibexa-color-danger-100; + } + + &::placeholder { + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size-medium; + line-height: calculateRem(21px); + } + } + + &--text, + &--date { + height: calculateRem(48px); + padding-right: calculateRem(36px); + + &[readonly] { + padding-right: calculateRem(12px); + } + } + + &--small { + height: calculateRem(32px); + padding-top: 0; + padding-bottom: 0; + border-radius: $ibexa-border-radius-small; + } + + &--textarea { + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition, box-shadow 0s; // Chrome does not render box-shadow properly with transition + height: calculateRem(120px); + padding: calculateRem(10px) calculateRem(16px); + } + + &--checkbox, + &--radio { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + position: relative; + display: inline-block; + cursor: pointer; + + &:disabled { + &.form-check-input:not(.ibexa-input--toggle) { + opacity: 1; + } + } + } + + &--checkbox { + width: calculateRem(16px); + height: calculateRem(16px); + border-radius: calculateRem(2px); + margin-bottom: calculateRem(3px); + background-color: transparent; + + &.form-check-input.form-check-input { + float: none; + border-radius: calculateRem(2px); + background-image: none; + } + + &::after { + content: ' '; + position: absolute; + top: calculateRem(3px); + left: calculateRem(3px); + display: block; + width: calculateRem(8px); + height: calculateRem(5px); + border-left: calculateRem(2px) solid transparent; + border-bottom: calculateRem(2px) solid transparent; + transform: rotate(-45deg); + } + + &:disabled { + background-color: $ibexa-color-light; + } + + &:checked { + border-color: $ibexa-color-primary; + background-color: $ibexa-color-primary; + + &:disabled { + border-color: $ibexa-color-primary-300; + background-color: $ibexa-color-primary-300; + } + + &::after { + border-color: $ibexa-color-white; + } + } + + &:indeterminate { + border-color: $ibexa-color-primary; + background-color: $ibexa-color-primary; + + &:disabled { + border-color: $ibexa-color-primary-300; + background-color: $ibexa-color-primary-300; + } + + &::after { + border-color: $ibexa-color-white; + background-color: $ibexa-color-white; + height: calculateRem(1px); + top: 50%; + transform: translateY(-50%); + } + } + } + + &--radio { + width: calculateRem(16px); + height: calculateRem(16px); + border-radius: calculateRem(8px); + margin-bottom: calculateRem(2px); + + &:checked { + border-color: $ibexa-color-primary; + box-shadow: inset 0 0 0 calculateRem(4px) $ibexa-color-primary; + + &:disabled { + border-color: $ibexa-color-primary-300; + box-shadow: inset 0 0 0 calculateRem(4px) $ibexa-color-primary-300; + } + + &:focus { + &::after { + content: ' '; + position: absolute; + display: block; + left: calculateRem(-1px); + top: calculateRem(-1px); + width: calculateRem(16px); + height: calculateRem(16px); + border-radius: calculateRem(8px); + background: transparent; + box-shadow: 0 0 calculateRem(3px) 0 rgba($ibexa-color-primary, 0.75); + } + } + } + } +} + +.ibexa-toggle { + display: flex; + align-items: center; + min-width: calculateRem(77px); + cursor: pointer; + + &__switcher { + box-sizing: content-box; + position: relative; + width: calculateRem(48px); + height: calculateRem(24px); + background-color: $ibexa-color-dark-200; + border: calculateRem(1px) solid $ibexa-color-white; + border-radius: calculateRem(24px); + cursor: pointer; + margin-bottom: 0; + } + + &__input, + &__input:disabled { + opacity: 0; + height: calculateRem(1px); + overflow: hidden; + } + + &__indicator { + width: calculateRem(18px); + height: calculateRem(18px); + display: block; + background-color: $ibexa-color-white; + border-radius: 50%; + position: absolute; + top: calculateRem(3px); + left: 0; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + transform: translateX(calculateRem(3px)); + cursor: pointer; + z-index: 1; + } + + &__label { + font-size: calculateRem(12px); + margin-left: calculateRem(8px); + user-select: none; + + &--off { + display: inline; + } + + &--on { + display: none; + } + } + + &--is-checked { + .ibexa-toggle { + &__switcher { + background-color: $ibexa-color-success; + } + + &__indicator { + transform: translateX(calculateRem(27px)); + background-color: $ibexa-color-white; + } + + &__label { + &--off { + display: none; + } + + &--on { + display: inline; + } + } + } + } + + &--is-disabled { + cursor: not-allowed; + + .ibexa-toggle { + &__switcher { + background-color: $ibexa-color-light-400; + cursor: not-allowed; + } + + &__indicator { + background-color: $ibexa-color-dark-300; + cursor: not-allowed; + } + + &__label { + color: $ibexa-color-black-300; + } + } + } + + &--is-focused { + .ibexa-toggle { + &__switcher { + box-shadow: 0 0 calculateRem(3px) 0 rgba($ibexa-color-primary, 0.75); + } + } + } + + &--small { + .ibexa-toggle { + &__switcher { + width: calculateRem(32px); + height: calculateRem(16px); + border-radius: calculateRem(16px); + } + + &__indicator { + width: calculateRem(10px); + height: calculateRem(10px); + } + } + + &.ibexa-toggle { + &--is-checked { + .ibexa-toggle { + &__indicator { + transform: translateX(calculateRem(19px)); + } + } + } + } + } +} + +.ibexa-input-text-wrapper { + position: relative; + + &__actions { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 50%; + right: calculateRem(8px); + transform: translate(0, -50%); + height: calculateRem(24px); + padding: 0; + fill: $ibexa-color-dark; + z-index: 1; + } + + &__action-btn { + display: flex; + align-items: center; + justify-content: center; + width: calculateRem(24px); + height: calculateRem(24px); + padding: 0; + } + + &--type-number { + max-width: calculateRem(150px); + + .ibexa-input-text-wrapper { + &__actions { + right: calculateRem(32px); + } + } + + .ibexa-input--text { + padding-right: calculateRem(12px); + } + } + + &--password, + &--search { + .ibexa-input--text { + padding-right: calculateRem(56px); + } + } + + &--extra-btn { + .ibexa-input-text-wrapper__actions { + right: 0; + } + + .ibexa-input-text-wrapper__action-btn--clear { + margin-right: calculateRem(5px); + } + } + + &:hover { + .ibexa-input { + border-color: $ibexa-color-primary; + } + } +} + +.ibexa-input--date:placeholder-shown + .ibexa-input-text-wrapper__actions .ibexa-input-text-wrapper__action-btn--clear, +.ibexa-input--text:placeholder-shown + .ibexa-input-text-wrapper__actions .ibexa-input-text-wrapper__action-btn--clear, +.ibexa-input--text:disabled + .ibexa-input-text-wrapper__actions .ibexa-input-text-wrapper__action-btn--clear, +.ibexa-input--text[hidden] + .ibexa-input-text-wrapper__actions, +.ibexa-input--text[readonly] + .ibexa-input-text-wrapper__actions { + display: none; +} + +.ibexa-input--text.is-invalid + .ibexa-input-text-wrapper__actions { + .ibexa-icon { + fill: $ibexa-color-danger; + } +} diff --git a/public/bundles/ibexaadminui/scss/_instant-filter.scss b/public/bundles/ibexaadminui/scss/_instant-filter.scss new file mode 100644 index 000000000..6dd7a1915 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_instant-filter.scss @@ -0,0 +1,76 @@ +.ibexa-instant-filter { + &__input { + display: block; + width: 100%; + } +} + +.ibexa-extra-actions--create { + .ibexa-instant-filter { + &__desc { + color: $ibexa-color-dark-400; + font-size: $ibexa-text-font-size-small; + padding-top: calculateRem(14px); + } + + &__group { + display: flex; + flex-wrap: wrap; + padding-bottom: calculateRem(16px); + + &:not(:last-of-type) { + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + } + + &__group-name { + margin: calculateRem(16px) 0 calculateRem(8px); + color: $ibexa-color-dark; + flex-basis: 100%; + font-size: $ibexa-text-font-size-small; + } + + &__group-item { + position: relative; + flex-basis: 50%; + padding: calculateRem(4px); + display: flex; + align-items: center; + + label { + cursor: pointer; + } + + .form-check { + width: 100%; + } + + .ibexa-icon { + fill: $ibexa-color-black; + position: absolute; + left: calculateRem(20px); + width: calculateRem(16px); + height: calculateRem(16px); + } + + &:hover { + .ibexa-label--checkbox-radio { + color: $ibexa-color-primary; + } + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + + &--selected { + background: $ibexa-color-light-300; + border-radius: $ibexa-border-radius; + } + } + + &__group-item-label-icon { + height: calculateRem(16px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_labels.scss b/public/bundles/ibexaadminui/scss/_labels.scss new file mode 100644 index 000000000..29d4dcdbb --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_labels.scss @@ -0,0 +1,44 @@ +.ibexa-label { + @include label-required(); + + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + line-height: calculateRem(18px); + margin-top: calculateRem(32px); + margin-bottom: calculateRem(8px); + padding-top: 0; + padding-bottom: 0; + + .ibexa-icon { + fill: $ibexa-color-dark-400; + } + + &--checkbox-radio { + font-size: calculateRem(14px); + line-height: calculateRem(21px); + color: $ibexa-color-dark; + margin: 0 0 calculateRem(9px); + + &.required { + &:after { + content: ''; + } + } + } +} + +.form-check-inline { + .ibexa-label { + &--checkbox-radio { + margin: 0; + } + } +} + +.ibexa-form-block { + .form-group:first-of-type { + .ibexa-label { + margin-top: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_links.scss b/public/bundles/ibexaadminui/scss/_links.scss new file mode 100644 index 000000000..b6a361f54 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_links.scss @@ -0,0 +1,23 @@ +.ibexa-link { + text-decoration: underline; + transition: all 0.2s $ibexa-admin-transition; + + &:hover { + color: $ibexa-color-primary; + } + + &--no-hover-color { + &:hover { + color: inherit; + text-decoration: none; + } + } + + &--light { + color: $ibexa-color-light; + } + + &--dark { + color: $ibexa-color-dark; + } +} diff --git a/public/bundles/ibexaadminui/scss/_list-search.scss b/public/bundles/ibexaadminui/scss/_list-search.scss new file mode 100644 index 000000000..27c947f93 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_list-search.scss @@ -0,0 +1,41 @@ +.ibexa-list-search { + display: flex; + justify-content: space-between; + padding: calculateRem(24px); + border-radius: $ibexa-border-radius; + border: calculateRem(1px) solid $ibexa-color-light; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + &__form-wrapper { + flex: 3; + + form { + display: flex; + } + + input[type='search'], + .ibexa-input-text-wrapper { + width: calculateRem(410px); + } + } + + &__search-button { + position: relative; + margin-left: calculateRem(-48px); + } + + &__pagination-wrapper { + display: flex; + flex: 2; + justify-content: flex-end; + border-left: calculateRem(1px) solid $ibexa-color-light; + } + + &--empty-pagination { + .ibexa-list-search { + &__pagination-wrapper { + border-left: none; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_location-swap-form.scss b/public/bundles/ibexaadminui/scss/_location-swap-form.scss new file mode 100644 index 000000000..e5627cf01 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_location-swap-form.scss @@ -0,0 +1,12 @@ +.ibexa-location-swap-form { + max-width: calculateRem(700px); + margin-top: calculateRem(24px); + padding: calculateRem(34px) calculateRem(21px); + border-radius: $ibexa-border-radius; + border: calculateRem(1px) solid $ibexa-color-dark-200; + + &__label { + font-size: $ibexa-text-font-size-medium; + margin-bottom: calculateRem(42px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_login.scss b/public/bundles/ibexaadminui/scss/_login.scss new file mode 100644 index 000000000..2f18fd9ab --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_login.scss @@ -0,0 +1,121 @@ +.ibexa-login { + height: 100%; + min-height: 100vh; + overflow: auto; + background-image: url('/bundles/ibexaadminui/img/login-background.jpg'); + background-size: cover; + + .ibexa-label { + margin-top: calculateRem(40px); + } + + &__logo { + position: absolute; + top: calculateRem(30px); + left: calculateRem(30px); + max-width: calculateRem(100px); + } + + &__info-col { + color: $ibexa-color-white; + display: flex; + flex-direction: column; + justify-content: space-between; + padding: calculateRem(24px); + max-height: 90vh; + } + + &__info-headline { + font-size: calculateRem(60px); + } + + &__actions-col { + position: relative; + display: flex; + flex-direction: column; + color: $ibexa-color-dark; + background: $ibexa-color-white; + min-height: calculateRem(600px); + border-radius: $ibexa-border-radius; + padding: calculateRem(90px) calculateRem(120px); + align-self: flex-start; + } + + &__content-wrapper { + display: flex; + flex-direction: column; + justify-content: center; + } + + &__content-row { + justify-content: center; + padding: calculateRem(48px) 0; + } + + &__support-wrapper { + position: relative; + padding-top: calculateRem(24px); + } + + &__support-content { + font-size: $ibexa-text-font-size-medium; + + &::before { + content: ''; + width: calculateRem(100px); + height: calculateRem(4px); + background-image: $ibexa-gradient-danger-primary; + position: absolute; + top: 0; + } + } + + &__support-headline { + margin-bottom: calculateRem(16px); + } + + &__errors-container { + margin-top: calculateRem(32px); + + & + .has-error { + .ibexa-label { + margin-top: 0; + } + } + } + + &__btn { + margin-top: calculateRem(16px); + + &--register, + &--sign-in { + width: 100%; + justify-content: center; + margin-top: calculateRem(40px); + } + + &--back { + position: absolute; + top: 0; + left: 0; + display: flex; + align-items: center; + } + + &--reset-password, + &--change-password { + margin-top: calculateRem(32px); + } + } + + &__link-wrapper { + display: flex; + justify-content: center; + margin-top: calculateRem(14px); + font-size: $ibexa-text-font-size-medium; + } + + &__forgot-password-form { + margin-top: calculateRem(16px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_main-container.scss b/public/bundles/ibexaadminui/scss/_main-container.scss new file mode 100644 index 000000000..079ec58af --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_main-container.scss @@ -0,0 +1,95 @@ +.ibexa-main-container { + $edit-container-padding: calculateRem(16px); + + display: flex; + flex-wrap: nowrap; + overflow: hidden; + height: calc(100vh - #{calculateRem(73px)}); + + &__content-column { + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + overflow-y: auto; + box-shadow: $ibexa-edit-content-box-shadow; + } + + &--edit-container { + height: 100vh; + padding: $edit-container-padding; + background-color: $ibexa-color-dark; + + &::before, + &::after { + content: ''; + height: $edit-container-padding; + position: absolute; + width: 100%; + background-color: $ibexa-color-dark; + z-index: 1050; + } + + &::before { + top: 0; + } + + &::after { + bottom: 0; + } + + .ibexa-main-container { + &__side-column { + min-width: calculateRem(240px); + border-top-left-radius: $ibexa-border-radius; + border-bottom-left-radius: $ibexa-border-radius; + background-color: $ibexa-color-light-100; + } + + &__content-column { + border-top-right-radius: $ibexa-border-radius; + border-bottom-right-radius: $ibexa-border-radius; + background-color: $ibexa-color-light-100; + } + } + + &.ibexa-main-container { + &--with-anchor-menu-items { + .ibexa-main-container { + &__side-column { + min-width: calculateRem(330px); + max-width: calculateRem(470px); + width: 25vw; + } + } + } + + &--no-border { + padding: 0; + + .ibexa-main-container { + &__side-column { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + &__content-column { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + &::before, + &::after { + display: none; + } + } + } + } + + .ibexa-content-container { + display: flex; + flex-direction: column; + flex: 1 1 80%; + } +} diff --git a/public/bundles/ibexaadminui/scss/_main-header.scss b/public/bundles/ibexaadminui/scss/_main-header.scss new file mode 100644 index 000000000..64bda6730 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_main-header.scss @@ -0,0 +1,113 @@ +.ibexa-main-header { + width: 100%; + display: flex; + justify-content: space-between; + padding: calculateRem(12px) calculateRem(21px); + background: $ibexa-color-dark; + border-bottom: calculateRem(1px) solid rgba($ibexa-color-info, 0.4); + + &__brand-column { + flex: 1; + display: flex; + align-items: center; + } + + &__brand { + display: inline-block; + } + + &__brand-image { + max-width: calculateRem(120px); + max-height: calculateRem(32px); + } + + &__search-column { + flex: 3; + display: flex; + justify-content: center; + + form { + width: 100%; + max-width: calculateRem(670px); + + .ibexa-input-text-wrapper--search { + width: auto; + + .ibexa-icon { + fill: $ibexa-color-light; + } + } + } + } + + &__search { + height: calculateRem(48px); + color: $ibexa-color-white; + border-color: $ibexa-color-info; + background: $ibexa-color-info-800; + + &.ibexa-input--text:not(:focus):placeholder-shown { + border-color: transparent; + } + + &.ibexa-input--text { + &:not(:disabled) { + &:focus, + &:hover { + border-color: $ibexa-color-info; + background: $ibexa-color-info-800; + } + } + } + + &.form-control:focus { + color: $ibexa-color-light; + } + + &::placeholder { + color: $ibexa-color-light; + } + } + + .ibexa-input-text-wrapper__action-btn { + &:hover { + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &--search { + background: $ibexa-color-info-600; + width: calculateRem(58px); + height: calculateRem(48px); + transform: translateX(10px); + + &:hover { + box-shadow: 0 calculateRem(22px) calculateRem(24px) 0 rgba($ibexa-color-info, 0.2); + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + } + } + + &__user-menu-column { + flex: 1; + display: flex; + align-items: center; + justify-content: flex-end; + } + + .ibexa-input--text:not(:focus):placeholder-shown + .ibexa-input-text-wrapper__actions .ibexa-input-text-wrapper__action-btn--search { + background-color: transparent; + + &:hover { + box-shadow: none; + + .ibexa-icon { + fill: $ibexa-color-info; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_main-menu.scss b/public/bundles/ibexaadminui/scss/_main-menu.scss new file mode 100644 index 000000000..3c6607c37 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_main-menu.scss @@ -0,0 +1,335 @@ +.ibexa-main-menu { + @mixin hidden-main-menu-node { + width: 0; + height: 0; + margin: 0; + padding: 0; + opacity: 0; + border: none; + } + + display: flex; + height: calc(100vh - #{calculateRem(72px)}); + + &__navbar { + font-size: $ibexa-text-font-size-medium; + background-color: $ibexa-color-black-600; + transition: width $ibexa-admin-transition-duration; + border: calculateRem(1px) solid $ibexa-color-info-800; + border-top: none; + overflow-y: auto; + overflow-x: hidden; + + &--first-level { + display: flex; + width: calculateRem(276px); + background-color: $ibexa-color-dark; + overflow: hidden; + + &.ibexa-main-menu__navbar--collapsed { + width: calculateRem(72px); + } + + .ibexa-main-menu { + &__item-action { + border: calculateRem(1px) solid transparent; + + &.active:not(.ibexa-main-menu__item-action--selected) { + border: calculateRem(1px) solid $ibexa-color-info; + background-color: transparent; + } + + &--selected { + color: $ibexa-color-info; + background-color: $ibexa-color-info-800; + + .ibexa-main-menu { + &__item-icon { + fill: $ibexa-color-info; + } + + &__item-text-column { + color: $ibexa-color-info; + } + } + } + } + } + } + + &--second-level { + position: relative; + width: calculateRem(220px); + padding-bottom: calculateRem(32px); + border-left: none; + + .ibexa-main-menu { + &__items-list { + width: calculateRem(216px); + transition: width $ibexa-admin-transition-duration; + padding-top: calculateRem(8px); + } + + &__item { + padding: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + &--popup-container { + margin: 0; + } + } + + &__item-text-column { + padding: calculateRem(10px); + + &--group { + padding: calculateRem(9px) calculateRem(10px) calculateRem(5px); + color: $ibexa-color-light-700; + font-size: $ibexa-text-font-size-small; + } + } + } + + &.ibexa-main-menu__navbar--collapsed { + width: calculateRem(48px); + overflow: visible; + + .ibexa-main-menu { + &__items-list { + width: calculateRem(48px); + } + + &__item { + @include hidden-main-menu-node; + + &--popup-container { + display: flex; + justify-content: center; + align-items: flex-start; + width: inherit; + height: calculateRem(80px); + opacity: 1; + } + } + + &__toggler { + margin-right: calculateRem(6px); + } + } + + .ibexa-main-menu__item { + &--group-name { + width: 0; + } + } + } + } + + &--hidden { + @include hidden-main-menu-node; + + .ibexa-main-menu__toggler-container { + display: none; + } + } + + &--collapsed { + .ibexa-main-menu__item-text-column { + @include hidden-main-menu-node; + } + } + + &--resizing { + transition: none; + } + } + + &__items-list { + display: flex; + flex-direction: column; + flex: 1; + align-items: center; + width: inherit; + margin: 0; + padding: 0; + list-style: none; + } + + &__item { + width: 100%; + padding: calculateRem(8px) 0; + opacity: 1; + + &--popup-container { + @include hidden-main-menu-node; + + overflow: hidden; + } + + .ibexa-popup-menu { + width: calculateRem(250px); + top: calculateRem(12px); + left: calculateRem(48px); + + &__item-content { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + + &--group-name { + color: $ibexa-color-light-700; + position: relative; + margin-top: calculateRem(13px); + + & > .ibexa-main-menu__item-action { + height: initial; + } + + .ibexa-main-menu__item-action + .ibexa-main-menu__items-list { + padding-top: 0; + } + + &::after { + content: ''; + width: calc(100% + #{calculateRem(22px)}); + height: calculateRem(1px); + background: $ibexa-color-info-800; + position: absolute; + top: 0; + left: calculateRem(-6px); + } + } + } + + &__item-action { + display: flex; + align-items: center; + margin: 0 calculateRem(12px); + padding: 0; + text-decoration: none; + border-radius: $ibexa-border-radius; + border: calculateRem(2px) solid transparent; + height: calculateRem(48px); + min-width: calculateRem(48px); + + &:focus { + border-color: $ibexa-color-info-800; + } + + &:hover { + color: $ibexa-color-info; + border-color: transparent; + text-decoration: none; + + .ibexa-main-menu { + &__item-icon { + fill: $ibexa-color-info; + } + + &__item-text-column { + color: $ibexa-color-info; + + &--group { + color: $ibexa-color-light-700; + } + } + } + } + + &.active { + color: $ibexa-color-info; + background-color: $ibexa-color-info-800; + + .ibexa-main-menu { + &__item-icon { + fill: $ibexa-color-info; + } + + &__item-text-column { + color: $ibexa-color-info; + } + } + } + } + + &__item-icon-column { + padding: calculateRem(10px); + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + + &__item-text-column { + opacity: 1; + width: 100%; + overflow: hidden; + padding: calculateRem(10px) calculateRem(10px) calculateRem(10px) calculateRem(4px); + color: $ibexa-color-white; + } + + &__separator { + width: 100%; + position: relative; + + &::after { + content: ''; + width: calc(100% + #{calculateRem(12px)}); + height: calculateRem(1px); + background: $ibexa-color-info-800; + position: absolute; + top: 0; + left: calculateRem(-6px); + } + + &--top { + margin-top: auto; + } + + &--bottom { + width: calc(100% - #{calculateRem(32px)}); + margin: 0 auto; + } + } + + &__resizer { + position: absolute; + top: 0; + right: 0; + width: calculateRem(1px); + height: 100%; + background-color: rgba($ibexa-color-dark, 0.8); + + &:hover { + background-color: $ibexa-color-info; + cursor: col-resize; + width: calculateRem(6px); + } + } + + &__toggler-container { + position: fixed; + bottom: 0; + display: flex; + justify-content: flex-end; + align-items: center; + width: inherit; + height: calculateRem(48px); + } + + &__toggler { + height: calculateRem(44px); + margin-right: calculateRem(16px); + padding: calculateRem(5px); + justify-content: center; + align-items: center; + } + + &__first-level-popup-menu { + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(67px) 0 rgba($ibexa-color-info, 0.5); + } +} diff --git a/public/bundles/ibexaadminui/scss/_main-nav.scss b/public/bundles/ibexaadminui/scss/_main-nav.scss new file mode 100644 index 000000000..661b4c304 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_main-nav.scss @@ -0,0 +1,59 @@ +.ibexa-main-nav { + flex-wrap: wrap; + padding: 0; + background-color: $ibexa-color-white; + border-bottom: calculateRem(1px) solid $ibexa-color-accent-200; + + > .container-fluid { + padding-right: 0; + } + + .navbar-brand { + max-width: calculateRem(88px); + max-height: calculateRem(24px); + padding-top: 0; + text-align: center; + } + + .nav-tabs { + background-color: $ibexa-color-white; + border: none; + + .nav-link { + margin: 0; + padding: calculateRem(17px) calculateRem(24px); + color: $ibexa-color-black; + font-size: calculateRem(14px); + transition: all 0.3s $ibexa-admin-transition; + + .ibexa-icon { + margin-right: calculateRem(8px); + } + + &:hover, + &.active { + border-bottom-color: transparent; + color: $ibexa-color-primary; + } + } + } +} + +.ibexa-main-sub-nav { + padding: 0 calculateRem(16px) 0 calculateRem(103px); + background-color: $ibexa-color-white; + + .navbar-nav { + .nav-link { + padding: calculateRem(9px) calculateRem(24px); + font-size: calculateRem(14px); + color: $ibexa-color-black; + text-decoration: none; + + &:hover, + &.active { + color: $ibexa-color-primary; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_middle-ellipsis.scss b/public/bundles/ibexaadminui/scss/_middle-ellipsis.scss new file mode 100644 index 000000000..f6710f795 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_middle-ellipsis.scss @@ -0,0 +1,55 @@ +.ibexa-middle-ellipsis { + position: relative; + display: inline-flex; + max-width: 100%; + + &--ellipsized { + .ibexa-middle-ellipsis { + &__name { + &--start { + margin-right: calculateRem(-10px); + } + + &--end { + margin-left: calculateRem(-10px); + width: 100%; + } + } + + &__separator { + display: inline-block; + } + } + } + + &__separator { + position: absolute; + left: 50%; + transform: translateX(-50%); + display: none; + } + + &__name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: transparent; + + &--start, + &--end { + .ibexa-middle-ellipsis__name-ellipsized { + color: $ibexa-color-black; + } + } + + &--start { + width: 100%; + } + + &--end { + width: 0; + direction: rtl; + text-align: right; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_mixins.scss b/public/bundles/ibexaadminui/scss/_mixins.scss new file mode 100644 index 000000000..55ae909c8 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_mixins.scss @@ -0,0 +1,146 @@ +@import 'custom'; +@import 'functions/calculate.rem'; +@import 'mixins/image-preview'; +@import 'mixins/type-icon'; +@import 'mixins/inputs'; +@import 'mixins/general'; +@import 'mixins/tags'; +@import 'mixins/modals'; +@import 'mixins/togglers'; +@import 'mixins/pagination'; +@import 'mixins/font'; +@import 'mixins/containers'; +@import 'mixins/drag-and-drop'; +@import 'mixins/spinner'; + +@mixin datetime-field() { + &.is-invalid { + .ibexa-label { + color: $ibexa-color-danger; + } + + .ibexa-input-text-wrapper__action-btn { + .ibexa-icon { + fill: $ibexa-color-danger; + } + } + + .ibexa-data-source__input { + border: calculateRem(1px) solid $ibexa-color-danger; + background: $ibexa-color-danger-100; + } + } + + .ibexa-data-source__input-wrapper { + max-width: 30ch; + position: relative; + } + + .ibexa-data-source__btn--clear-input { + position: absolute; + top: 50%; + right: calculateRem(32px); + transform: translate(0, -50%); + background: none; + border: 0; + width: calculateRem(24px); + height: calculateRem(24px); + line-height: calculateRem(8px); + text-align: center; + padding: 0; + margin: 0; + cursor: pointer; + outline: none; + + .ibexa-icon { + transition: fill $ibexa-admin-transition-duration $ibexa-admin-transition; + width: calculateRem(8px); + height: calculateRem(8px); + } + + &:hover, + &:focus { + .ibexa-icon { + fill: $ibexa-color-dark-400; + } + } + } + + .ibexa-icon--date { + position: absolute; + top: 50%; + right: calculateRem(12px); + transform: translate(0, -50%); + } + + .flatpickr-input { + &.is-invalid.form-control[readonly] { + @include input-invalid(); + } + } +} + +@mixin label-required() { + &.required { + &:after { + content: '* '; + } + } +} + +@mixin ibexa-btn-preview-action { + padding: 0; + border: 0 none; + border-radius: 50%; + height: calculateRem(40px); + width: calculateRem(40px); + line-height: calculateRem(40px); + cursor: pointer; + transition: background 0.3s $ibexa-admin-transition; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + + .ibexa-icon { + height: calculateRem(24px); + width: calculateRem(24px); + } +} + +@mixin map-input-invalid() { + &.is-invalid { + .ibexa-data-source__label { + color: $ibexa-color-danger; + } + + .ibexa-data-source__input { + border: calculateRem(1px) solid $ibexa-color-danger; + background: $ibexa-color-danger-100; + } + } +} + +@mixin exclamation-mark-error { + position: relative; + + &:before { + content: '!'; + position: absolute; + top: calculateRem(10px); + left: calculateRem(-10px); + color: $ibexa-color-danger; + text-align: center; + font-size: calculateRem(24px); + width: calculateRem(20px); + height: calculateRem(36px); + } +} + +@mixin nav-item-active-hover { + background-color: $ibexa-white; + border-top-color: $ibexa-white; + border-right-color: $ibexa-white; + border-bottom-color: $ibexa-color-primary; + border-left-color: $ibexa-white; +} diff --git a/public/bundles/ibexaadminui/scss/_modals.scss b/public/bundles/ibexaadminui/scss/_modals.scss new file mode 100644 index 000000000..51393a981 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_modals.scss @@ -0,0 +1,78 @@ +.ibexa-modal { + .modal-dialog { + @include modal-main(); + } + + .modal-content { + @include modal-content(); + } + + .modal-header { + @include modal-header(); + + .modal-title { + @include modal-title(); + } + + .close { + @include close-button(); + } + } + + .modal-body { + @include modal-body(); + } + + .modal-footer { + @include modal-footer(); + } + + &--no-header { + .close { + @include close-button(); + + top: calculateRem(22px); + right: calculateRem(18px); + } + + .modal-body { + padding-bottom: 0; + margin-right: calculateRem(36px); + } + } + + &--has-subtitle { + .modal-header { + border-bottom: 0; + padding-bottom: 0; + } + + .ibexa-modal__subheader { + border-bottom: calculateRem(1px) solid $ibexa-color-light-500; + padding-bottom: calculateRem(16px); + color: $ibexa-color-dark-400; + } + } + + &--no-header-border { + &:not(.ibexa-modal--has-subtitle) { + .modal-header { + border-width: 0; + } + + .modal-body { + padding-top: 0; + } + } + + &.ibexa-modal--has-subtitle { + .ibexa-modal__subheader { + border-width: 0; + } + + .modal-body { + padding-top: 0; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_notifications-menu.scss b/public/bundles/ibexaadminui/scss/_notifications-menu.scss new file mode 100644 index 000000000..7ada96c63 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_notifications-menu.scss @@ -0,0 +1,42 @@ +.ibexa-main-nav { + .ibexa-user-menu { + &__name-wrapper { + .n-pending-notifications { + position: relative; + + &:before { + content: ''; + width: calculateRem(8px); + height: calculateRem(8px); + border-radius: 50%; + background: $ibexa-color-primary; + position: absolute; + top: calculateRem(18px); + left: calculateRem(-15px); + } + } + } + + &__item { + &--notifications { + position: relative; + + &:after { + content: attr(data-count); + position: absolute; + right: calculateRem(8px); + top: 48%; + transform: translateY(-50%); + font-size: calculateRem(14px); + width: calculateRem(20px); + height: calculateRem(20px); + background: $ibexa-color-primary; + border-radius: 50%; + color: $ibexa-color-white; + text-align: center; + line-height: calculateRem(20px); + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_notifications-modal.scss b/public/bundles/ibexaadminui/scss/_notifications-modal.scss new file mode 100644 index 000000000..69032e746 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_notifications-modal.scss @@ -0,0 +1,134 @@ +.ibexa-notifications-modal { + cursor: auto; + + .modal-dialog { + max-width: 60vw; + } + + .modal-header { + .modal-title { + &::after { + content: attr(data-notifications-total); + } + } + } + + .table { + table-layout: fixed; + white-space: normal; + margin-bottom: 0; + + th { + border: none; + color: $ibexa-color-dark-300; + border-top: calculateRem(1px) solid $ibexa-color-light; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + tr { + background-color: $ibexa-color-white; + cursor: pointer; + + td { + vertical-align: top; + } + } + } + + &__type { + .type__icon { + @include type-icon; + } + + .type__text { + margin-left: 1rem; + } + } + + &__type-content { + display: flex; + align-items: center; + } + + &__item--read { + color: $ibexa-color-dark-300; + + .type__icon { + @include type-icon-read; + } + } + + &__item--permanently-deleted { + .type__text, + .description__text { + font-style: italic; + } + } + + &__description { + .description__title { + margin-bottom: 0; + + &__item { + display: inline-block; + vertical-align: top; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + font-weight: bold; + } + } + + .description__text { + width: 100%; + margin-bottom: 0; + max-width: 50ch; + float: left; + + + .description__read-more { + display: none; + + &::after { + content: ' \00BB'; + } + } + + &--ellipsis { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + + .description__read-more { + display: inline; + color: $ibexa-color-primary; + cursor: pointer; + } + } + } + } + + &--loading { + .ibexa-notifications-modal__spinner { + display: block; + } + + .ibexa-notifications-modal__results { + visibility: hidden; + } + } + + &__spinner { + width: 2rem; + height: 2rem; + position: absolute; + bottom: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: none; + + .ibexa-icon { + width: 2rem; + height: 2rem; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_notifications.scss b/public/bundles/ibexaadminui/scss/_notifications.scss new file mode 100644 index 000000000..aaafd53ef --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_notifications.scss @@ -0,0 +1,7 @@ +.ibexa-notifications-container { + position: fixed; + bottom: 0; + right: calculateRem(32px); + width: calculateRem(400px); + z-index: 50000; +} diff --git a/public/bundles/ibexaadminui/scss/_object-state-group-view.scss b/public/bundles/ibexaadminui/scss/_object-state-group-view.scss new file mode 100644 index 000000000..dfe47b9c2 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_object-state-group-view.scss @@ -0,0 +1,5 @@ +.ibexa-object-state-group-view { + .ibexa-details { + margin-bottom: calculateRem(48px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_page-title.scss b/public/bundles/ibexaadminui/scss/_page-title.scss new file mode 100644 index 000000000..97e0bd113 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_page-title.scss @@ -0,0 +1,32 @@ +.ibexa-page-title { + &__top { + display: grid; + grid-template-columns: auto 1fr; + } + + &__content-name { + font-weight: normal; + font-size: calculateRem(26px); + width: calc(100% - #{calculateRem(36px)}); + margin-bottom: calculateRem(16px); + } + + &__title { + display: flex; + align-items: center; + overflow: hidden; + } + + &__content { + display: inline-block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .ibexa-badge { + margin-left: calculateRem(16px); + font-family: $ibexa-font-family; + } +} diff --git a/public/bundles/ibexaadminui/scss/_pagination.scss b/public/bundles/ibexaadminui/scss/_pagination.scss new file mode 100644 index 000000000..10c9c9c7b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_pagination.scss @@ -0,0 +1,29 @@ +.ibexa-pagination { + display: flex; + justify-content: space-between; + + &__info { + font-size: $ibexa-text-font-size-medium; + display: flex; + align-items: center; + + & > * { + margin: 0 calculateRem(4px); + } + } + + &__navigation { + display: flex; + margin: 0; + padding: 0; + list-style: none; + + .page-item { + @include pagination-item(); + } + + .page-link { + @include pagination-link(); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_picker.scss b/public/bundles/ibexaadminui/scss/_picker.scss new file mode 100644 index 000000000..436f54034 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_picker.scss @@ -0,0 +1,36 @@ +.ibexa-picker { + position: relative; + + &__input[readonly][disabled] { + cursor: not-allowed; + } + + &__btn--clear-input { + position: absolute; + z-index: 2; + top: 50%; + right: 0.25rem; + transform: translate(0, -50%); + background: none; + border: 0; + width: 1.5rem; + height: 1.5rem; + line-height: 0.5rem; + text-align: center; + padding: 0; + margin: 0; + cursor: pointer; + outline: none; + + .ibexa-icon { + transition: fill 0.3s $ibexa-admin-transition; + } + + &:hover, + &:focus { + .ibexa-icon { + fill: $ibexa-color-dark-300; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_popup-menu.scss b/public/bundles/ibexaadminui/scss/_popup-menu.scss new file mode 100644 index 000000000..e6fdd5a1a --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_popup-menu.scss @@ -0,0 +1,109 @@ +.ibexa-popup-menu { + padding: calculateRem(8px); + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(67px) 0 rgba($ibexa-color-info, 0.2); + position: absolute; + z-index: 10; + + &--hidden { + display: none; + } + + &__items-list { + padding-left: 0; + } + + &__item { + display: flex; + align-items: center; + min-width: calculateRem(150px); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &--hidden { + display: none; + } + + &--group-name { + flex-direction: column; + height: 100%; + align-items: initial; + border-top: calculateRem(1px) solid $ibexa-color-info-800; + + .ibexa-popup-menu__items-list { + padding-left: calculateRem(6px); + } + } + + &--with-border { + border-top: calculateRem(1px) solid $ibexa-color-light; + margin-top: calculateRem(8px); + padding-top: calculateRem(8px); + } + } + + .ibexa-popup-menu__item-content { + display: block; + width: 100%; + cursor: pointer; + padding: calculateRem(9px) calculateRem(15px); + color: $ibexa-color-black; + font-size: calculateRem(14px); + text-align: left; + text-decoration: none; + border: none; + border-radius: $ibexa-border-radius; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &:hover { + background-color: $ibexa-color-light-300; + color: $ibexa-color-black; + text-decoration: none; + } + + &--disabled { + opacity: 0.2; + cursor: default; + } + + &--group-name { + color: $ibexa-color-light-700; + font-size: $ibexa-text-font-size-small; + cursor: initial; + + &:hover { + background-color: initial; + color: $ibexa-color-light-700; + } + } + } + + &--info-neon { + background-color: $ibexa-color-dark; + border-color: $ibexa-color-info-800; + + .ibexa-popup-menu__item-content { + color: $ibexa-color-white; + + &:hover { + color: $ibexa-color-info; + background-color: $ibexa-color-dark; + } + + &--current { + color: $ibexa-color-info; + background-color: $ibexa-color-info-800; + } + + &--group-name { + color: $ibexa-color-light-700; + + &:hover { + background-color: initial; + color: $ibexa-color-light-700; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_preview-header.scss b/public/bundles/ibexaadminui/scss/_preview-header.scss new file mode 100644 index 000000000..a1951f705 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_preview-header.scss @@ -0,0 +1,66 @@ +.ibexa-preview-header { + display: grid; + grid-template-areas: 'back siteaccess actions'; + grid-template-columns: auto 1fr 1fr; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + + &__item { + &--back { + grid-area: back; + padding: calculateRem(10px); + border-right: calculateRem(1px) solid $ibexa-color-light; + } + + &--siteaccess { + grid-area: siteaccess; + padding: calculateRem(10px); + display: flex; + align-items: center; + margin-left: calculateRem(16px); + + .ibexa-dropdown__selection-info { + margin-bottom: 0; + } + } + + &--actions { + grid-area: actions; + padding: calculateRem(10px); + display: flex; + align-items: center; + } + } + + &__link { + display: flex; + align-items: center; + } + + &__action { + padding: calculateRem(10px); + margin-right: calculateRem(4px); + + &:hover { + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + &:focus { + border-color: transparent; + box-shadow: none; + } + + &--selected { + background-color: $ibexa-color-info-200; + + .ibexa-icon { + fill: $ibexa-color-info; + } + } + + .ibexa-icon { + margin-right: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_preview.scss b/public/bundles/ibexaadminui/scss/_preview.scss new file mode 100644 index 000000000..d7c821823 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_preview.scss @@ -0,0 +1,36 @@ +.ibexa-preview { + &__iframe { + iframe { + pointer-events: none; + width: 100%; + height: calc(100vh - 45px); + display: block; + margin: 0 auto; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + background: $ibexa-color-white; + border-radius: $ibexa-border-radius; + } + + &--desktop { + padding-bottom: calculateRem(40px); + } + + &--tablet { + height: calculateRem(1250px); + + iframe { + width: calculateRem(769px); + height: calculateRem(1157px); + } + } + + &--mobile { + height: calculateRem(900px); + + iframe { + width: calculateRem(375px); + height: calculateRem(792px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_search-criteria-tags.scss b/public/bundles/ibexaadminui/scss/_search-criteria-tags.scss new file mode 100644 index 000000000..4d435a317 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_search-criteria-tags.scss @@ -0,0 +1,8 @@ +.ibexa-search-criteria-tags { + border-bottom: calculateRem(1px) solid $ibexa-color-dark-200; + padding-bottom: calculateRem(8px); + + &__tag { + margin-right: calculateRem(10px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_search-form.scss b/public/bundles/ibexaadminui/scss/_search-form.scss new file mode 100644 index 000000000..881a46329 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_search-form.scss @@ -0,0 +1,116 @@ +.ibexa-search-form { + display: grid; + grid-template-areas: + 'search search' + 'filters results' + '. results'; + grid-template-columns: calculateRem(270px) calc(100% - #{calculateRem(294px)}); + grid-column-gap: calculateRem(24px); + padding: calculateRem(16px); + + &__search-wrapper { + display: flex; + justify-content: flex-start; + align-items: flex-start; + border: calculateRem(1px) solid $ibexa-color-light; + padding: calculateRem(24px); + border-radius: $ibexa-border-radius; + grid-area: search; + } + + &__filters { + grid-area: filters; + } + + &__results { + grid-area: results; + + .ibexa-scrollable-wrapper { + max-height: initial; + } + + .ibexa-table-header { + border-bottom: none; + padding-bottom: calculateRem(4px); + margin-top: 0; + font-size: $ibexa-text-font-size-extra-large; + } + } + + &__results-language { + display: inline-block; + margin-bottom: calculateRem(8px); + font-size: $ibexa-text-font-size-medium; + } + + &__results-location-cell { + font-size: $ibexa-text-font-size-small; + } + + &__results-other-translations { + display: flex; + align-items: center; + } + + &__results-other-translation-url { + font-size: $ibexa-text-font-size-small; + margin-left: calculateRem(8px); + } + + &__input-wrapper { + margin-right: calculateRem(28px); + width: calculateRem(430px); + + .ibexa-input-text-wrapper { + width: auto; + } + } + + &__language-wrapper { + margin-right: calculateRem(28px); + width: calculateRem(330px); + + .ibexa-dropdown__selection-info { + margin-bottom: 0; + } + } + + &__empty, + &__no-results { + grid-area: results; + display: flex; + flex-direction: column; + align-items: center; + padding-top: calculateRem(100px); + } + + &__empty-title, + &__empty-subtitle, + &__no-results-title, + &__no-results-subtitle { + color: $ibexa-color-dark-400; + } + + &__no-results-subtitle { + display: flex; + flex-wrap: wrap; + max-width: 60%; + margin-top: calculateRem(30px); + + .ibexa-icon { + margin-right: calculateRem(16px); + } + } + + &__no-results-hint { + flex-basis: 50%; + padding: calculateRem(8px); + display: flex; + } + + .ibexa-btn--secondary.ibexa-btn { + max-width: 100%; + overflow: hidden; + white-space: inherit; + } +} diff --git a/public/bundles/ibexaadminui/scss/_search-links-form.scss b/public/bundles/ibexaadminui/scss/_search-links-form.scss new file mode 100644 index 000000000..dbc6da001 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_search-links-form.scss @@ -0,0 +1,29 @@ +.ibexa-search-links-form { + display: flex; + align-items: flex-end; + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + padding: calculateRem(8px) calculateRem(24px) calculateRem(14px); + margin-top: calculateRem(12px); + + &__input-wrapper { + padding-right: calculateRem(24px); + + .ibexa-input-text-wrapper { + min-width: calculateRem(410px); + } + } + + &__status-wrapper { + padding-left: calculateRem(24px); + border-left: calculateRem(1px) solid $ibexa-color-light; + + .ibexa-label { + margin-top: 0; + } + + .ibexa-dropdown { + min-width: calculateRem(216px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_selection-table.scss b/public/bundles/ibexaadminui/scss/_selection-table.scss new file mode 100644 index 000000000..fc288d618 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_selection-table.scss @@ -0,0 +1,5 @@ +.ibexa-selection-table { + .ibexa-input-text-wrapper { + margin-left: calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_side-menu.scss b/public/bundles/ibexaadminui/scss/_side-menu.scss new file mode 100644 index 000000000..1821046d3 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_side-menu.scss @@ -0,0 +1,53 @@ +.ibexa-side-menu { + flex: 0 0 calculateRem(80px); + + &--expanded { + z-index: 1000; + } + + .ibexa-icon { + fill: $ibexa-color-white; + } + + .ibexa-sticky-container > .btn { + width: 100%; + height: calculateRem(80px); + padding: calculateRem(2px) calculateRem(4px); + border: 0; + border-radius: 0; + text-decoration: none; + font-size: calculateRem(13px); + line-height: calculateRem(18px); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + &:hover, + &:focus { + box-shadow: none; + outline: none; + } + + &:first-child { + border-top-left-radius: $ibexa-border-radius; + border-top-right-radius: $ibexa-border-radius; + } + + &:last-child { + border-bottom-left-radius: $ibexa-border-radius; + border-bottom-right-radius: $ibexa-border-radius; + } + + .ibexa-icon { + display: block; + width: calculateRem(24px); + height: calculateRem(24px); + margin: 0 auto calculateRem(5px); + } + } + + .ibexa-sticky-container { + max-width: calculateRem(90px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_steps.scss b/public/bundles/ibexaadminui/scss/_steps.scss new file mode 100644 index 000000000..9ce62a03c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_steps.scss @@ -0,0 +1,60 @@ +.ibexa-step { + display: flex; + position: relative; + width: 100%; + align-items: center; + padding: calculateRem(20px); + + &__wrapper { + display: inline-flex; + padding-left: 0; + margin-bottom: 0; + } + + &__separator { + width: 100%; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &__actions { + display: flex; + width: 100%; + flex-direction: column; + align-items: center; + justify-content: center; + padding: calculateRem(45px) calculateRem(20px) calculateRem(60px); + } + + &__item { + margin-right: calculateRem(16px); + list-style: none; + + &--active { + .ibexa-step__indicator { + background-color: $ibexa-color-info; + } + } + + &--prev { + .ibexa-step__indicator { + background-color: $ibexa-color-dark; + } + } + } + + &__label { + font-size: $ibexa-text-font-size-small; + + .ibexa-step__item--active > & { + color: $ibexa-color-info; + } + } + + &__indicator { + margin-top: calculateRem(5px); + border-radius: calculateRem(4px); + width: calculateRem(82px); + height: calculateRem(4px); + background-color: $ibexa-color-light; + } +} diff --git a/public/bundles/ibexaadminui/scss/_summary-tile.scss b/public/bundles/ibexaadminui/scss/_summary-tile.scss new file mode 100644 index 000000000..3c97de813 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_summary-tile.scss @@ -0,0 +1,75 @@ +.ibexa-summary-tile { + display: flex; + flex-direction: column; + padding: calculateRem(24px) calculateRem(24px); + gap: calculateRem(8px); + width: calculateRem(450px); + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light-400; + border-radius: $ibexa-border-radius; + + &__header { + display: flex; + justify-content: space-between; + align-items: center; + } + + &__icon-wrapper { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: center; + height: calculateRem(72px); + width: calculateRem(72px); + border-radius: 50%; + background: $ibexa-color-dark; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + + &__label { + font-family: $ibexa-font-family-headings; + font-weight: $ibexa-font-weight-bold; + font-size: $ibexa-text-font-size-large; + } + + &__value { + font-weight: $ibexa-font-weight-bold; + font-size: $h1-font-size; + line-height: calculateRem(36px); + } + + @mixin icon-colors($fill, $background) { + background: $background; + + .ibexa-icon { + fill: $fill; + } + } + + &__icon-wrapper--color-primary { + @include icon-colors($ibexa-color-primary, $ibexa-color-primary-100); + } + + &__icon-wrapper--color-secondary { + @include icon-colors($ibexa-color-dark, $ibexa-color-light-400); + } + + &__icon-wrapper--color-info { + @include icon-colors($ibexa-color-info, $ibexa-color-info-100); + } + + &__icon-wrapper--color-danger { + @include icon-colors($ibexa-color-danger, $ibexa-color-danger-100); + } + + &__icon-wrapper--color-success { + @include icon-colors($ibexa-color-success, $ibexa-color-success-100); + } + + &__icon-wrapper--color-complementary { + @include icon-colors($ibexa-color-complementary, $ibexa-color-complementary-100); + } +} diff --git a/public/bundles/ibexaadminui/scss/_tables.scss b/public/bundles/ibexaadminui/scss/_tables.scss new file mode 100644 index 000000000..4dfcc91cb --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_tables.scss @@ -0,0 +1,275 @@ +.ibexa-table { + font-size: $ibexa-text-font-size; + line-height: calculateRem(24px); + border-spacing: 0; + background-color: $ibexa-color-white; + margin-bottom: 0; + + &.table > :not(caption) > * > * { + box-shadow: none; + } + + &__row:nth-child(odd) { + .ibexa-table__cell { + background-color: $ibexa-color-light-300; + } + } + + &__row:nth-child(even) { + .ibexa-table__cell { + background-color: $ibexa-color-white; + } + } + + &__cell:first-child { + border-top-left-radius: $ibexa-border-radius; + border-bottom-left-radius: $ibexa-border-radius; + } + + &__cell:last-child { + border-top-right-radius: $ibexa-border-radius; + border-bottom-right-radius: $ibexa-border-radius; + } + + &__cell.ibexa-table__cell { + vertical-align: middle; + padding: calculateRem(12px) calculateRem(16px); + height: calculateRem(68px); + + .form-check { + margin-bottom: 0; + min-height: calculateRem(16px); + margin-top: 0; + } + + .ibexa-dropdown { + margin-left: 0; + } + } + + &__empty-table-cell { + display: flex; + align-items: center; + justify-content: center; + background: $ibexa-color-white; + } + + &__empty-table-image { + max-width: 50%; + } + + &__empty-table-text { + max-width: calculateRem(440px); + margin-left: calculateRem(56px); + color: $ibexa-color-dark-400; + } + + &__empty-table-info-text { + margin-bottom: calculateRem(16px); + font-weight: $headings-font-weight; + font-family: $headings-font-family; + font-size: $ibexa-text-font-size-extra-large; + } + + &__empty-table-action-text { + margin-bottom: calculateRem(16px); + } + + &__empty-table-extra-actions { + .ibexa-icon { + transform: rotate(180deg); + margin-right: calculateRem(8px); + } + } + + &__header-cell { + .table & { + font-size: $ibexa-text-font-size-small; + font-weight: normal; + color: $ibexa-color-dark-400; + line-height: calculateRem(18px); + vertical-align: middle; + border-bottom: 0; + padding: calculateRem(18px) calculateRem(16px); + } + + .table &--has-icon { + max-width: calculateRem(52px); + } + + &--field-definitions-head { + width: calc(100% / 3); + } + + &--content-center { + text-align: center; + } + } + + &__header-cell-checkbox { + &.ibexa-input--checkbox { + margin-bottom: 0; + } + } + + &__sort-column { + position: relative; + cursor: pointer; + display: inline-block; + + &:after { + content: url('/bundles/ibexaadminui/img/down.svg'); + position: absolute; + width: calculateRem(5px); + height: calculateRem(13px); + top: calc(50% - #{calculateRem(7px)}); + right: calculateRem(-10px); + transform: rotate(180deg); + display: none; + } + + &--asc:after { + display: block; + } + + &--desc::after { + display: block; + transform: none; + } + } + + &__cell { + vertical-align: middle; + + &--has-checkbox { + width: calculateRem(48px); + + .ibexa-input--checkbox { + float: left; + margin-bottom: 0; + } + } + + .table &--has-icon { + line-height: 0; + width: calculateRem(32px); + } + + &--no-content { + margin-bottom: calculateRem(48px); + padding: calculateRem(12px) calculateRem(16px); + background-color: $ibexa-color-white; + font-style: italic; + color: $ibexa-color-black; + } + + &--limitation { + width: 70%; + } + + &--content-center { + text-align: center; + + .ibexa-input--checkbox { + margin-bottom: 0; + } + } + } + + .table &__cell--close-left, + .table &__header-cell--close-left { + padding-left: 0; + } + + .table &__header-cell--checkbox { + display: flex; + } + + &__cell-btns-wrapper { + display: flex; + align-items: center; + justify-content: flex-end; + } + + &__cell-link, + &__cell-link:hover { + color: $ibexa-color-dark; + text-decoration: none; + } + + &--not-striped { + .ibexa-table__row { + .ibexa-table__cell { + background-color: $ibexa-color-white; + } + } + } + + &--last-column-sticky { + border-collapse: separate; + + .ibexa-table__row, + .ibexa-table__head-row { + .ibexa-table__cell:last-of-type, + .ibexa-table__header-cell:last-of-type { + position: sticky; + right: calculateRem(-1px); + } + } + } + + &--last-column-shadow { + .ibexa-table__row, + .ibexa-table__head-row { + .ibexa-table__cell:last-of-type, + .ibexa-table__header-cell:last-of-type { + box-shadow: calculateRem(-13px) calculateRem(5px) calculateRem(20px) 0 rgba($ibexa-color-info, 0.1); + } + } + } +} + +.ibexa-table-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: calculateRem(30px); + padding-bottom: calculateRem(15px); + border-bottom: calculateRem(1px) solid $ibexa-color-dark-200; + + &__headline { + font-size: $ibexa-text-font-size-large; + line-height: calculateRem(33px); + color: $ibexa-color-black; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + &__notice { + color: $ibexa-color-dark-400; + font-weight: normal; + font-family: $ibexa-font-family; + font-size: $ibexa-text-font-size-small; + + &--hidden { + display: none; + } + } + + &__notice-icon { + fill: $ibexa-color-dark-400; + margin-right: calculateRem(8px); + } + + &__actions { + display: flex; + align-items: center; + white-space: nowrap; + + .btn { + margin: 0 calculateRem(5px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_tabs.scss b/public/bundles/ibexaadminui/scss/_tabs.scss new file mode 100644 index 000000000..218a6a2e9 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_tabs.scss @@ -0,0 +1,283 @@ +.ibexa-tabs { + display: flex; + justify-content: space-between; + position: relative; + user-select: none; + + .nav-item { + position: relative; + margin-bottom: calculateRem(-1px); + } + + .nav-link { + margin-left: calculateRem(16px); + padding: calculateRem(14px) calculateRem(8px); + color: $ibexa-color-black; + border-radius: 0; + text-decoration: none; + } + + &--hidden { + display: none; + } + + &__list { + overflow: hidden; + width: calc(100% - #{calculateRem(50px)}); + height: calculateRem(47px); + border: 0; + } + + &__toggler-show, + &__toggler-hide { + pointer-events: none; + } + + &__toggler { + padding-top: calculateRem(20px); + padding-right: calculateRem(15px); + color: $ibexa-color-dark; + font-size: calculateRem(14px); + cursor: pointer; + + .ibexa-tabs__toggler-show { + display: none; + } + + &::after { + position: absolute; + bottom: calculateRem(13px); + right: 0; + content: ''; + border-left: calculateRem(5px) solid transparent; + border-right: calculateRem(5px) solid transparent; + border-top: calculateRem(5px) solid $ibexa-color-black; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &--rolled-up { + &::after { + transform: rotate(180deg); + } + + .ibexa-tabs__toggler-hide { + display: none; + } + + .ibexa-tabs__toggler-show { + display: unset; + } + } + } + + &__tab-corner { + width: calculateRem(43px); + height: calculateRem(50px); + position: absolute; + right: 0; + top: 0; + bottom: 0; + margin-top: calculateRem(-1px); + z-index: 2; + + .ibexa-svg-tab-corner-border { + stroke: $ibexa-color-light-300; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + .ibexa-svg-tab-corner-inside { + fill: $ibexa-color-light-300; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + } + + &__tab-warning-icon { + display: none; + position: absolute; + right: calculateRem(20px); + top: 50%; + transform: translateY(-50%); + width: calculateRem(16px); + height: calculateRem(16px); + border-radius: 50%; + align-items: center; + justify-content: center; + background: $ibexa-color-danger; + color: $ibexa-color-white; + z-index: 10; + } + + &__tab { + height: calculateRem(48px); + display: flex; + align-items: center; + color: $ibexa-color-black; + background-color: transparent; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + outline: none; + font-size: calculateRem(14px); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + margin-left: calculateRem(-3px); + + &--error { + .ibexa-tabs__tab-warning-icon { + display: flex; + } + } + + &:first-of-type { + margin-left: 0; + } + + &::before { + content: ''; + position: absolute; + right: calculateRem(43px); + left: 0; + top: 0; + bottom: 0; + margin-bottom: calculateRem(1px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius 0 0 0; + border-bottom-width: 0; + border-right-width: 0; + background-color: $ibexa-color-light-300; + border-color: $ibexa-color-light-300; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition, margin-bottom 1ms, border-color 1ms; + } + + &::after { + content: ''; + width: calculateRem(44px); + position: absolute; + right: 0; + bottom: 0; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + z-index: 3; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &[disabled] { + color: $ibexa-color-dark-300; + cursor: not-allowed; + + .ibexa-tabs__link { + pointer-events: none; + } + + .ibexa-icon { + fill: $ibexa-color-dark-300; + } + } + + &:hover:not([disabled]), + &--active { + z-index: 4; + + &::before { + background-color: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + border-bottom-width: 0; + border-right-width: 0; + z-index: 2; + margin-bottom: -0.1px; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &::after { + border-color: $ibexa-color-white; + right: calculateRem(2px); + } + + .ibexa-tabs__tab-corner { + .ibexa-svg-tab-corner-border { + stroke: $ibexa-color-light; + } + + .ibexa-svg-tab-corner-inside { + fill: $ibexa-color-white; + } + } + } + + &:hover:not([disabled]):not(&--active) { + &::before { + border: calculateRem(1px) solid $ibexa-color-light; + border-right-width: 0; + z-index: 2; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition, margin-bottom 1ms, border-color 1ms; + } + + &::after { + border-color: $ibexa-color-light; + right: 0; + } + } + + &--hidden { + display: none; + } + + &--more { + cursor: pointer; + } + } + + &__link { + &.nav-link, + &.nav-link.active { + display: flex; + align-items: center; + height: calculateRem(47px); + padding: 0 calculateRem(40px) 0 calculateRem(24px); + margin-right: calculateRem(3px); + margin-left: 0; + color: inherit; + background: transparent; + border-width: 0; + z-index: 5; + } + } + + &__popup-menu { + top: calculateRem(35px); + } +} + +.ibexa-tab-content { + width: 100%; + padding: 0; + margin: calculateRem(-1px) 0 calculateRem(15px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: 0 calculateRem(10px) calculateRem(10px) calculateRem(10px); + overflow: hidden; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.1); + background-color: $ibexa-color-white; + + &__single-tab { + border-radius: $ibexa-border-radius; + } + + &__pane { + padding: calculateRem(10px) calculateRem(24px) calculateRem(24px); + + &--no-padding { + padding: 0; + } + + .form-group:first-child { + .ibexa-label { + margin-top: 0; + } + } + } + + &--rolled-up { + height: calculateRem(24px); + border-radius: 0 0 calculateRem(10px) calculateRem(10px); + + .tab-pane { + opacity: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_tag-view-select.scss b/public/bundles/ibexaadminui/scss/_tag-view-select.scss new file mode 100644 index 000000000..e052cda32 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_tag-view-select.scss @@ -0,0 +1,101 @@ +.ibexa-tag-view-select { + $self: &; + + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-radius: $ibexa-border-radius; + padding: calculateRem(24px); + + &__info { + font-size: $ibexa-text-font-size-medium; + color: $ibexa-color-black; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + &__selected-list { + display: flex; + flex-wrap: wrap; + margin: calculateRem(10px) 0; + min-height: calculateRem(24px); + } + + &__selected-item-tag { + display: inline-flex; + align-items: center; + max-width: 100%; + height: calculateRem(24px); + padding: calculateRem(4px) calculateRem(10px); + font-size: $ibexa-text-font-size-small; + line-height: calculateRem(16px); + font-weight: normal; + border-radius: calculateRem(12px); + background-color: $ibexa-color-light-500; + margin-top: calculateRem(5px); + margin-bottom: calculateRem(5px); + + &:not(:last-of-type) { + margin-right: calculateRem(8px); + } + + .ibexa-middle-ellipsis { + max-width: calc(100% - #{calculateRem(20px)}); + } + + &--not-deletable { + #{$self}__selected-item-tag-remove-btn { + display: none; + } + + .ibexa-middle-ellipsis { + max-width: 100%; + } + } + } + + $color-versions: 'primary' $ibexa-color-primary $ibexa-color-primary-200, 'secondary' $ibexa-color-dark $ibexa-color-light-500, + 'info' $ibexa-color-info $ibexa-color-info-200, 'danger' $ibexa-color-danger $ibexa-color-danger-200, + 'success' $ibexa-color-success $ibexa-color-success-200, 'complementary' $ibexa-color-complementary $ibexa-color-complementary-200; + + @mixin colorful-tags($color-text, $color-background) { + .ibexa-tag-view-select { + &__selected-item-tag { + background-color: $color-background; + + .ibexa-icon { + fill: $color-text; + } + } + + &__selected-item-tag-ellipsize { + color: $color-text; + } + + &__selected-item-tag-content { + &--start, + &--end { + .ibexa-tag-view-select__selected-item-tag-content-ellipsized { + color: $color-text; + } + } + } + } + } + + @each $name, $color-text, $color-background in $color-versions { + &--#{$name} { + @include colorful-tags($color-text, $color-background); + } + } + + &__selected-item-tag-remove-btn { + padding: 0; + margin-left: calculateRem(12px); + display: flex; + } + + &:disabled, + &[disabled] { + @include colorful-tags($ibexa-color-dark-400, $ibexa-color-light-300); + } +} diff --git a/public/bundles/ibexaadminui/scss/_tag.scss b/public/bundles/ibexaadminui/scss/_tag.scss new file mode 100644 index 000000000..bc11ba898 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_tag.scss @@ -0,0 +1,78 @@ +.ibexa-tag { + display: inline-flex; + align-items: center; + position: relative; + height: calculateRem(24px); + padding: calculateRem(4px) calculateRem(10px); + border-radius: calculateRem(12px); + background-color: $ibexa-color-light-500; + max-width: 100%; + + &__content { + font-size: $ibexa-text-font-size-small; + font-weight: normal; + max-width: 100%; + } + + &__spinner { + height: calculateRem(22px); + line-height: 0; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + &__remove-btn { + display: none; + position: absolute; + right: calculateRem(8px); + padding: calculateRem(4px); + cursor: pointer; + border: 0; + outline: none; + line-height: 0; + + &:disabled, + &[disabled] { + cursor: not-allowed; + } + + &:hover { + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + .ibexa-icon { + fill: $ibexa-color-dark-400; + } + } + + &--deletable { + padding-right: calculateRem(28px); + + .ibexa-tag__remove-btn { + display: inline-block; + } + } + + $color-versions: 'primary' $ibexa-color-primary $ibexa-color-primary-200, 'secondary' $ibexa-color-dark $ibexa-color-light-500, + 'info' $ibexa-color-info $ibexa-color-info-200, 'danger' $ibexa-color-danger $ibexa-color-danger-200, + 'success' $ibexa-color-success $ibexa-color-success-200, 'complementary' $ibexa-color-complementary $ibexa-color-complementary-200; + + @each $name, $color-text, $color-background in $color-versions { + &--#{$name} { + color: $color-text; + background-color: $color-background; + + .ibexa-tag { + &__remove-btn, + &__spinner, + .ibexa-icon { + fill: $color-text; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_translation-selector.scss b/public/bundles/ibexaadminui/scss/_translation-selector.scss new file mode 100644 index 000000000..a68f24516 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_translation-selector.scss @@ -0,0 +1,58 @@ +.ibexa-translation-selector { + &__list-wrapper { + display: block; + position: fixed; + opacity: 1; + text-align: left; + background-color: $ibexa-color-white; + border: calculateRem(16px) solid $ibexa-color-white; + width: calculateRem(360px); + padding: calculateRem(9px); + box-shadow: calculateRem(-4px) calculateRem(4px) calculateRem(6px) 0 rgba($ibexa-color-dark-300, 0.35); + border-radius: calculateRem(4px); + top: calculateRem(100px); + right: 0; + height: calc(100vh - #{calculateRem(100px)}); + opacity: 1; + transform: scaleX(1); + transform-origin: right center; + transition: transform 0.4s ease-in, opacity 0.4s ease-in; + + &--hidden { + opacity: 0; + transform: scaleX(0); + transition: transform 0.2s ease-out, opacity 0.2s ease-out; + } + } + + &__title { + color: $ibexa-color-primary; + font-size: calculateRem(16px); + line-height: 2; + font-weight: bold; + border-bottom: calculateRem(1px) solid $ibexa-color-primary; + margin-bottom: calculateRem(15px); + } + + &__list { + display: flex; + flex-direction: column; + max-height: calculateRem(300px); + overflow: auto; + + .ibexa-btn--content-edit { + background-color: $ibexa-color-white; + padding: calculateRem(9px) calculateRem(24px); + text-align: left; + box-shadow: 0 calculateRem(2px) calculateRem(4px) 0 rgba($ibexa-color-black, 0.1); + margin-bottom: calculateRem(8px); + + &:hover, + &:focus { + background: $ibexa-color-light; + font-weight: 700; + text-decoration: none; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_trash-search-form.scss b/public/bundles/ibexaadminui/scss/_trash-search-form.scss new file mode 100644 index 000000000..98ec77999 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_trash-search-form.scss @@ -0,0 +1,118 @@ +.ibexa-trash-search-form { + &__inputs-group { + display: flex; + justify-content: space-between; + flex-flow: wrap; + } + + &__item { + display: inline-block; + width: calculateRem(258px); + + & + & { + margin-left: calculateRem(16px); + } + + &--creator { + position: relative; + width: 100%; + + .ibexa-trash-search-form { + &__input-wrapper { + position: relative; + } + + &__input { + + .ibexa-icon { + display: none; + } + + &:disabled { + cursor: auto; + background-color: $ibexa-color-white; + color: $ibexa-color-black; + padding-right: calculateRem(32px); + text-overflow: ellipsis; + + & + .ibexa-icon { + display: block; + position: absolute; + bottom: calculateRem(7px); + right: calculateRem(6px); + cursor: pointer; + } + } + } + } + } + } + + &__user-list { + padding: 0; + list-style: none; + position: absolute; + right: 0; + min-width: 100%; + border-radius: calculateRem(5px); + margin-bottom: 0; + background-color: $ibexa-color-light-200; + max-height: calculateRem(300px); + overflow: auto; + transform: scaleY(1); + transform-origin: top center; + transition: transform 0.2s $ibexa-admin-transition; + z-index: 1; + + &--hidden { + transform: scaleY(0); + } + } + + &__user-item { + padding: calculateRem(8px) calculateRem(16px); + cursor: pointer; + } + + &__input { + &.ibexa-input.form-control:disabled { + background-color: $ibexa-color-white; + + & + .ibexa-btn--reset-creator { + display: block; + } + } + } + + .ibexa-btn--reset-creator { + display: none; + position: absolute; + right: 0; + bottom: 0; + + &:hover { + border-color: transparent; + } + } + + &__range-wrapper { + width: 0; + opacity: 0; + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-white; + border-radius: calculateRem(4px); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + pointer-events: none; + overflow: hidden; + + &--visible { + width: auto; + margin-left: calculateRem(16px); + opacity: 1; + pointer-events: auto; + } + } + + &__range-select { + outline: none; + } +} diff --git a/public/bundles/ibexaadminui/scss/_typography.scss b/public/bundles/ibexaadminui/scss/_typography.scss new file mode 100644 index 000000000..988a1f7a7 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_typography.scss @@ -0,0 +1,29 @@ +.ibexa-content-edit { + h2 { + &.text-muted { + font-size: 1.125rem; + color: $ibexa-color-dark-300; + } + } +} + +.ibexa-adminsection-edit { + padding: 0 calculateRem(8px); + + .card-header { + border: none; + background-color: $ibexa-color-white; + + h2 { + font-size: calculateRem(16px); + font-weight: normal; + color: $ibexa-color-primary; + } + } + + .card-body { + h3 { + font-size: calculateRem(16px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_user-group-invitation.scss b/public/bundles/ibexaadminui/scss/_user-group-invitation.scss new file mode 100644 index 000000000..5d0e961c5 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_user-group-invitation.scss @@ -0,0 +1,8 @@ +.ibexa-user-group-invitation { + .ibexa-user-invitation-modal { + &__labels, + &__entry { + grid-template-columns: 1fr calculateRem(48px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_user-invitation-modal.scss b/public/bundles/ibexaadminui/scss/_user-invitation-modal.scss new file mode 100644 index 000000000..2201d9fc3 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_user-invitation-modal.scss @@ -0,0 +1,143 @@ +.ibexa-user-invitation-modal { + &.ibexa-modal { + .modal-dialog { + max-width: calculateRem(700px); + } + } + + .modal-body { + padding-top: 0; + padding-bottom: 0; + } + + .modal-footer { + position: sticky; + bottom: 0; + background: $ibexa-color-white; + border-top-width: calculateRem(1px); + } + + .ibexa-alert { + &__actions { + display: flex; + align-items: center; + } + } + + &__body { + position: relative; + } + + &__main { + margin-right: calculateRem(-8px); + } + + &__issues-alert { + &--hidden { + display: none; + } + } + + &__issues-alert-issues { + font-size: $ibexa-text-font-size-medium; + } + + &__bad-file-alert { + &--hidden { + display: none; + } + } + + &__sticky-top { + position: sticky; + top: 0; + z-index: 100; + background: $ibexa-color-white; + padding-top: calculateRem(16px); + } + + &__labels { + top: calculateRem(76px); + margin-right: calculateRem(-4px); + } + + &__entries { + display: grid; + grid-row-gap: calculateRem(14px); + padding: calculateRem(4px) 0; + } + + &__labels, + &__entry { + display: grid; + align-items: center; + } + + &__entry { + &--not-matching-search { + display: none; + } + } + + &__search-no-entries { + display: flex; + justify-content: center; + align-items: center; + height: calculateRem(48px); + font-style: italic; + font-size: $ibexa-text-font-size-medium; + color: $ibexa-color-dark-400; + + &--hidden { + display: none; + } + } + + &__add-next-btn { + margin-top: calculateRem(8px); + } + + &__upload { + margin-top: calculateRem(24px); + } + + &__upload-file-message { + display: flex; + justify-content: center; + margin: calculateRem(12px) 0; + + &--hidden { + display: none; + } + } + + &__drop { + border: calculateRem(1px) dashed $ibexa-color-dark-300; + border-radius: $ibexa-border-radius; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-bottom: calculateRem(24px); + + &--hidden { + display: none; + } + } + + &__drop-message { + cursor: auto; + font-weight: bold; + margin-top: calculateRem(24px); + color: $ibexa-color-dark-400; + } + + &__or { + color: $ibexa-color-dark-400; + margin-bottom: calculateRem(8px); + } + + &__file-select { + margin-bottom: calculateRem(30px); + } +} diff --git a/public/bundles/ibexaadminui/scss/_user-menu.scss b/public/bundles/ibexaadminui/scss/_user-menu.scss new file mode 100644 index 000000000..3bef826f1 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_user-menu.scss @@ -0,0 +1,105 @@ +.ibexa-main-nav { + .ibexa-user-menu { + position: relative; + cursor: pointer; + z-index: 1051; + + &__name-wrapper { + display: flex; + height: calculateRem(58px); + width: calculateRem(200px); + padding: calculateRem(8px) calculateRem(24px) calculateRem(8px) calculateRem(34px); + user-select: none; + transition: all $ibexa-admin-transition; + + &:before { + content: ''; + position: absolute; + top: 50%; + right: calculateRem(11px); + width: 0; + height: 0; + border-left: calculateRem(5px) solid transparent; + border-right: calculateRem(5px) solid transparent; + border-top: calculateRem(5px) solid $ibexa-color-dark-300; + } + + &--active { + background-color: $ibexa-color-white; + box-shadow: 0 calculateRem(2px) calculateRem(6px) rgba(0, 0, 0, 0.15); + + &:before { + transform: rotate(180deg); + } + } + + transition: background-color 0.3s $ibexa-admin-transition; + } + + &__name { + display: flex; + align-items: center; + text-align: right; + font-size: calculateRem(14px); + } + + &__items { + width: 100%; + display: block; + position: absolute; + padding-top: calculateRem(6px); + right: 0; + background-color: $ibexa-color-white; + box-shadow: 0 calculateRem(5px) calculateRem(6px) rgba(0, 0, 0, 0.15); + transform-origin: top center; + white-space: nowrap; + + &--hidden { + padding-top: 0; + height: 0; + overflow: hidden; + } + } + + &__item { + width: 100%; + padding-left: calculateRem(28px); + padding-right: calculateRem(28px); + cursor: pointer; + font-size: calculateRem(14px); + color: $ibexa-color-dark; + + &--dark { + .nav-link { + color: $ibexa-color-dark; + text-decoration: none; + } + } + + .nav-link { + white-space: normal; + word-break: break-word; + } + + &:first-child { + padding-top: calculateRem(10px); + } + + &:last-child { + margin: calculateRem(24px) auto calculateRem(16px) 0; + } + + &:hover { + .nav-link { + color: $ibexa-color-primary; + } + } + } + + &__item-label { + grid-area: label; + white-space: normal; + word-break: break-word; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/_user-thumbnail.scss b/public/bundles/ibexaadminui/scss/_user-thumbnail.scss new file mode 100644 index 000000000..c0f90498f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/_user-thumbnail.scss @@ -0,0 +1,7 @@ +.ibexa-user-thumbnail { + &--img { + width: calculateRem(24px); + height: calculateRem(24px); + border-radius: 50%; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_base-field.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_base-field.scss new file mode 100644 index 000000000..7ee540cd0 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_base-field.scss @@ -0,0 +1,89 @@ +.ibexa-field-edit { + &__label { + @include label-required(); + } + + &__data { + &--compound { + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-radius: $ibexa-border-radius; + padding: 0 calculateRem(23px) calculateRem(26px); + } + } + + &__error { + color: $ibexa-color-danger; + } + + .ibexa-input-text-wrapper { + width: auto; + } + + .ibexa-form-error { + flex-direction: column; + } + + .form-control { + margin-bottom: 0; + } + + &--nontranslatable, + &--disabled { + pointer-events: none; + + .ibexa-label { + color: $ibexa-color-black-300; + } + + h2 { + color: $ibexa-color-dark-300; + } + + &__data { + &--compound { + border-color: $ibexa-color-light-400; + } + } + } + + &--ibexa_seo { + margin-top: calculateRem(32px); + + .ibexa-data-source__label { + float: none; + } + + .ibexa-data-source__input-wrapper { + .ibexa-content-type-edit__section-column-header:first-of-type { + margin-top: 0; + } + } + } +} + +.ibexa-content-edit { + .ibexa-field-edit { + padding: calculateRem(24px) 0; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + + &__label-wrapper { + flex: 0 0 calculateRem(200px); + + .ibexa-field-edit__label { + margin: 0; + font-size: calculateRem(16px); + font-weight: normal; + color: $ibexa-color-dark-300; + } + } + + .ibexa-data-source__label { + margin-bottom: calculateRem(10px); + color: $ibexa-color-dark-300; + } + + &__data { + flex: 0 0 calc(100% - #{calculateRem(200px)}); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_base-preview.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_base-preview.scss new file mode 100644 index 000000000..182f3aaa8 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_base-preview.scss @@ -0,0 +1,127 @@ +.ibexa-field-edit--with-preview { + &, + *, + *:after, + *:before { + box-sizing: border-box; + } + + &.is-invalid { + .ibexa-field-edit__data { + border-color: $ibexa-color-danger; + + .ibexa-data-source__message--filesize { + color: $ibexa-color-danger; + } + } + } + + .ibexa-field-edit__data { + position: relative; + border: calculateRem(1px) dashed $ibexa-color-dark-300; + border-radius: $ibexa-border-radius; + + .ibexa-data-source { + border-radius: $ibexa-border-radius; + padding: calculateRem(24px); + display: flex; + flex-direction: column; + align-items: center; + + &__actions { + margin: calculateRem(8px); + } + + &__message { + &--main { + color: $ibexa-color-dark-300; + box-sizing: border-box; + cursor: auto; + font-weight: bold; + } + + &--separator { + color: $ibexa-color-dark-300; + } + + &--filesize { + color: $ibexa-color-dark-300; + font-size: $ibexa-text-font-size-small; + } + } + + .form-check.form-check-inline { + display: none; + } + } + } + + .ibexa-field-edit-preview { + &__visual { + display: grid; + grid-template-areas: 'media-preview details' 'image-alt .'; + grid-template-columns: 65% auto; + grid-template-rows: calculateRem(300px) auto; + grid-column-gap: calculateRem(16px); + + .ibexa-field-edit-preview { + &__media-wrapper { + grid-area: media-preview; + display: flex; + justify-content: center; + align-items: center; + border: calculateRem(1px) dashed $ibexa-color-dark-300; + border-radius: $ibexa-border-radius; + padding: calculateRem(1px); + position: relative; + } + + &__image-alt { + grid-area: image-alt; + } + + &__details { + grid-area: details; + } + + &__media { + max-height: calculateRem(298px); + max-width: calc(100% - #{calculateRem(2px)}); + width: auto; + height: auto; + display: block; + } + + &__actions { + display: flex; + position: absolute; + top: 0; + right: 0; + border-radius: $ibexa-border-radius; + padding: calculateRem(4px); + background-color: $ibexa-color-white; + box-shadow: calculateRem(-4px) calculateRem(10px) calculateRem(20px) 0 rgba($ibexa-color-info, 0.15); + z-index: 1; + } + } + } + + &__file-name-wrapper { + overflow: hidden; + + .ibexa-field-edit-preview__file-name { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + } + + &.ibexa-field-edit--nontranslatable { + .ibexa-data-source__label-text, + p, + a { + color: $ibexa-color-dark-300; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezauthor.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezauthor.scss new file mode 100644 index 000000000..64e24e77b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezauthor.scss @@ -0,0 +1,33 @@ +.ibexa-field-edit--ezauthor { + .ibexa-data-source { + &__labels { + display: grid; + column-gap: calculateRem(16px); + grid-template-columns: repeat(2, 1fr); + padding: 0 calculateRem(46px); + } + + &__author { + display: grid; + column-gap: calculateRem(16px); + grid-template-columns: calculateRem(30px) repeat(2, 1fr) calculateRem(30px); + } + + &__main-actions { + display: flex; + justify-content: flex-end; + padding: calculateRem(24px) 0 calculateRem(16px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &__checkbox { + padding-top: calculateRem(8px); + } + + &__actions { + .ibexa-btn { + padding: calculateRem(7px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezbinaryfile.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezbinaryfile.scss new file mode 100644 index 000000000..03b0705ec --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezbinaryfile.scss @@ -0,0 +1,48 @@ +.ibexa-field-edit--ezbinaryfile { + &.is-invalid { + .ibexa-data-source { + @include area-invalid(); + } + } + + &.ibexa-field-edit--with-preview { + .ibexa-field-edit-preview { + &__file-icon { + flex: 0 0 calculateRem(32px); + display: flex; + align-items: center; + justify-content: center; + } + + &__visual { + grid-template-rows: auto; + } + + &__media-wrapper { + justify-content: start; + flex-direction: column; + align-items: flex-start; + padding: calculateRem(24px); + } + + &__file-name-wrapper, + &__file-size-wrapper { + display: inline-block; + font-size: calculateRem(16px); + margin-right: calculateRem(40px); + + .ibexa-label { + margin-bottom: 0; + } + } + + &__file-name-wrapper { + max-width: calculateRem(500px); + } + + &__file-size-wrapper { + max-width: calculateRem(150px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezboolean.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezboolean.scss new file mode 100644 index 000000000..cbf2e0c9f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezboolean.scss @@ -0,0 +1,5 @@ +.ibexa-field-edit--ezboolean { + .ibexa-data-source__label:after { + display: none; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezdate.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezdate.scss new file mode 100644 index 000000000..e8d9a665c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezdate.scss @@ -0,0 +1,3 @@ +.ibexa-field-edit--ezdate { + @include datetime-field(); +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezdatetime.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezdatetime.scss new file mode 100644 index 000000000..6640ea4cc --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezdatetime.scss @@ -0,0 +1,3 @@ +.ibexa-field-edit--ezdatetime { + @include datetime-field(); +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezfloat.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezfloat.scss new file mode 100644 index 000000000..5a4c4e68b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezfloat.scss @@ -0,0 +1,15 @@ +.ibexa-field-edit--ezfloat { + .ibexa-input-text-wrapper { + width: calculateRem(84px); + height: calculateRem(48px); + } + + .ibexa-data-source__input { + &.is-invalid { + background-image: none; + padding-right: calculateRem(12px); + background-color: $ibexa-color-danger-100; + color: $ibexa-color-danger; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezform.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezform.scss new file mode 100644 index 000000000..ab5dd6c70 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezform.scss @@ -0,0 +1,5 @@ +.ibexa-field-edit--ezform { + .ibexa-field-edit__error { + @include error-under-label(); + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezgmaplocation.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezgmaplocation.scss new file mode 100644 index 000000000..dee21fb92 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezgmaplocation.scss @@ -0,0 +1,99 @@ +.ibexa-field-edit--ezgmaplocation { + .ibexa-data-source { + display: flex; + position: relative; + + &__map { + z-index: 0; + width: 50%; + height: calculateRem(400px); + border-top-left-radius: $ibexa-border-radius; + border-bottom-left-radius: $ibexa-border-radius; + position: relative; + + &--disabled::after { + position: absolute; + background: rgba($ibexa-color-light-500, 0.8); + z-index: 2000; + top: 0; + right: 0; + bottom: 0; + left: 0; + content: ''; + display: block; + } + } + + &__field--address { + .ibexa-input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + padding-left: calculateRem(48px); + } + } + + &__coordinates { + display: flex; + justify-content: space-between; + + .ibexa-data-source__field { + width: 45%; + } + + .ibexa-data-source__input { + &.is-invalid { + @include input-invalid; + + padding-right: calculateRem(12px); + } + } + } + + &__options { + width: 50%; + padding: calculateRem(24px); + + .ibexa-input { + margin-bottom: 0; + } + } + + &__text-info { + margin-top: calculateRem(20px); + color: $ibexa-color-dark-400; + } + + &__input-wrapper { + display: flex; + align-items: flex-start; + position: relative; + + .ibexa-input-text-wrapper { + width: 100%; + } + + .ibexa-btn--locate-me { + padding: calculateRem(13px); + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + + &[disabled] { + background-color: $ibexa-color-light-300; + } + } + + .ibexa-btn--search-by-address { + position: absolute; + top: 0; + left: 0; + padding: calculateRem(13px); + } + } + } + + .ibexa-field-edit__data { + padding: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezimage.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezimage.scss new file mode 100644 index 000000000..ada62d613 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezimage.scss @@ -0,0 +1,28 @@ +.ibexa-field-edit--ezimage { + .ibexa-field-edit-preview { + &__file-name-wrapper, + &__dimensions-wrapper, + &__file-size-wrapper { + .ibexa-label { + margin-top: 0; + margin-bottom: 0; + } + } + + &__dimension--width { + margin-right: calculateRem(8px); + } + } + + &.is-invalid { + .ibexa-data-source { + @include area-invalid(); + } + } + + .ibexa-data-source__field--alternativeText { + .ibexa-data-source__label { + @include label-required(); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezimageasset.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezimageasset.scss new file mode 100644 index 000000000..077aaee0e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezimageasset.scss @@ -0,0 +1,69 @@ +.ibexa-field-edit--ezimageasset { + &.is-invalid { + .ibexa-data-source { + @include area-invalid(); + } + } + + .ibexa-data-source { + &__btn-add { + border: none; + font-weight: bold; + text-decoration: underline; + } + + &__actions { + .ibexa-btn:not(:first-child) { + margin-left: calculateRem(16px); + } + } + } + + .ibexa-field-edit-preview { + &__file-name-wrapper { + .ibexa-label { + margin-top: 0; + margin-bottom: 0; + } + } + } + + .ibexa-field-edit-spinner { + width: calculateRem(32px); + height: calculateRem(32px); + position: absolute; + bottom: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: none; + + .ibexa-icon { + width: calculateRem(32px); + height: calculateRem(32px); + fill: $ibexa-color-black; + } + } + + &.ibexa-field-edit--nontranslatable { + .ibexa-data-source__message--main, + .ibexa-data-source__btn-add { + color: $ibexa-color-dark-300; + } + } +} + +.ibexa-field-edit--is-preview-loading { + position: relative; + + .ibexa-field-edit-spinner { + display: block; + } + + .ibexa-field-edit__preview { + visibility: hidden; + } + + .ibexa-field-edit__data { + visibility: hidden; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezinteger.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezinteger.scss new file mode 100644 index 000000000..637ab9db5 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezinteger.scss @@ -0,0 +1,14 @@ +.ibexa-field-edit--ezinteger { + .ibexa-data-source__input { + &::-webkit-inner-spin-button { + margin-left: calculateRem(24px); + } + + &.is-invalid { + background-image: none; + padding-right: calculateRem(12px); + background-color: $ibexa-color-danger-100; + color: $ibexa-color-danger; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezkeyword.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezkeyword.scss new file mode 100644 index 000000000..2597c5809 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezkeyword.scss @@ -0,0 +1,68 @@ +.ibexa-field-edit--ezkeyword { + .ibexa-data-source__taggify { + display: flex; + flex-wrap: wrap; + height: auto; + min-height: calculateRem(48px); + padding: 0 calculateRem(8px) calculateRem(4px) calculateRem(4px); + border: calculateRem(1px) solid $ibexa-color-dark-200; + + &.ibexa-data-source__taggify--focused { + border-color: $ibexa-color-primary; + box-shadow: 0 0 calculateRem(3px) 0 rgba($ibexa-color-primary, 0.75); + } + + &.is-invalid { + @include input-invalid(); + } + } + + .taggify__wrapper { + flex: 1 1 auto; + order: 2; + } + + .taggify__input { + display: block; + width: 100%; + height: 100%; + margin-top: calculateRem(3px); + border: 0 none; + outline: none; + background: transparent; + } + + .taggify__tags { + order: 1; + display: flex; + flex-wrap: wrap; + } + + .taggify__tag { + @include tag; + } + + .taggify__btn--remove { + position: absolute; + right: 0; + color: $ibexa-color-dark; + background: none; + border: 0 none; + } + + &.ibexa-field-edit--nontranslatable { + .ibexa-data-source__taggify { + background-color: $ibexa-color-light-300; + pointer-events: none; + + .taggify__tag { + background-color: $ibexa-color-light-500; + color: $ibexa-color-dark-400; + + .taggify__btn--remove { + color: $ibexa-color-dark-400; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezmedia.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezmedia.scss new file mode 100644 index 000000000..cafd22991 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezmedia.scss @@ -0,0 +1,59 @@ +.ibexa-field-edit--ezmedia { + .ibexa-field-edit-preview { + &__details { + display: flex; + flex-wrap: wrap; + } + + &__file-name-wrapper, + &__file-size-wrapper, + &__control, + &__settings { + flex-basis: 50%; + padding: calculateRem(8px); + + .ibexa-label { + margin-top: 0; + margin-bottom: 0; + } + } + + &__spinner { + display: none; + } + + &__media-wrapper--loading { + .ibexa-field-edit-preview__spinner { + display: inline-block; + width: calculateRem(32px); + height: calculateRem(32px); + } + + .ibexa-field-edit-preview__media { + display: none; + } + } + + &__info { + & + .ibexa-field-edit-preview__info { + margin-top: calculateRem(12px); + } + } + + &__dimensions { + input[type='number'] { + &.is-invalid { + @include input-invalid; + + padding-right: calculateRem(12px); + } + } + } + } + + &.is-invalid { + .ibexa-data-source { + @include area-invalid(); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_eznoneditable.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_eznoneditable.scss new file mode 100644 index 000000000..b183ac10b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_eznoneditable.scss @@ -0,0 +1,13 @@ +.ibexa-field-edit--eznoneditable { + padding: calculateRem(24px) 0; + border-bottom: calculateRem(1px) solid $ibexa-color-light; + + .col-form-label { + font-weight: normal; + } + + .non-editable { + margin-bottom: 0; + color: $ibexa-color-dark-400; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezobjectrelationlist.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezobjectrelationlist.scss new file mode 100644 index 000000000..a4e077fa7 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezobjectrelationlist.scss @@ -0,0 +1,80 @@ +.ibexa-field-edit--ezobjectrelation, +.ibexa-field-edit--ezobjectrelationlist { + &.is-invalid { + .ibexa-data-source { + @include area-invalid(); + + .ibexa-table-header__headline { + color: $ibexa-color-danger; + } + } + } + + .ibexa-data-source { + border: calculateRem(1px) solid $ibexa-color-dark-200; + border-radius: $ibexa-border-radius; + padding: calculateRem(24px); + } + + .ibexa-table-header { + margin-top: 0; + } + + .ibexa-relations { + &__cta { + width: 100%; + } + + &__info-text { + margin-bottom: 0; + font-weight: normal; + font-size: $ibexa-text-font-size-medium; + } + + &__info-sub-text { + margin-bottom: 0; + font-weight: normal; + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + } + + &__helper-text { + margin: 0; + width: 100%; + font-size: calculateRem(14px); + } + + &__cta-btn { + margin-bottom: calculateRem(16px); + } + + &__order-wrapper { + display: flex; + align-items: center; + } + + &__order-input { + width: 7ch; + margin-bottom: 0; + } + + &__table-action--remove-item { + padding: calculateRem(4px); + } + } + + .btn { + .ibexa-icon { + margin-right: calculateRem(4px); + } + } + + &.ibexa-field-edit--nontranslatable { + .ibexa-relations__helper-text, + .ibexa-relations__info-text, + .ibexa-relations__info-sub-text, + .ibexa-table__cell { + color: $ibexa-color-dark-300; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezselection.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezselection.scss new file mode 100644 index 000000000..048ad866e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezselection.scss @@ -0,0 +1,17 @@ +.ibexa-field-edit--ezselection { + .ibexa-data-source { + position: relative; + + .ibexa-dropdown { + &__selection-info { + width: 100%; + } + + &__items { + max-height: calculateRem(300px); + overflow-y: auto; + width: 100%; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_eztext.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_eztext.scss new file mode 100644 index 000000000..56dd95ce5 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_eztext.scss @@ -0,0 +1,5 @@ +.ibexa-field-edit--eztext { + .ibexa-input--textarea { + width: 100%; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_eztime.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_eztime.scss new file mode 100644 index 000000000..c44f38a46 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_eztime.scss @@ -0,0 +1,3 @@ +.ibexa-field-edit--eztime { + @include datetime-field(); +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezurl.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezurl.scss new file mode 100644 index 000000000..34b77ded9 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezurl.scss @@ -0,0 +1,15 @@ +.ibexa-field-edit--ezurl { + .ibexa-field-edit__data { + background-color: $ibexa-color-white; + } + + .ibexa-data-source { + display: flex; + + &__field { + &--link { + margin-right: calculateRem(52px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/edit/_ezuser.scss b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezuser.scss new file mode 100644 index 000000000..2d74991c2 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/edit/_ezuser.scss @@ -0,0 +1,16 @@ +.ibexa-field-edit--ezuser { + .ibexa-field-edit__data { + background: $ibexa-color-white; + + .ibexa-data-source { + max-width: 80%; + padding-top: calculateRem(24px); + + .ibexa-data-source__field:first-of-type { + .ibexa-label { + margin-top: 0; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezauthor.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezauthor.scss new file mode 100644 index 000000000..97e0ed92c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezauthor.scss @@ -0,0 +1,5 @@ +.ibexa-field-preview--ezauthor { + list-style: none; + padding-left: 0; + margin-bottom: 0; +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezbinaryfile.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezbinaryfile.scss new file mode 100644 index 000000000..a95db2584 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezbinaryfile.scss @@ -0,0 +1,8 @@ +.ibexa-field-preview--ezbinaryfile { + display: flex; + align-items: center; + + .ibexa-icon--file { + margin-right: 1rem; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezgmaplocation.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezgmaplocation.scss new file mode 100644 index 000000000..76f1d8256 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezgmaplocation.scss @@ -0,0 +1,31 @@ +.ibexa-field-preview--ezgmaplocation { + display: flex; + flex-wrap: wrap; + + .ibexa-field-preview { + &__map-wrapper { + width: calculateRem(520px); + height: calculateRem(320px); + margin-right: calculateRem(32px); + } + + &__map-meta-wrapper { + overflow: auto; + } + + &__map-meta-title { + padding-bottom: calculateRem(24px); + font-weight: normal; + } + + &__map-meta-value-row { + td { + padding-bottom: calculateRem(12px); + } + } + } + + .ibexa-gmaplocation__map { + height: 100%; + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezimage.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezimage.scss new file mode 100644 index 000000000..fa4df0404 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezimage.scss @@ -0,0 +1,3 @@ +.ibexa-field-preview--ezimage { + @include image-preview(); +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezimageasset.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezimageasset.scss new file mode 100644 index 000000000..d20bcb74f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezimageasset.scss @@ -0,0 +1,3 @@ +.ibexa-field-preview--ezimageasset { + @include image-preview(); +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezkeyword.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezkeyword.scss new file mode 100644 index 000000000..115b6c920 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezkeyword.scss @@ -0,0 +1,12 @@ +.ibexa-field-preview--ezkeyword { + list-style: none; + padding-left: 0; + margin-bottom: 0; + + .ibexa-keyword__item { + @include tag(); + + margin: 0 calculateRem(5px) 0 0; + padding: calculateRem(6px) calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezmedia.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezmedia.scss new file mode 100644 index 000000000..6afebbc78 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezmedia.scss @@ -0,0 +1,16 @@ +.ibexa-field-preview--ezmedia { + display: flex; + flex-wrap: wrap; + overflow: hidden; + + .ibexa-field-preview { + &__media { + flex: 1 1 calculateRem(300px); + margin-right: calculateRem(32px); + } + + &__media-meta { + overflow: auto; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezselection.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezselection.scss new file mode 100644 index 000000000..456461187 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezselection.scss @@ -0,0 +1,17 @@ +.ibexa-field-preview--ezselection-multiple { + list-style: none; + padding-left: 0; + margin-bottom: 0; + display: flex; + align-items: center; + flex-wrap: wrap; + + .ibexa-selection__item { + margin-right: calculateRem(8px); + padding: calculateRem(4px) calculateRem(10px); + } +} + +.ibexa-field-preview--ezselection-single { + padding: calculateRem(4px) calculateRem(10px); +} diff --git a/public/bundles/ibexaadminui/scss/fieldType/preview/_ezuser.scss b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezuser.scss new file mode 100644 index 000000000..5e40a19f2 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/fieldType/preview/_ezuser.scss @@ -0,0 +1,6 @@ +.ibexa-field-preview--ezuser { + .ibexa-user__type { + font-weight: bold; + padding-right: 2rem; + } +} diff --git a/public/bundles/ibexaadminui/scss/functions/_calculate.rem.scss b/public/bundles/ibexaadminui/scss/functions/_calculate.rem.scss new file mode 100644 index 000000000..ce1bfbad0 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/functions/_calculate.rem.scss @@ -0,0 +1,7 @@ +@import '../polyfill/div'; + +@function calculateRem($size) { + $remSize: div($size, $base-font-size); + + @return $remSize + 0rem; // + 0rem converts value to proper `rem` +} diff --git a/public/bundles/ibexaadminui/scss/ibexa-bootstrap.scss b/public/bundles/ibexaadminui/scss/ibexa-bootstrap.scss new file mode 100644 index 000000000..7fdbdb1a8 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ibexa-bootstrap.scss @@ -0,0 +1,2 @@ +@import 'custom'; +@import './public/bundles/ibexaadminuiassets/vendors/bootstrap/scss/bootstrap.scss'; diff --git a/public/bundles/ibexaadminui/scss/ibexa.scss b/public/bundles/ibexaadminui/scss/ibexa.scss new file mode 100644 index 000000000..09a204677 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ibexa.scss @@ -0,0 +1,123 @@ +@import 'fonts'; +@import 'custom'; +@import 'functions/calculate.rem'; +@import 'animations'; +@import 'mixins'; +@import 'general'; +@import 'adaptive-filters'; +@import 'backdrop'; +@import 'tabs'; +@import 'tables'; +@import 'header'; +@import 'icon-tag'; +@import 'breadcrumb'; +@import 'icons'; +@import 'page-title'; +@import 'buttons'; +@import 'field-group'; +@import 'main-nav'; +@import 'modals'; +@import 'notifications'; +@import 'instant-filter'; +@import 'login'; +@import 'forms'; +@import 'preview-header'; +@import 'preview'; +@import 'add-translation'; +@import 'user-menu'; +@import 'typography'; +@import 'content-edit'; +@import 'content-type-edit'; +@import 'card'; +@import 'chart'; +@import 'alerts'; +@import 'pagination'; +@import 'error-page'; +@import 'custom-tag'; +@import 'filters'; +@import 'search-form'; +@import 'search-criteria-tags'; +@import 'add-to-bookmarks'; +@import 'content-type-selector'; +@import 'labels'; +@import 'tag'; +@import 'badges'; +@import 'translation-selector'; +@import 'dropdown'; +@import 'dropdown-popover'; +@import 'custom.tooltip'; +@import 'fieldType/edit/base-field'; +@import 'fieldType/edit/base-preview'; +@import 'fieldType/edit/ezauthor'; +@import 'fieldType/edit/ezinteger'; +@import 'fieldType/edit/ezfloat'; +@import 'fieldType/edit/ezboolean'; +@import 'fieldType/edit/ezurl'; +@import 'fieldType/edit/ezselection'; +@import 'fieldType/edit/ezbinaryfile'; +@import 'fieldType/edit/ezimage'; +@import 'fieldType/edit/ezimageasset'; +@import 'fieldType/edit/ezmedia'; +@import 'fieldType/edit/ezdate'; +@import 'fieldType/edit/ezdatetime'; +@import 'fieldType/edit/eztime'; +@import 'fieldType/edit/ezkeyword'; +@import 'fieldType/edit/ezgmaplocation'; +@import 'fieldType/edit/ezuser'; +@import 'fieldType/edit/ezobjectrelationlist'; +@import 'fieldType/edit/eznoneditable'; +@import 'fieldType/edit/eztext'; +@import 'fieldType/edit/ezform'; +@import 'fieldType/preview/ezauthor'; +@import 'fieldType/preview/ezkeyword'; +@import 'fieldType/preview/ezselection'; +@import 'fieldType/preview/ezuser'; +@import 'fieldType/preview/ezbinaryfile'; +@import 'fieldType/preview/ezmedia'; +@import 'fieldType/preview/ezimage'; +@import 'fieldType/preview/ezimageasset'; +@import 'fieldType/preview/ezgmaplocation'; +@import 'dashboard'; +@import 'picker'; +@import 'notifications-menu'; +@import 'notifications-modal'; +@import 'admin.section-view'; +@import 'content-tree'; +@import 'flatpickr'; +@import 'trash-search-form'; +@import 'inputs'; +@import 'links'; +@import 'footer'; +@import 'popup-menu'; +@import 'header-user-menu'; +@import 'main-header'; +@import 'main-container'; +@import 'main-menu'; +@import 'edit-header'; +@import 'context-menu'; +@import 'anchor-navigation'; +@import 'autosave'; +@import 'side-menu'; +@import 'collapse'; +@import 'tag-view-select'; +@import 'grid-view'; +@import 'grid-view-item'; +@import 'list-search'; +@import 'search-links-form'; +@import 'custom-url-form'; +@import 'details'; +@import 'content-locations'; +@import 'location-swap-form'; +@import 'selection-table'; +@import 'assign'; +@import 'object-state-group-view'; +@import 'back-to-top'; +@import 'date-time-picker'; +@import 'middle-ellipsis'; +@import 'user-thumbnail'; +@import 'user-group-invitation'; +@import 'user-invitation-modal'; +@import 'default-location'; +@import 'steps'; +@import 'summary-tile'; +@import 'double-input-range'; diff --git a/public/bundles/ibexaadminui/scss/mixins/_containers.scss b/public/bundles/ibexaadminui/scss/mixins/_containers.scss new file mode 100644 index 000000000..bf1058af0 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_containers.scss @@ -0,0 +1,11 @@ +@mixin edit-right-side-container { + flex-grow: 1; + position: relative; + padding: calculateRem(42px) calculateRem(32px) calculateRem(32px) calculateRem(32px); + overflow-y: auto; + border-bottom-left-radius: $ibexa-border-radius; + border-width: 0 calculateRem(1px) calculateRem(1px); + border-style: solid; + border-color: $ibexa-color-light-400; + background-color: $ibexa-color-white; +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_drag-and-drop.scss b/public/bundles/ibexaadminui/scss/mixins/_drag-and-drop.scss new file mode 100644 index 000000000..48a359ab7 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_drag-and-drop.scss @@ -0,0 +1,486 @@ +@mixin drag-module-backdrop-background { + background-image: radial-gradient($ibexa-color-light 0.5px, transparent 0); // 0.5px is needed so that both on HD and Retina we have 1px + background-color: $ibexa-color-light-200; + background-position: 0 0, calculateRem(5px) calculateRem(5px); + background-size: calculateRem(5px) calculateRem(5px); +} + +@mixin sidebar-drag-items { + $ibexa-sidebar-width: calculateRem(356px); + + display: flex; + flex-direction: column; + width: $ibexa-sidebar-width; + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: calculateRem(5px); + overflow: hidden; + background: $ibexa-color-white; + box-shadow: $ibexa-edit-header-box-shadow; + transition-property: opacity, transform; + transition-duration: $ibexa-admin-transition-duration; + transition-timing-function: $ibexa-admin-transition; + transform-origin: top center; + + &__action-bar { + display: flex; + justify-content: space-between; + align-items: center; + padding: calculateRem(8px) calculateRem(16px); + background-color: $ibexa-color-light-400; + } + + &__title-bar { + padding: calculateRem(5px) calculateRem(32px); + border-bottom: calculateRem(1px) solid $ibexa-color-dark-200; + } + + &__title { + height: calculateRem(33px); + line-height: calculateRem(33px); + color: $ibexa-color-dark; + font-size: $ibexa-text-font-size-large; + font-weight: 600; + padding: 0; + margin: 0; + } + + &__search-bar { + padding: calculateRem(23px) calculateRem(32px) calculateRem(15px); + } + + &__list { + padding: calculateRem(5px) calculateRem(32px); + margin-bottom: 0; + overflow: auto; + } + + &--draggable { + position: fixed; + z-index: 500; + top: calculateRem(130px); + left: calc(100% - #{$ibexa-sidebar-width} - #{calculateRem(5px)}); + } +} + +@mixin sidebar-drag-items-group { + $self: &; + + height: auto; + + &__title-bar { + display: flex; + justify-content: space-between; + align-items: center; + height: calculateRem(36px); + border-top: calculateRem(1px) solid $ibexa-color-light; + cursor: pointer; + + &:hover { + color: $ibexa-color-primary; + + #{$self}__toggler { + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + + .ibexa-icon { + transition: transform $ibexa-admin-transition-duration $ibexa-admin-transition; + } + } + + &__title { + font-size: $ibexa-text-font-size-medium; + font-weight: 600; + } + + &--collapsed { + height: calculateRem(34px); + overflow: hidden; + } +} + +@mixin sidebar-drag-item { + $self: &; + + background: $ibexa-color-light-300; + margin-bottom: calculateRem(8px); + border-radius: $ibexa-border-radius; + display: flex; + width: 100%; + + &:last-of-type { + margin-bottom: calculateRem(24px); + } + + &:hover:not(&--unavailable, &--immovable) { + #{$self}__content { + border-color: $ibexa-color-dark; + transform: scale(1.02) translateX(-10px); + box-shadow: calculateRem(4px) calculateRem(10px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.2); + } + + #{$self}__drag-icon { + fill: $ibexa-color-dark; + } + } + + &__content { + background: $ibexa-color-white; + display: flex; + width: 100%; + padding: calculateRem(13px) calculateRem(10px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.05); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &[draggable='true'] { + cursor: grab; + } + } + + &__drag { + display: flex; + align-items: center; + padding: 0 calculateRem(8px) 0 calculateRem(5px); + } + + &__drag-icon { + fill: $ibexa-color-light; + } + + &__type { + display: flex; + align-items: center; + padding: 0 calculateRem(8px); + } + + &__label { + font-size: $ibexa-text-font-size-medium; + font-weight: 600; + } + + &__collapse { + padding: 0 calculateRem(9px); + } + + &--hidden { + display: none; + } + + &--unavailable { + cursor: not-allowed; + + #{$self}__content { + color: $ibexa-color-dark-300; + fill: $ibexa-color-dark-300; + border-color: $ibexa-color-light-300; + background: $ibexa-color-light-300; + box-shadow: none; + } + + #{$self}__drag-icon { + fill: $ibexa-color-dark-300; + } + } + + &--immovable { + cursor: not-allowed; + + #{$self}__content { + color: $ibexa-color-dark-300; + fill: $ibexa-color-dark-300; + border-color: $ibexa-color-light-300; + box-shadow: none; + } + + #{$self}__drag-icon { + fill: $ibexa-color-dark-300; + } + } + + &--is-dragging-out { + #{$self}__content { + opacity: 0; + } + } +} + +@mixin drag-item { + $self: &; + + display: flex; + background: $ibexa-color-light-300; + margin-bottom: calculateRem(8px); + border-radius: $ibexa-border-radius; + + &:hover:not(&--is-non-interactive) { + #{$self}__content { + border-color: $ibexa-color-dark; + transform: scale(1.02) translateX(-10px); + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.2); + } + } + + &--is-dragging-out { + #{$self}__content { + opacity: 0; + } + } + + &--highlighted { + #{$self}__content { + border-color: $ibexa-color-info-300; + background-color: $ibexa-color-info-100; + animation: item-highlight-pulse 1s 1; + + * { + color: $ibexa-color-info-500; + } + + .ibexa-dropdown { + &__selection-info::before, + &__selection-info::after { + background: $ibexa-color-info-500; + } + + .ibexa-dropdown__selected-item { + color: $ibexa-color-info-500; + } + } + + .ibexa-icon { + fill: $ibexa-color-info-500; + } + } + } + + &--is-removing { + #{$self}__content { + border-color: $ibexa-color-light-300; + animation: item-remove-pulse 0.2s 1; + transform-origin: center; + pointer-events: none; + + &:hover { + border-color: $ibexa-color-light-300; + } + } + } + + &--removed { + animation: remove-field 1s 1 forwards; + } + + &--error { + #{$self}__content { + border-color: $ibexa-color-danger; + } + } + + &__content { + display: flex; + background-color: $ibexa-color-white; + width: 100%; + padding: calculateRem(12px) calculateRem(16px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.05); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &[draggable='true'] { + cursor: grab; + } + } + + &__left-col { + display: flex; + width: calc(100% - #{calculateRem(64px)}); + } + + &__right-col { + display: flex; + justify-content: flex-end; + width: calculateRem(64px); + } + + &__drag-handler { + display: flex; + align-items: center; + height: calculateRem(32px); + padding-right: calculateRem(16px); + + .ibexa-icon { + fill: $ibexa-color-dark-200; + } + } + + &__label { + padding-top: calculateRem(4px); + } + + &--invalid { + #{$self}__content { + border-color: $ibexa-color-danger; + color: $ibexa-color-danger; + + .ibexa-dropdown { + &__selection-info::before, + &__selection-info::after { + background: $ibexa-color-danger; + } + + .ibexa-dropdown__selected-item { + color: $ibexa-color-danger; + } + } + + .ibexa-icon { + fill: $ibexa-color-danger; + } + } + } +} + +@mixin drag-item-btns-wrapper { + display: flex; + margin-left: auto; +} + +@mixin drag-item-label { + font-size: $ibexa-text-font-size-medium; + font-weight: 600; +} + +@mixin drag-item-placeholder { + display: flex; + height: calculateRem(4px); + border-radius: calculateRem(2px); + background-color: $ibexa-color-info; + margin: 0 0 calculateRem(8px) 0; + + &--anchored { + background-color: $ibexa-color-light-300; + } + + &--hidden { + display: none; + } +} + +@mixin drag-item-placeholder-full { + $self: &; + + display: flex; + align-items: center; + height: calculateRem(60px); + margin: 0 0 calculateRem(8px) 0; + padding: 0 calculateRem(14px); + border-radius: $ibexa-border-radius; + background: $ibexa-color-info-200; + + &__item { + height: calculateRem(18px); + background: $ibexa-color-info-300; + border-radius: $ibexa-border-radius-small; + width: calculateRem(18px); + + &:nth-child(2) { + width: calculateRem(250px); + margin-left: calculateRem(8px); + } + + &:nth-child(3) { + margin-left: auto; + } + + &:nth-child(4) { + margin-left: calculateRem(8px); + } + } + + &--anchored { + background: $ibexa-color-light-300; + + #{$self}__item { + background: $ibexa-color-light-500; + } + } + + &--hidden { + display: none; + } +} + +@mixin empty-drop-zone { + display: flex; + flex-direction: column; + align-items: center; + padding-bottom: calculateRem(50px); + + &__image { + margin-top: calculateRem(90px); + } + + &__label { + color: $ibexa-color-dark-400; + margin: calculateRem(45px) auto calculateRem(15px); + } + + &--hidden { + display: none; + } +} + +@keyframes remove-field { + 100% { + height: 0; + margin-bottom: 0; + opacity: 0; + transform: scale(0); + } +} + +@keyframes item-remove-pulse { + 0% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 0 $ibexa-color-light-300; + } + 10% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 0 $ibexa-color-light-300; + } + 20% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 calculateRem(10px) $ibexa-color-light-300; + } + 100% { + border-color: $ibexa-color-light-300; + box-shadow: 0 0 0 0 $ibexa-color-light-300; + } +} + +@keyframes item-highlight-pulse { + 0% { + border-color: $ibexa-color-info-300; + background-color: $ibexa-color-info-100; + box-shadow: 0 0 0 0 $ibexa-color-info-100; + } + 10% { + border-color: $ibexa-color-info-300; + background-color: $ibexa-color-info-100; + box-shadow: 0 0 0 0 $ibexa-color-info-100; + } + 20% { + border-color: $ibexa-color-info-300; + background-color: $ibexa-color-info-100; + box-shadow: 0 0 0 calculateRem(10px) $ibexa-color-info-100; + } + 100% { + border-color: $ibexa-color-info-300; + background-color: $ibexa-color-info-100; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.05); + } +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_font.scss b/public/bundles/ibexaadminui/scss/mixins/_font.scss new file mode 100644 index 000000000..64ef4eee7 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_font.scss @@ -0,0 +1,5 @@ +// deprecated - will be removed in 5.0 +@mixin ibexa-font-sans-serif() { + font-family: $font-family-sans-serif; + letter-spacing: calculateRem(0.12px); +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_general.scss b/public/bundles/ibexaadminui/scss/mixins/_general.scss new file mode 100644 index 000000000..bcba737bd --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_general.scss @@ -0,0 +1,11 @@ +@mixin container-box-shadow-right { + box-shadow: calculateRem(12px) 0 calculateRem(12px) calculateRem(-12px) rgba(34, 34, 34, 0.25); +} + +@mixin container-box-shadow-left { + box-shadow: calculateRem(-12px) 0 calculateRem(12px) calculateRem(-12px) rgba(34, 34, 34, 0.25); +} + +@mixin container-box-shadow { + box-shadow: 0 0 calculateRem(12px) calculateRem(-4px) rgba(34, 34, 34, 0.25); +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_image-preview.scss b/public/bundles/ibexaadminui/scss/mixins/_image-preview.scss new file mode 100644 index 000000000..6d4dff700 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_image-preview.scss @@ -0,0 +1,45 @@ +@mixin image-preview() { + display: flex; + + .ibexa-field-preview { + &__image-wrapper { + flex: 1 1 auto; + display: flex; + flex-wrap: wrap; + overflow: hidden; + } + + &__image { + max-width: calculateRem(520px); + margin-right: calculateRem(32px); + } + + &__actions-wrapper { + flex: 0 0 calculateRem(40px); + } + + &__action { + &--preview { + border: none; + border-radius: 50%; + height: 40px; + width: 40px; + line-height: 40px; + cursor: pointer; + transition: background 0.3s $ibexa-admin-transition; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + display: block; + margin-top: 0; + background: $ibexa-color-dark-300; + + &:hover, + &:focus { + background: darken($ibexa-color-dark-300, 15%); + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_inputs.scss b/public/bundles/ibexaadminui/scss/mixins/_inputs.scss new file mode 100644 index 000000000..c0a5b3132 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_inputs.scss @@ -0,0 +1,43 @@ +@mixin input-active { + border-color: $ibexa-color-primary; + box-shadow: 0 0 calculateRem(2px) 0 rgba($ibexa-color-primary, 0.75); +} + +@mixin input-invalid { + color: $ibexa-color-danger; + background-image: none; + border-color: $ibexa-color-danger; + background-color: $ibexa-color-danger-100; +} + +@mixin area-invalid { + color: $ibexa-color-danger; + border-color: $ibexa-color-danger; + background-color: $ibexa-color-danger-100; + + .ibexa-btn { + background-color: $ibexa-color-danger-100; + } +} + +@mixin error-input { + display: flex; + font-size: calculateRem(14px); + font-style: normal; + color: $ibexa-color-danger; + align-items: center; + box-sizing: border-box; +} + +@mixin error-under-input { + @include error-input(); + + margin: calculateRem(-7px) 0 0 calculateRem(2px); +} + +@mixin error-under-label { + @include error-input(); + + flex-basis: 100%; + margin: 0 0 calculateRem(10px) calculateRem(2px); +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_main-menu.scss b/public/bundles/ibexaadminui/scss/mixins/_main-menu.scss new file mode 100644 index 000000000..1d77aaf62 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_main-menu.scss @@ -0,0 +1,8 @@ +@mixin hidden-main-menu-node { + width: 0; + height: 0; + margin: 0; + padding: 0; + opacity: 0; + border: none; +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_modals.scss b/public/bundles/ibexaadminui/scss/mixins/_modals.scss new file mode 100644 index 000000000..4ef706862 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_modals.scss @@ -0,0 +1,62 @@ +@mixin modal-main() { + background: $ibexa-color-white; + box-shadow: 0 0 calculateRem(30px) 0 rgba($ibexa-color-black, 0.35); + position: relative; + border-radius: $ibexa-border-radius; +} + +@mixin modal-content() { + padding: 0 calculateRem(24px); +} + +@mixin modal-header() { + position: relative; + font-size: calculateRem(16px); +} + +@mixin modal-title { + margin-right: calculateRem(30px); + font-size: $modal-title-font-size; + font-weight: 600; +} + +@mixin modal-subtitle { + display: inline-block; + color: $ibexa-color-dark-300; + font-size: calculateRem(14px); + font-weight: 400; + position: relative; + top: calculateRem(-4px); + left: calculateRem(1px); +} + +@mixin close-button() { + position: absolute; + display: block; + align-items: center; + top: calculateRem(24px); + right: 0; + cursor: pointer; + opacity: 1; + border: none; + + .ibexa-icon { + margin: 0; + opacity: 1; + } +} + +@mixin modal-body() { + padding: calculateRem(24px) 0; + background: $ibexa-color-white; + white-space: normal; +} + +@mixin modal-footer() { + justify-content: flex-start; + padding: $modal-footer-padding; + + .btn { + margin: 0 calculateRem(16px) 0 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_pagination.scss b/public/bundles/ibexaadminui/scss/mixins/_pagination.scss new file mode 100644 index 000000000..58fb05e25 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_pagination.scss @@ -0,0 +1,67 @@ +@mixin pagination-main-container { + display: flex; + background: $ibexa-white; +} + +@mixin pagination-info { + color: $ibexa-color-dark; + font-size: $ibexa-text-font-size-medium; + margin-right: calculateRem(24px); +} + +@mixin pagination-link { + display: flex; + align-items: center; + justify-content: center; + width: calculateRem(44px); + height: calculateRem(44px); + border-radius: $ibexa-border-radius; + font-size: $ibexa-text-font-size-medium; +} + +@mixin pagination-item { + padding: calculateRem(1px); + border: calculateRem(1px) solid transparent; + + &.active { + font-weight: 600; + } + + &.prev { + .page-link:before { + content: ''; + margin-left: calculateRem(7px); + display: block; + border-right: calculateRem(1px) solid $ibexa-color-dark; + border-bottom: calculateRem(1px) solid $ibexa-color-dark; + width: calculateRem(16px); + height: calculateRem(16px); + transform: rotate(135deg); + } + } + + &.next { + .page-link:after { + content: ''; + display: block; + margin-right: calculateRem(7px); + border-right: calculateRem(1px) solid $ibexa-color-dark; + border-bottom: calculateRem(1px) solid $ibexa-color-dark; + width: calculateRem(16px); + height: calculateRem(16px); + transform: rotate(-45deg); + } + } + + &.disabled { + .page-link:before, + .page-link:after { + border-right-color: $ibexa-color-dark-200; + border-bottom-color: $ibexa-color-dark-200; + } + } + + .page-link:focus { + border: calculateRem(1px) solid $ibexa-color-primary; + } +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_spinner.scss b/public/bundles/ibexaadminui/scss/mixins/_spinner.scss new file mode 100644 index 000000000..50b541167 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_spinner.scss @@ -0,0 +1,22 @@ +@mixin spinner($size, $line-size, $color: $ibexa-color-info) { + --mask: conic-gradient(#{rgba($ibexa-color-black, 0)} 10%, #{$ibexa-color-black}), + linear-gradient(#{$ibexa-color-black} 0 0) content-box; + + width: $size; + height: $size; + padding: $line-size; + aspect-ratio: 1; + border-radius: 50%; + background: $color; + -webkit-mask: var(--mask); + mask: var(--mask); + -webkit-mask-composite: source-out; + mask-composite: subtract; + animation: spinner-animation 1s infinite linear; +} + +@keyframes spinner-animation { + to { + transform: rotate(1turn); + } +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_tags.scss b/public/bundles/ibexaadminui/scss/mixins/_tags.scss new file mode 100644 index 000000000..c612cdc7c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_tags.scss @@ -0,0 +1,15 @@ +@mixin tag { + font-size: $ibexa-text-font-size-small; + font-weight: normal; + color: $ibexa-color-dark; + position: relative; + display: inline-flex; + align-items: center; + min-height: calculateRem(24px); + margin-right: calculateRem(4px); + margin-top: calculateRem(4px); + padding: calculateRem(1px) calculateRem(25px) calculateRem(1px) calculateRem(8px); + background: $ibexa-color-light-300; + border: calculateRem(1px) solid $ibexa-color-light-300; + border-radius: $ibexa-border-radius; +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_togglers.scss b/public/bundles/ibexaadminui/scss/mixins/_togglers.scss new file mode 100644 index 000000000..d307baf95 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_togglers.scss @@ -0,0 +1,45 @@ +@mixin toggler-wrapper { + position: relative; + display: flex; + border: calculateRem(1px) solid $ibexa-color-dark-300; + border-radius: $ibexa-border-radius; + margin-right: calculateRem(10px); + font-size: calculateRem(14px); + line-height: 1; +} + +@mixin toggler-btn { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + user-select: none; + margin-bottom: 0; +} + +@mixin toggler-icon-btn { + width: calculateRem(32px); + height: calculateRem(32px); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + user-select: none; + margin-bottom: 0; + padding: 0; + border-radius: 0; + + .ibexa-icon { + fill: $ibexa-color-dark-300; + } +} + +@mixin toggler-selected-btn { + color: $ibexa-color-white; + background: $ibexa-color-dark-300; + transition: transform 0.3s $ibexa-admin-transition; + + .ibexa-icon { + fill: $ibexa-color-white; + } +} diff --git a/public/bundles/ibexaadminui/scss/mixins/_type-icon.scss b/public/bundles/ibexaadminui/scss/mixins/_type-icon.scss new file mode 100644 index 000000000..571b8c596 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/mixins/_type-icon.scss @@ -0,0 +1,21 @@ +@mixin type-icon { + display: flex; + align-items: center; + justify-content: center; + width: calculateRem(24px); + height: calculateRem(24px); + text-align: center; + border-radius: 50%; + background: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-white; + width: calculateRem(16px); + height: calculateRem(16px); + } +} + +@mixin type-icon-read { + fill: $ibexa-color-light-200; + opacity: 0.5; +} diff --git a/public/bundles/ibexaadminui/scss/polyfill/_div.import.scss b/public/bundles/ibexaadminui/scss/polyfill/_div.import.scss new file mode 100644 index 000000000..ede5ed16e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/polyfill/_div.import.scss @@ -0,0 +1 @@ +@forward 'sass:math' show div; diff --git a/public/bundles/ibexaadminui/scss/polyfill/_div.scss b/public/bundles/ibexaadminui/scss/polyfill/_div.scss new file mode 100644 index 000000000..3535e65b4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/polyfill/_div.scss @@ -0,0 +1,3 @@ +@function div($number1, $number2) { + @return $number1 / $number2; +} diff --git a/public/bundles/ibexaadminui/scss/ui/ibexa-modules.scss b/public/bundles/ibexaadminui/scss/ui/ibexa-modules.scss new file mode 100644 index 000000000..140418e1a --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/ibexa-modules.scss @@ -0,0 +1,8 @@ +@import '../custom'; +@import '../functions/calculate.rem'; +@import '../mixins'; +@import 'modules/common'; +@import 'modules/multi.file.upload'; +@import 'modules/sub.items.list'; +@import 'modules/content.tree'; +@import 'modules/universal.discovery'; diff --git a/public/bundles/ibexaadminui/scss/ui/modules/_common.scss b/public/bundles/ibexaadminui/scss/ui/modules/_common.scss new file mode 100644 index 000000000..e29cac286 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/_common.scss @@ -0,0 +1,4 @@ +@import 'common/popup'; +@import 'common/tooltip.popup'; +@import 'common/thumbnail'; +@import 'common/simple.dropdown'; diff --git a/public/bundles/ibexaadminui/scss/ui/modules/_content.tree.scss b/public/bundles/ibexaadminui/scss/ui/modules/_content.tree.scss new file mode 100644 index 000000000..8c88cf277 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/_content.tree.scss @@ -0,0 +1,5 @@ +@import 'content-tree/list.item'; +@import 'content-tree/list'; +@import 'content-tree/header'; +@import 'content-tree/popup.actions'; +@import 'content-tree/main'; diff --git a/public/bundles/ibexaadminui/scss/ui/modules/_multi.file.upload.scss b/public/bundles/ibexaadminui/scss/ui/modules/_multi.file.upload.scss new file mode 100644 index 000000000..7896835c4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/_multi.file.upload.scss @@ -0,0 +1,5 @@ +@import 'muti-file-upload/drop.area'; +@import 'muti-file-upload/progress.bar'; +@import 'muti-file-upload/upload.item'; +@import 'muti-file-upload/upload.list'; +@import 'muti-file-upload/upload.popup'; diff --git a/public/bundles/ibexaadminui/scss/ui/modules/_sub.items.list.scss b/public/bundles/ibexaadminui/scss/ui/modules/_sub.items.list.scss new file mode 100644 index 000000000..04e992e9e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/_sub.items.list.scss @@ -0,0 +1,8 @@ +@import 'sub-items-list/no.items'; +@import 'sub-items-list/table.view.columns.toggler.list.element'; +@import 'sub-items-list/table.view.columns.toggler'; +@import 'sub-items-list/table.view.item'; +@import 'sub-items-list/table.view'; +@import 'sub-items-list/language.selector'; +@import 'sub-items-list/view.switcher'; +@import 'sub-items-list/main'; diff --git a/public/bundles/ibexaadminui/scss/ui/modules/_universal.discovery.scss b/public/bundles/ibexaadminui/scss/ui/modules/_universal.discovery.scss new file mode 100644 index 000000000..1b37921cd --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/_universal.discovery.scss @@ -0,0 +1,31 @@ +@import 'universal-discovery/main'; +@import 'universal-discovery/tab'; +@import 'universal-discovery/top.menu'; +@import 'universal-discovery/top.menu.search.input'; +@import 'universal-discovery/actions.menu'; +@import 'universal-discovery/content.create'; +@import 'universal-discovery/content.create.widget'; +@import 'universal-discovery/content.create.button'; +@import 'universal-discovery/content.edit'; +@import 'universal-discovery/content.edit.button'; +@import 'universal-discovery/sort.switcher'; +@import 'universal-discovery/view.switcher'; +@import 'universal-discovery/tab.selector'; +@import 'universal-discovery/finder'; +@import 'universal-discovery/finder.branch'; +@import 'universal-discovery/finder.leaf'; +@import 'universal-discovery/content.meta.preview'; +@import 'universal-discovery/selected.locations'; +@import 'universal-discovery/selected.locations.item'; +@import 'universal-discovery/grid'; +@import 'universal-discovery/breadcrumbs'; +@import 'universal-discovery/search'; +@import 'universal-discovery/search.tags'; +@import 'universal-discovery/content.table.item'; +@import 'universal-discovery/content.table'; +@import 'universal-discovery/filters'; +@import 'universal-discovery/bookmarks.list'; +@import 'universal-discovery/translation.selector'; +@import 'universal-discovery/tree'; +@import 'universal-discovery/toggle.selection'; +@import 'universal-discovery/dropdown'; diff --git a/public/bundles/ibexaadminui/scss/ui/modules/common/_popup.scss b/public/bundles/ibexaadminui/scss/ui/modules/common/_popup.scss new file mode 100644 index 000000000..9fcba574b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/common/_popup.scss @@ -0,0 +1,49 @@ +.c-popup { + &__content { + @include modal-content(); + } + + &__header { + @include modal-header(); + } + + &__btn--close { + @include close-button(); + } + + &__body { + @include modal-body(); + } + + &__footer { + @include modal-footer(); + } + + &__headline { + max-width: calc(100% - #{calculateRem(56px)}); + } + + &__title { + @include modal-title(); + } + + &__subtitle { + @include modal-subtitle(); + } + + &--no-header { + .c-popup { + &__btn--close { + @include close-button(); + + top: calculateRem(22px); + right: calculateRem(18px); + } + + &__body { + padding-bottom: 0; + margin-right: calculateRem(36px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/common/_simple.dropdown.scss b/public/bundles/ibexaadminui/scss/ui/modules/common/_simple.dropdown.scss new file mode 100644 index 000000000..05a14cc45 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/common/_simple.dropdown.scss @@ -0,0 +1,145 @@ +.c-simple-dropdown { + position: relative; + min-width: calculateRem(120px); + height: calculateRem(32px); + border: calculateRem(1px) solid transparent; + border-radius: $ibexa-border-radius; + display: flex; + align-items: center; + + &__selected { + font-size: $ibexa-text-font-size-medium; + padding: calculateRem(2px) calculateRem(30px) calculateRem(2px) calculateRem(8px); + min-height: calculateRem(21px); + cursor: pointer; + position: relative; + width: 100%; + } + + &__expand-icon { + position: absolute; + top: calculateRem(7px); + right: calculateRem(8px); + } + + &__items { + position: absolute; + z-index: 200; + right: calculateRem(-10px); + top: calculateRem(30px); + min-width: calculateRem(170px); + padding: calculateRem(8px); + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(32px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.1); + transition: opacity $ibexa-admin-transition-duration $ibexa-admin-transition; + opacity: 0; + height: 0; + overflow: hidden; + } + + &__list-items { + list-style: none; + padding: 0; + margin: 0; + } + + &__list-item-checkmark { + position: absolute; + right: calculateRem(4px); + display: none; + align-items: center; + justify-content: center; + width: calculateRem(20px); + height: calculateRem(20px); + border-radius: 50%; + background: $ibexa-color-light-400; + } + + &__list-item { + font-size: $ibexa-text-font-size-medium; + padding: calculateRem(9px) calculateRem(40px) calculateRem(9px) calculateRem(15px); + border-radius: $ibexa-border-radius; + cursor: pointer; + + &--selected { + position: relative; + + .c-simple-dropdown__list-item-checkmark { + display: flex; + position: absolute; + top: 50%; + right: calculateRem(15px); + margin-top: calculateRem(-10px); + } + } + + &:hover { + background-color: $ibexa-color-light-400; + } + } + + &__list-item-type-icon, + &__selected-item-type-icon { + margin-right: calculateRem(8px); + margin-top: calculateRem(-2px); + } + + &__option-label { + display: flex; + align-items: center; + } + + &__arrow-down, + &__arrow-up { + margin-left: calculateRem(4px); + margin-bottom: 0; + } + + &__arrow-down { + transform: rotate(270deg); + } + + &__arrow-up { + transform: rotate(90deg); + } + + &:hover { + border-color: $ibexa-color-primary; + + .c-simple-dropdown__expand-icon { + fill: $ibexa-color-primary; + } + } + + &--expanded &__items { + opacity: 1; + height: auto; + } + + &--disabled { + opacity: 0.3; + cursor: not-allowed; + + .c-simple-dropdown { + &__selected { + cursor: not-allowed; + } + } + } + + &--switcher { + &:hover { + border-color: transparent; + + .c-simple-dropdown__selected { + color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/common/_tooltip.popup.scss b/public/bundles/ibexaadminui/scss/ui/modules/common/_tooltip.popup.scss new file mode 100644 index 000000000..c1763cf6d --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/common/_tooltip.popup.scss @@ -0,0 +1,19 @@ +.c-tooltip-popup { + @include modal-main(); + + &__header { + @include modal-header(); + } + + &__title { + margin: 0; + } + + &__close { + @include close-button(); + } + + &__footer { + @include modal-footer(); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/common/thumbnail.scss b/public/bundles/ibexaadminui/scss/ui/modules/common/thumbnail.scss new file mode 100644 index 000000000..86a6c0114 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/common/thumbnail.scss @@ -0,0 +1,15 @@ +.c-thumbnail { + position: relative; + + &__icon-wrapper { + position: absolute; + top: 0; + left: 0; + width: calculateRem(30px); + height: calculateRem(30px); + background: $ibexa-color-white; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_header.scss b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_header.scss new file mode 100644 index 000000000..1edf42eb4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_header.scss @@ -0,0 +1,43 @@ +.c-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: calculateRem(8px); + padding-bottom: calculateRem(8px); + border-bottom: calculateRem(1px) solid $ibexa-color-light-500; + + &__toggle-btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + background: $ibexa-color-white; + width: calculateRem(48px); + height: calculateRem(48px); + + .ibexa-icon:nth-child(2) { + margin-left: calculateRem(4px); + } + } + + &__name { + width: calc(100% - #{calculateRem(110px)}); + font-size: $ibexa-text-font-size-large; + font-weight: bold; + text-align: center; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + line-height: calculateRem(33px); + + .ibexa-icon { + margin-right: calculateRem(8px); + } + } + + &__options { + display: flex; + justify-content: flex-end; + width: calculateRem(48px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_list.item.scss b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_list.item.scss new file mode 100644 index 000000000..1b3c63710 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_list.item.scss @@ -0,0 +1,269 @@ +.c-list-item { + line-height: calculateRem(21px); + min-height: calculateRem(21px); + margin: calculateRem(2px); + position: relative; + + &:not(&--is-root-item) { + &::after { + content: ' '; + display: block; + position: absolute; + z-index: 2; + background: repeating-linear-gradient( + 90deg, + $ibexa-color-dark-300, + $ibexa-color-dark-300 calculateRem(2px), + transparent calculateRem(2px), + transparent calculateRem(4px) + ); + width: calculateRem(12px); + height: calculateRem(1px); + left: calculateRem(-3px); + top: calculateRem(16px); + } + + &:not(.c-list-item--has-sub-items) { + &::after { + width: calculateRem(28px); + } + } + } + + &__row { + position: relative; + display: flex; + align-items: center; + padding: 0 calculateRem(8px) 0 calc(#{calculateRem(16px)} + var(--indent, 0) * #{calculateRem(16px)}); + border-radius: $ibexa-border-radius; + border: calculateRem(1px) solid transparent; + margin-left: calc(var(--indent, 0) * #{calculateRem(-14px)}); + + &:hover, + &:focus { + border-color: $ibexa-color-light; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + .c-list-item { + &__actions { + opacity: 1; + } + } + } + } + + &__prefix-actions-item { + position: relative; + } + + &__prefix-actions-item-empty { + &::after { + content: ' '; + display: block; + position: absolute; + z-index: 2; + background: repeating-linear-gradient( + 90deg, + $ibexa-color-dark-300, + $ibexa-color-dark-300 calculateRem(2px), + transparent calculateRem(2px), + transparent calculateRem(4px) + ); + width: calculateRem(20px); + height: calculateRem(1px); + left: calculateRem(-6.5px); + top: calculateRem(10px); + } + } + + &__label { + display: flex; + align-items: center; + flex: 1; + white-space: nowrap; + position: relative; + font-size: $ibexa-text-font-size-medium; + line-height: calculateRem(21px); + min-height: calculateRem(21px); + padding: calculateRem(5px) calculateRem(14px) calculateRem(5px) 0; + overflow: hidden; + color: $ibexa-color-dark; + text-decoration: none; + + &:hover, + &:focus { + text-decoration: none; + color: inherit; + } + } + + &__label-content { + overflow: hidden; + text-overflow: ellipsis; + } + + &__icon { + height: calculateRem(20px); + display: inline-flex; + align-items: center; + margin-right: calculateRem(4px); + } + + &__toggler { + position: relative; + height: 100%; + width: calculateRem(16px); + + &::before { + width: 0; + height: 0; + border-style: solid; + border-width: calculateRem(4px) 0 calculateRem(4px) calculateRem(6px); + border-color: transparent transparent transparent $ibexa-color-dark; + display: inline-block; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + transform-origin: center center; + } + + &:focus { + border: none; + outline: none; + } + } + + &__actions { + display: flex; + opacity: 0; + } + + &__actions-item { + display: flex; + padding-left: calculateRem(4px); + } + + &__load-more-btn { + position: relative; + z-index: 3; + display: flex; + align-items: center; + padding: calculateRem(4px) calculateRem(8px); + background: $ibexa-color-white; + border: 0; + color: $ibexa-color-dark; + text-decoration: underline; + font-size: $ibexa-text-font-size-medium; + transition: background $ibexa-admin-transition-duration $ibexa-admin-transition, + color $ibexa-admin-transition-duration $ibexa-admin-transition; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + &__load-more-btn-spinner { + margin-right: calculateRem(4px); + } + + &__load-more-limit-info { + position: relative; + z-index: 3; + display: flex; + align-items: center; + padding: calculateRem(4px) calculateRem(8px); + background: $ibexa-color-white; + color: $ibexa-color-danger; + font-size: $ibexa-text-font-size-small; + } + + .c-list { + opacity: 0; + list-style: none; + display: none; + max-width: 0; + overflow: hidden; + } + + &--has-sub-items { + > .c-list-item__row { + .c-list-item__toggler { + cursor: pointer; + + &:before { + content: ''; + } + } + } + } + + &--is-expanded { + max-height: initial; + + &::before { + content: ' '; + display: block; + position: absolute; + z-index: 2; + background: repeating-linear-gradient( + $ibexa-color-dark-300, + $ibexa-color-dark-300 calculateRem(2px), + transparent calculateRem(2px), + transparent calculateRem(4px) + ); + width: calculateRem(1px); + left: calculateRem(8px); + top: calculateRem(16px); + bottom: calculateRem(16px); + } + + > .c-list { + opacity: 1; + display: block; + max-width: initial; + overflow: initial; + } + + > .c-list-item { + &__row { + .c-list-item__toggler { + &::before { + border-width: calculateRem(6px) calculateRem(4px) 0 calculateRem(4px); + border-color: $ibexa-color-dark transparent transparent transparent; + transform: translateY(-50%); + } + } + } + } + } + + &--is-hidden { + > .c-list-item { + &__row { + border-color: $ibexa-color-light-400; + background: repeating-linear-gradient( + -80deg, + transparent, + transparent calculateRem(4px), + $ibexa-color-light-400 calculateRem(4px), + $ibexa-color-light-400 calculateRem(5px) + ); + } + } + } + + &--is-selected { + > .c-list-item { + &__row { + border-color: $ibexa-color-light-400; + background-color: $ibexa-color-light-400; + + &:hover, + &:focus { + border-color: $ibexa-color-light; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_list.scss b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_list.scss new file mode 100644 index 000000000..550ca4233 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_list.scss @@ -0,0 +1,11 @@ +.c-list { + margin: 0; + padding: 0 0 0 calculateRem(12px); + list-style: none; + + &__no-items-message { + padding: calculateRem(10px); + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_main.scss b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_main.scss new file mode 100644 index 000000000..c9becf6ea --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_main.scss @@ -0,0 +1,40 @@ +.m-tree { + padding: calculateRem(8px); + height: 100%; + background: $ibexa-color-light-200; + + &__resize-handler { + width: calculateRem(3px); + position: absolute; + top: 0; + bottom: 0; + right: 0; + background: $ibexa-color-light-200; + border-right: calculateRem(1px) solid $ibexa-color-light; + cursor: col-resize; + } + + &__scrollable-wrapper { + overflow: auto; + padding: calculateRem(12px); + } + + &__loading-spinner { + display: flex; + justify-content: center; + align-items: center; + height: calc(100% - #{calculateRem(100px)}); + width: 100%; + } + + &__collapse-all-btn { + width: 100%; + border-top: calculateRem(1px) solid $ibexa-color-white; + height: calculateRem(30px); + padding: calculateRem(7px); + font-size: $ibexa-text-font-size-small; + text-align: right; + color: $ibexa-color-dark-300; + cursor: pointer; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_popup.actions.scss b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_popup.actions.scss new file mode 100644 index 000000000..a64a7177d --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/content-tree/_popup.actions.scss @@ -0,0 +1,37 @@ +.c-popup-actions { + font-size: $ibexa-text-font-size-medium; + cursor: pointer; + margin-right: calculateRem(8px); + + &__items { + position: fixed; + z-index: 250; + background: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + color: $ibexa-color-dark; + border-radius: $ibexa-border-radius; + display: flex; + flex-direction: column; + } + + &__items-list { + list-style: none; + margin: 0; + padding: 0; + overflow-y: auto; + } + + &__item { + padding: calculateRem(9px) calculateRem(24px); + line-height: calculateRem(21px); + transition: background $ibexa-admin-transition-duration $ibexa-admin-transition; + border-radius: $ibexa-border-radius; + cursor: pointer; + display: flex; + align-items: center; + + &:hover { + background-color: $ibexa-color-light-300; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_drop.area.scss b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_drop.area.scss new file mode 100644 index 000000000..c4a006bef --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_drop.area.scss @@ -0,0 +1,29 @@ +.c-drop-area { + border: calculateRem(1px) dashed $ibexa-color-dark-300; + border-radius: $ibexa-border-radius; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + &__message { + color: $ibexa-color-dark-400; + margin-bottom: calculateRem(12px); + + &--main { + cursor: auto; + font-weight: bold; + margin-top: calculateRem(44px); + } + + &--filesize { + color: $ibexa-color-dark-300; + font-size: $ibexa-text-font-size-medium; + margin: calculateRem(12px) 0 calculateRem(44px); + } + } + + &__input--hidden { + display: none; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_progress.bar.scss b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_progress.bar.scss new file mode 100644 index 000000000..88c2ff41f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_progress.bar.scss @@ -0,0 +1,35 @@ +.c-progress-bar { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + + &__value { + background: linear-gradient(90deg, $ibexa-color-warning 0%, $ibexa-color-accent 44.95%, $ibexa-color-success 100%); + border-radius: calculateRem(4px); + transition: width 0.2s linear; + height: calculateRem(8px); + width: 10vw; + position: relative; + + &::after { + content: ''; + width: calc(100% - var(--progress)); + height: calculateRem(10px); + border-radius: calculateRem(4px); + position: absolute; + right: 0; + top: calculateRem(-1px); + background: radial-gradient( + circle at 0 50%, + rgba($ibexa-color-light, 0) calculateRem(4px), + $ibexa-color-light calculateRem(0px) + ); + } + } + + &__label { + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.item.scss b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.item.scss new file mode 100644 index 000000000..bddf4aeed --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.item.scss @@ -0,0 +1,96 @@ +.c-upload-list-item { + display: flex; + background: $ibexa-color-white; + padding: calculateRem(8px) 0; + min-height: calculateRem(60px); + + &--errored { + background: $ibexa-color-danger-100; + color: $ibexa-color-danger; + border-radius: $ibexa-border-radius; + + .ibexa-icon { + fill: $ibexa-color-danger; + } + + .c-upload-list-item__size { + color: $ibexa-color-danger; + } + } + + &__icon-wrapper { + flex: 0 0 calculateRem(20px); + display: flex; + justify-content: center; + align-items: center; + } + + &__meta { + padding: 0 calculateRem(16px); + line-height: 1.4; + max-width: 25vw; + display: flex; + justify-content: center; + align-items: center; + } + + &__name { + font-size: calculateRem(16px); + margin-right: calculateRem(8px); + max-width: 15vw; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + &__size { + color: $ibexa-color-dark-300; + font-size: $ibexa-text-font-size-medium; + } + + &__info { + flex: 1 1 auto; + display: flex; + justify-content: flex-end; + align-items: center; + } + + &__message { + font-style: italic; + font-size: $ibexa-text-font-size-small; + + .ibexa-icon { + margin-right: calculateRem(4px); + } + + &--success { + color: $ibexa-color-success; + + .ibexa-icon { + fill: $ibexa-color-success; + } + } + } + + &__actions { + text-align: right; + + .ibexa-btn { + margin: 0; + } + } + + &__action { + display: inline-flex; + align-items: center; + justify-content: center; + margin-right: calculateRem(15px); + width: calculateRem(44px); + height: calculateRem(44px); + cursor: pointer; + + &:last-child { + margin-right: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.list.scss b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.list.scss new file mode 100644 index 000000000..5d3a1027f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.list.scss @@ -0,0 +1,14 @@ +.c-upload-list { + &__items { + margin-top: calculateRem(32px); + padding: calculateRem(16px) 0; + + &:not(:empty) { + border-top: calculateRem(1px) solid $ibexa-color-light-500; + } + + &:last-child { + padding-bottom: 0; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.popup.scss b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.popup.scss new file mode 100644 index 000000000..b54978b66 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/muti-file-upload/_upload.popup.scss @@ -0,0 +1,39 @@ +.c-upload-popup { + background: rgba($ibexa-color-black, 0.35); + position: fixed; + z-index: 99999; + top: 0; + left: 0; + height: 100vh; + width: 100vw; + color: $ibexa-color-dark; + + .c-tooltip-popup { + width: 100%; + max-width: calculateRem(774px); + position: absolute; + z-index: 2; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + padding: 0 calculateRem(24px); + + &__header { + @include modal-header(); + + padding: $modal-header-padding-y $modal-header-padding-x; + border-bottom: $modal-header-border-width solid $modal-header-border-color; + } + + &__content { + @include modal-body(); + + padding: $modal-inner-padding; + } + } + + .c-upload-list { + overflow-y: auto; + max-height: 30vw; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_language.selector.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_language.selector.scss new file mode 100644 index 000000000..a031328cd --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_language.selector.scss @@ -0,0 +1,14 @@ +.c-language-selector { + .ibexa-instant-filter { + &__items { + margin-top: calculateRem(5px); + max-height: calc(100vh - #{calculateRem(220px)}); + overflow: auto; + + .form-check-label { + font-size: $ibexa-text-font-size; + line-height: calculateRem(50px); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_main.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_main.scss new file mode 100644 index 000000000..23d9667f9 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_main.scss @@ -0,0 +1,61 @@ +.m-sub-items { + margin-top: calculateRem(72px); + margin-bottom: calculateRem(24px); + padding: calculateRem(16px) 0; + background: $ibexa-color-white; + border-radius: $ibexa-border-radius; + + .table .ibexa-table__header-cell { + border-top-width: 0; + } + + .ibexa-table-header { + margin-bottom: 0; + padding-bottom: calculateRem(20px); + border-bottom: calculateRem(1px) solid $ibexa-color-dark-200; + margin-top: 0; + + .c-simple-dropdown { + &:hover { + .c-simple-dropdown__selected { + color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + } + } + + &__list { + font-size: $ibexa-text-font-size; + line-height: calculateRem(40px); + text-align: left; + position: relative; + margin-bottom: calculateRem(16px); + } + + &__list--processing:after { + content: ''; + position: absolute; + z-index: 999; + background: rgba($ibexa-color-black, 0.35); + top: 0; + left: 0; + right: 0; + bottom: 0; + } + + &__spinner-wrapper { + top: 50%; + left: 50%; + position: absolute; + transform: translate(-50%, -50%); + } + + &__spinner { + display: block; + margin: calculateRem(20px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_no.items.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_no.items.scss new file mode 100644 index 000000000..7eea19469 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_no.items.scss @@ -0,0 +1,6 @@ +.c-no-items { + padding: 0 calculateRem(32px); + font-style: italic; + font-size: $ibexa-text-font-size-medium; + color: $ibexa-color-black; +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.columns.toggler.list.element.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.columns.toggler.list.element.scss new file mode 100644 index 000000000..f95d5fb75 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.columns.toggler.list.element.scss @@ -0,0 +1,19 @@ +.c-table-view-columns-toggler-list-element { + cursor: pointer; + + .ibexa-popup-menu__item-content { + display: flex; + } + + .ibexa-input--checkbox { + margin-right: calculateRem(8px); + } + + &__label { + white-space: nowrap; + user-select: none; + font-size: $ibexa-text-font-size-medium; + cursor: pointer; + font-weight: normal; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.columns.toggler.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.columns.toggler.scss new file mode 100644 index 000000000..59c29724c --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.columns.toggler.scss @@ -0,0 +1,18 @@ +.c-table-view-columns-toggler { + height: 100%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + color: $ibexa-color-dark; + + &__panel { + top: calculateRem(36px); + right: calculateRem(17px); + + &--above-btn { + bottom: calculateRem(36px); + top: auto; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.item.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.item.scss new file mode 100644 index 000000000..51618aaba --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.item.scss @@ -0,0 +1,143 @@ +.c-table-view-item { + &__translation { + display: block; + } + + &__cell { + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + .ibexa-table.table &--shadow-left { + box-shadow: calculateRem(-13px) calculateRem(5px) calculateRem(20px) 0 rgba($ibexa-color-info, 0.1); + } + + .ibexa-table.table &--shadow-right { + box-shadow: calculateRem(13px) calculateRem(5px) calculateRem(20px) 0 rgba($ibexa-color-info, 0.1); + } + + &--content-type { + min-width: calculateRem(130px); + } + + &--name .c-table-view-item__text-wrapper { + min-width: calculateRem(120px); + } + + &--modified .c-table-view-item__text-wrapper { + max-width: calculateRem(190px); + } + + &--checkbox { + position: sticky; + z-index: 1; + left: 0; + width: calculateRem(30px); + line-height: 0; + background: $ibexa-color-white; + } + + &--name { + position: sticky; + z-index: 1; + left: calculateRem(48px); + padding-left: 0; + padding-right: calculateRem(5px); + background: $ibexa-color-white; + } + + &--priority { + padding-top: 0; + width: calculateRem(80px); + } + + &--actions { + position: sticky; + right: 0; + width: calculateRem(70px); + padding: 0; + background: $ibexa-color-white; + } + + &--toggler { + position: absolute; + height: calculateRem(55px); + width: calculateRem(80px); + } + } + + &__inner-wrapper { + cursor: pointer; + + &--input { + width: 7ch; + } + } + + &__priority-wrapper { + position: relative; + min-width: calculateRem(145px); + } + + &__priority-actions { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + right: 0; + top: 0; + } + + &__priority-value { + max-width: 100%; + padding: 0 calculateRem(10px); + } + + &__btn { + &--submit { + margin-right: calculateRem(8px); + } + + &--edit { + text-align: center; + cursor: pointer; + color: $ibexa-color-white; + display: inline-block; + + .c-table-view-item__btn-inner { + padding: calculateRem(7px) calculateRem(14px); + height: 100%; + display: flex; + align-items: center; + } + } + + &:hover { + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + + &__link { + display: inline-block; + cursor: pointer; + } + + &__icon-with-name-wrapper { + display: flex; + align-items: center; + + .ibexa-icon { + flex-shrink: 0; + margin-right: calculateRem(16px); + } + } + + &--active { + .c-table-view-item { + &__cell, + &__priority-actions { + background: $ibexa-color-light-200; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.scss new file mode 100644 index 000000000..e118fd45d --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_table.view.scss @@ -0,0 +1,126 @@ +.c-table-view { + border-collapse: separate; + width: 100%; + margin-bottom: 0; + + &__wrapper { + position: relative; + } + + &__scroller { + overflow-x: auto; + } + + &__columns-toggler { + height: 100%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + } + + &__columns-toggler-btn { + padding: calculateRem(5px); + height: calculateRem(32px); + width: calculateRem(32px); + } + + &__columns-toggler-panel { + border-radius: calculateRem(4px); + background: $ibexa-color-white; + position: absolute; + z-index: 10; + padding: calculateRem(4px) calculateRem(14px); + top: calculateRem(36px); + right: calculateRem(17px); + font-weight: normal; + box-shadow: 0 calculateRem(2px) calculateRem(4px) 0 rgba($ibexa-color-black, 0.45); + } + + &__columns-toggler-list { + padding: 0; + margin: 0; + list-style: none; + } + + &__columns-toggler-option { + cursor: pointer; + + .form-check-inline { + display: flex; + justify-content: flex-start; + align-items: center; + padding: calculateRem(12px) calculateRem(4px); + margin-right: calculateRem(12px); + line-height: 0; + } + } + + &__columns-toggler-option-label { + white-space: nowrap; + user-select: none; + font-size: $ibexa-text-font-size-medium; + cursor: pointer; + } + + &__cell { + .ibexa-table.table &--shadow-left { + box-shadow: calculateRem(-13px) calculateRem(5px) calculateRem(20px) 0 rgba($ibexa-color-info, 0.1); + } + + .ibexa-table.table &--shadow-right { + box-shadow: calculateRem(13px) calculateRem(5px) calculateRem(20px) 0 rgba($ibexa-color-info, 0.1); + } + + &--head { + white-space: nowrap; + } + + &--checkbox { + position: sticky; + padding: 0; + left: 0; + z-index: 1; + height: calculateRem(43px); + width: calculateRem(30px); + padding-left: calculateRem(16px); + background: $ibexa-color-white; + } + + &--name { + position: sticky; + z-index: 1; + left: calculateRem(48px); + padding-left: 0; + background: $ibexa-color-white; + } + + &--actions { + position: sticky; + right: 0; + width: calculateRem(70px); + padding: 0; + background: $ibexa-color-white; + z-index: 1; + } + + &--toggler { + position: absolute; + right: 0; + height: calculateRem(55px); + width: calculateRem(80px); + } + } + + &__head { + border-top: calculateRem(1px) solid $ibexa-color-light-200; + border-bottom: calculateRem(1px) solid $ibexa-color-light-200; + } + + &__body { + .c-no-items { + padding-top: calculateRem(7px); + padding-left: calculateRem(39px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_view.switcher.scss b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_view.switcher.scss new file mode 100644 index 000000000..dafe7638a --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/sub-items-list/_view.switcher.scss @@ -0,0 +1,5 @@ +.c-view-switcher { + margin-left: calculateRem(8px); + padding-left: calculateRem(8px); + border-left: calculateRem(2px) solid $ibexa-color-light; +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_actions.menu.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_actions.menu.scss new file mode 100644 index 000000000..98a6305f8 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_actions.menu.scss @@ -0,0 +1,10 @@ +.c-actions-menu { + display: flex; + align-items: center; + justify-content: flex-end; + padding: calculateRem(24px) calculateRem(55px); + + &__cancel-btn-wrapper { + margin-left: calculateRem(16px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_bookmarks.list.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_bookmarks.list.scss new file mode 100644 index 000000000..ea73e8fbf --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_bookmarks.list.scss @@ -0,0 +1,44 @@ +.c-bookmarks-list { + width: calculateRem(215px); + background-color: $ibexa-color-light-200; + overflow: auto; + flex-shrink: 0; + margin-left: calculateRem(1px); + + &__item { + cursor: pointer; + display: flex; + align-items: center; + padding: calculateRem(7px) calculateRem(12px); + font-size: $ibexa-text-font-size; + + &--not-selectable { + background-color: $ibexa-color-light-500; + cursor: not-allowed; + } + + &--marked { + background-color: $ibexa-color-light-500; + color: $ibexa-color-primary; + font-weight: bold; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + + &__item-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: calculateRem(185px); + margin-left: calculateRem(5px); + } + + &__spinner-wrapper { + display: flex; + justify-content: center; + align-items: center; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_breadcrumbs.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_breadcrumbs.scss new file mode 100644 index 000000000..9f4992316 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_breadcrumbs.scss @@ -0,0 +1,112 @@ +.c-breadcrumbs { + display: flex; + align-items: center; + padding: calculateRem(12px) calculateRem(16px) calculateRem(14px); + + &__hidden-list-wrapper { + margin-right: calculateRem(8px); + position: relative; + } + + &__hidden-list { + display: none; + + &--visible { + position: absolute; + top: 100%; + left: 0; + z-index: 1; + margin-bottom: 0; + padding-left: 0; + display: block; + list-style: none; + background-color: $ibexa-color-white; + box-shadow: 0 calculateRem(4px) calculateRem(6px) 0 rgba(135, 135, 135, 0.35); + color: $ibexa-color-primary; + padding: calculateRem(16px); + } + } + + &__hidden-list-item { + padding: calculateRem(4px) 0; + white-space: nowrap; + max-width: calculateRem(500px); + text-overflow: ellipsis; + overflow: hidden; + cursor: pointer; + } + + &__hidden-list-toggler { + height: calculateRem(20px); + width: calculateRem(26px); + border: calculateRem(1px) solid $ibexa-color-dark-300; + border-radius: $ibexa-border-radius; + display: flex; + padding: 0; + justify-content: center; + align-items: center; + + .ibexa-icon { + transform: rotate(90deg); + transform-origin: center center; + fill: $ibexa-color-dark-300; + } + + &--active { + background-color: $ibexa-color-dark-300; + + .ibexa-icon { + fill: $ibexa-color-white; + } + } + } + + &__list-wrapper { + width: calc(100% - #{calculateRem(34px)}); + } + + &__list { + display: flex; + list-style: none; + padding: 0; + margin-bottom: 0; + } + + &__list-item-text { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + color: $ibexa-color-dark; + } + + &__list-item { + max-width: calc(100% / 3); + display: flex; + font-size: $ibexa-text-font-size-small; + + &--last { + .c-breadcrumbs__list-item-text { + cursor: not-allowed; + color: $ibexa-color-dark-300; + text-decoration: none; + + &:hover { + color: $ibexa-color-dark-300; + } + } + } + } + + &__list-item-text { + text-decoration: underline; + + &:hover { + color: $ibexa-color-primary; + } + } + + &__list-item-separator { + margin: 0 calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.button.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.button.scss new file mode 100644 index 000000000..691ab72da --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.button.scss @@ -0,0 +1,15 @@ +.c-content-create-button { + margin-right: calculateRem(65px); + + &__btn { + .ibexa-icon { + fill: $ibexa-color-white; + } + + &:disabled { + .ibexa-icon { + fill: $ibexa-color-dark-400; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.scss new file mode 100644 index 000000000..8485debec --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.scss @@ -0,0 +1,21 @@ +.m-content-create { + height: 100%; + + &__iframe { + width: 100%; + height: 100%; + border: none; + border-radius: $ibexa-border-radius; + } + + &__actions { + display: none; + justify-content: center; + align-items: center; + height: calculateRem(50px); + } + + &__cancel-button { + margin-right: calculateRem(16px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.widget.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.widget.scss new file mode 100644 index 000000000..b69cb0034 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.create.widget.scss @@ -0,0 +1,22 @@ +.ibexa-extra-actions-container { + .c-content-create { + top: 0; + height: 100vh; + + &__confirm-wrapper { + display: flex; + margin-top: calculateRem(20px); + padding: 0 calculateRem(32px); + } + + &__confirm-button { + margin-right: calculateRem(16px); + } + + .ibexa-extra-actions { + &__content { + height: calc(100% - #{calculateRem(166px)}); + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.edit.button.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.edit.button.scss new file mode 100644 index 000000000..8c84ce7dc --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.edit.button.scss @@ -0,0 +1,13 @@ +.c-content-edit-button { + &__btn { + padding: calculateRem(4px); + width: calculateRem(34px); + height: calculateRem(34px); + display: flex; + justify-content: center; + align-items: center; + } + .ibexa-icon { + margin-right: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.edit.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.edit.scss new file mode 100644 index 000000000..69c925c4e --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.edit.scss @@ -0,0 +1,21 @@ +.c-content-edit { + height: 100%; + + &__iframe { + width: 100%; + height: 100%; + border: none; + border-radius: $ibexa-border-radius; + } + + &__actions { + display: none; + justify-content: center; + align-items: center; + height: calculateRem(50px); + } + + &__cancel-button { + margin-right: calculateRem(16px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.meta.preview.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.meta.preview.scss new file mode 100644 index 000000000..ba6976364 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.meta.preview.scss @@ -0,0 +1,108 @@ +.c-content-meta-preview { + padding: calculateRem(10px) calculateRem(20px); + position: relative; + height: 100%; + + &__preview { + width: 100%; + height: calculateRem(320px); + background-color: $ibexa-color-light-300; + border-radius: $ibexa-border-radius-small; + display: flex; + justify-content: center; + align-items: center; + + .ibexa-icon { + fill: $ibexa-color-dark-300; + } + } + + &__header { + display: flex; + justify-content: space-between; + align-items: center; + } + + &__content-name { + font-size: $ibexa-text-font-size-large; + line-height: calculateRem(33px); + font-weight: 600; + } + + &__content-type-name { + font-size: $ibexa-text-font-size; + color: $ibexa-color-dark-400; + line-height: calculateRem(24px); + } + + &__details { + margin-top: calculateRem(16px); + border-top: calculateRem(1px) solid $ibexa-color-light; + } + + &__details-item { + display: flex; + justify-content: space-between; + font-size: $ibexa-text-font-size-medium; + line-height: calculateRem(21px); + color: $ibexa-color-dark; + margin-top: calculateRem(16px); + } + + &__toggle-bookmark-button { + border: none; + align-self: flex-start; + } + + &__translations-wrapper { + display: flex; + flex-direction: column; + align-items: flex-start; + } + + &__translation { + text-align: right; + } + + &__actions { + display: flex; + justify-content: flex-end; + margin-bottom: calculateRem(21px); + font-size: $ibexa-text-font-size-medium; + line-height: calculateRem(21px); + color: $ibexa-color-dark; + + .c-content-edit-button { + display: inline-block; + } + } + + &__action-item { + display: flex; + align-items: center; + + &:not(:first-of-type) { + margin-left: calculateRem(10px); + } + + .c-content-edit-button__btn { + width: auto; + } + + .ibexa-icon { + margin-right: calculateRem(8px); + } + } + + &__loading-spinner { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + width: 100%; + + &--hidden { + display: none; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.table.item.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.table.item.scss new file mode 100644 index 000000000..c1f5401ab --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.table.item.scss @@ -0,0 +1,37 @@ +.c-content-table-item { + cursor: pointer; + + .ibexa-table__cell.ibexa-table__cell { + border: calculateRem(1px) solid transparent; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &:not(:first-child) { + border-left-width: 0; + } + + &:not(:last-child) { + border-right-width: 0; + } + } + + &--marked { + transform: scale(1); // it is a hack to have box-shadow on table row ref. https://stackoverflow.com/a/47992341 + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + .ibexa-table__cell.ibexa-table__cell { + border-color: $ibexa-color-primary; + background-color: $ibexa-color-white; + } + } + + &--not-selectable { + background-color: $ibexa-color-light-200; + cursor: not-allowed; + } + + .table &__icon-wrapper { + width: calculateRem(20px); + padding-right: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.table.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.table.scss new file mode 100644 index 000000000..b2fb9e2f6 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_content.table.scss @@ -0,0 +1,5 @@ +.c-content-table { + .ibexa-table { + border-collapse: separate; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_dropdown.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_dropdown.scss new file mode 100644 index 000000000..45dde1060 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_dropdown.scss @@ -0,0 +1,7 @@ +.c-udw-dropdown { + width: 100%; + + .ibexa-dropdown__selection-info { + margin: 0; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_filters.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_filters.scss new file mode 100644 index 000000000..3cff3be9d --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_filters.scss @@ -0,0 +1,145 @@ +.c-filters { + position: relative; + width: 100%; + height: 100%; + overflow: auto; + padding-bottom: calculateRem(24px); + + &__header { + display: flex; + position: sticky; + top: 0; + background-color: $ibexa-color-white; + z-index: 2; + align-items: center; + justify-content: space-between; + padding: calculateRem(16px) calculateRem(12px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &__header-content { + font-size: $ibexa-text-font-size-large; + font-weight: 600; + margin-right: calculateRem(8px); + } + + &__header-actions { + display: flex; + flex-wrap: nowrap; + } + + &__row-title { + position: relative; + font-size: $ibexa-text-font-size-medium; + font-weight: 600; + min-height: calculateRem(40px); + display: flex; + align-items: center; + } + + &__collapsible { + & + .c-filters__row { + border-top: calculateRem(1px) solid $ibexa-color-light; + } + + &--hidden { + .c-filters { + &__collapsible-title { + box-shadow: none; + border-bottom-color: transparent; + + &:before { + transform: rotate(135deg); + } + + &:after { + transform: rotate(-135deg); + } + } + + &__collapsible-content { + transform: scaleY(0); + opacity: 0; + height: 0; + } + } + } + } + + &__collapsible-title { + position: relative; + cursor: pointer; + padding: 0 calculateRem(24px); + font-size: $ibexa-text-font-size-medium; + font-weight: 600; + min-height: calculateRem(40px); + display: flex; + align-items: center; + border-style: solid; + border-color: $ibexa-color-light; + border-width: calculateRem(1px) 0; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + &::before, + &::after { + content: ''; + position: absolute; + z-index: 1; + top: 50%; + width: calculateRem(6px); + height: calculateRem(1px); + background: $ibexa-color-dark; + } + + &::before { + transform: rotate(225deg); + right: calculateRem(12px); + } + + &::after { + transform: rotate(-225deg); + right: calculateRem(16px); + } + } + + &__collapsible-content { + transform: scaleY(1); + transform-origin: top center; + } + + &__collapsible-content-wrapper { + padding: calculateRem(16px) calculateRem(24px); + } + + &__row { + padding: calculateRem(4px) calculateRem(24px); + + &--language { + padding-bottom: calculateRem(16px); + } + } + + &__collapsible-list { + padding: 0; + margin-bottom: 0; + list-style-type: none; + } + + &__collapsible-list-item { + padding: calculateRem(6px) 0; + + .form-check { + width: 100%; + } + + .form-check-label { + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + } + + .ibexa-input--checkbox { + margin-right: calculateRem(8px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.branch.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.branch.scss new file mode 100644 index 000000000..4670c2538 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.branch.scss @@ -0,0 +1,75 @@ +.c-finder-branch { + display: flex; + position: relative; + padding: calculateRem(18px) 0 calculateRem(18px) calculateRem(8px); + border-right: calculateRem(1px) solid $ibexa-color-light; + + &--collapsed { + flex: 0 0 calculateRem(40px); + overflow: hidden; + text-overflow: ellipsis; + background-color: $ibexa-color-light-300; + padding: calculateRem(10px); + cursor: pointer; + display: block; + border-radius: $ibexa-border-radius; + + .c-finder-branch__name { + font-size: $ibexa-text-font-size-medium; + line-height: calculateRem(20px); + font-weight: 600; + } + + & + .c-finder-branch { + border-left: 0; + } + } + + &__info-wrapper { + transform: translate(calculateRem(20px)) rotate(90deg); + width: calculateRem(500px); + transform-origin: left top; + height: calculateRem(21px); + display: flex; + align-items: center; + padding-left: calculateRem(4px); + } + + &__icon-wrapper { + position: relative; + margin-right: calculateRem(16px); + + .ibexa-icon { + position: absolute; + top: 50%; + transform: translateY(-50%); + } + } + + &__name { + margin-left: calculateRem(6px); + } + + &__items-wrapper { + overflow: auto; + width: calculateRem(190px); + padding-right: calculateRem(8px); + } + + &__resize-handler { + height: 100%; + width: calculateRem(3px); + background-color: transparent; + cursor: col-resize; + position: absolute; + top: 0; + right: 0; + } + + &__loading-spinner { + display: flex; + align-items: center; + justify-content: center; + margin-top: calculateRem(50px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.leaf.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.leaf.scss new file mode 100644 index 000000000..b4e4ed3fc --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.leaf.scss @@ -0,0 +1,101 @@ +.c-finder-leaf { + @mixin hover { + &:hover { + .c-finder-leaf__name { + color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + + &.c-finder-leaf--has-children:after { + border-left: calculateRem(6px) solid $ibexa-color-primary; + } + } + } + + cursor: pointer; + display: flex; + justify-content: flex-start; + align-items: center; + padding: calculateRem(10px) calculateRem(40px) calculateRem(10px) calculateRem(15px); + border-radius: $ibexa-border-radius; + position: relative; + + @include hover(); + + &--has-children:after { + content: ''; + width: 0; + height: 0; + border-top: calculateRem(4px) solid transparent; + border-left: calculateRem(6px) solid $ibexa-color-dark; + border-bottom: calculateRem(4px) solid transparent; + position: absolute; + right: calculateRem(15px); + top: 50%; + transform: translateY(-50%); + } + + &--marked { + font-weight: bold; + background-color: $ibexa-color-light-300; + color: $ibexa-color-primary; + + .c-finder-leaf__name { + color: $ibexa-color-dark; + font-weight: 600; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + + @include hover(); + } + + &--selected { + color: $ibexa-color-primary; + + .c-finder-leaf__name { + color: $ibexa-color-primary; + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + + &__name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: $ibexa-text-font-size-medium; + line-height: calculateRem(21px); + color: $ibexa-color-dark; + flex: 1; + + .ibexa-icon { + margin-right: calculateRem(8px); + } + } + + &__icon-wrapper { + position: relative; + margin-right: calculateRem(20px); + text-align: center; + + .ibexa-icon { + position: absolute; + top: 50%; + transform: translateY(-50%); + margin-top: calculateRem(-1px); + fill: $ibexa-color-dark; + } + } + + .c-udw-toggle-selection { + margin-right: calculateRem(15px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.scss new file mode 100644 index 000000000..bab26e3ec --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_finder.scss @@ -0,0 +1,7 @@ +.c-finder { + display: flex; + align-items: stretch; + height: 100%; + width: 100%; + overflow: auto; +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_grid.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_grid.scss new file mode 100644 index 000000000..feb62354f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_grid.scss @@ -0,0 +1,42 @@ +.c-grid { + height: 100%; + + &__items-wrapper { + padding: 0 calculateRem(16px) calculateRem(16px); + overflow: auto; + max-height: calc(100% - #{calculateRem(30px)}); + } + + .ibexa-grid-view-item { + &--marked { + border: calculateRem(1px) solid $ibexa-color-dark; + + .c-thumbnail { + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + } + + &--not-selectable { + background-color: $ibexa-color-light-200; + cursor: not-allowed; + } + + &--selected { + border: calculateRem(1px) solid $ibexa-color-primary; + + .ibexa-grid-view-item { + &__title { + color: $ibexa-color-primary; + } + } + + .c-thumbnail { + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_main.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_main.scss new file mode 100644 index 000000000..b8d80bb1b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_main.scss @@ -0,0 +1,47 @@ +.m-ud { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + height: 100vh; + width: 100vw; + padding: calculateRem(16px); + background-color: $ibexa-color-dark; + + .c-grid { + overflow: hidden; + + &__items-wrapper { + .c-thumbnail { + .ibexa-icon { + width: calculateRem(80px); + height: calculateRem(80px); + fill: $ibexa-color-dark-300; + } + } + } + + &--marked { + .c-thumbnail { + .ibexa-icon { + fill: $ibexa-color-dark; + } + } + } + } + + .c-selected-locations-item { + .c-thumbnail { + .ibexa-icon { + fill: $ibexa-color-dark-300; + } + } + } +} + +.ibexa-is-branch-resizing { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_search.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_search.scss new file mode 100644 index 000000000..d28c75c3b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_search.scss @@ -0,0 +1,118 @@ +.c-search { + height: 100%; + + &__top-bar { + display: flex; + align-items: center; + justify-content: flex-start; + width: 100%; + padding: calculateRem(25px); + margin-bottom: calculateRem(32px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + } + + &__main { + display: flex; + width: 100%; + height: 100%; + } + + &__sidebar { + display: flex; + height: 100%; + min-width: calculateRem(270px); + margin-right: calculateRem(24px); + border-right: calculateRem(1px) solid $ibexa-color-light; + background-color: $ibexa-color-white; + } + + &__spinner-wrapper { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: none; + + &--show { + display: block; + } + } + + &__content { + display: flex; + overflow: auto; + width: 100%; + flex-shrink: 1; + padding: 0 calculateRem(8px); + background-color: $ibexa-color-white; + position: relative; + } + + &__input-wrapper, + &__selector-wrapper { + margin-right: calculateRem(29px); + } + + &__select-language { + width: calculateRem(335px); + height: calculateRem(48px); + border-color: $ibexa-color-dark-200; + } + + &__search-btn { + display: flex; + justify-content: center; + align-items: center; + height: calculateRem(48px); + } + + &__table-header { + flex-direction: column; + align-items: flex-start; + margin-top: calculateRem(16px); + } + + &__table-tile { + font-size: $ibexa-text-font-size-extra-large; + } + + &__table-subtitle { + display: inline-block; + margin-bottom: calculateRem(8px); + font-size: $ibexa-text-font-size-medium; + } + + &__no-results { + display: flex; + flex-direction: column; + align-items: center; + } + + &__no-results-title, + &__no-results-subtitle { + color: $ibexa-color-dark-400; + } + + &__no-results-subtitle { + display: flex; + flex-wrap: wrap; + max-width: 60%; + margin-top: calculateRem(30px); + + .ibexa-icon { + margin-right: calculateRem(16px); + } + } + + &__no-results-hint { + flex-basis: 50%; + padding: calculateRem(8px); + display: flex; + } + + .c-content-table { + width: 100%; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_search.tags.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_search.tags.scss new file mode 100644 index 000000000..9fe731534 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_search.tags.scss @@ -0,0 +1,5 @@ +.c-search-tags { + &__tag { + margin-right: calculateRem(8px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_selected.locations.item.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_selected.locations.item.scss new file mode 100644 index 000000000..e117b7fd2 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_selected.locations.item.scss @@ -0,0 +1,56 @@ +.c-selected-locations-item { + display: flex; + align-items: center; + padding: calculateRem(5px); + margin-bottom: calculateRem(8px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-black, 0.05); + + &__image-wrapper { + width: calculateRem(42px); + height: calculateRem(42px); + background-color: $ibexa-color-light-300; + border-radius: $ibexa-border-radius-small; + display: flex; + justify-content: center; + align-items: center; + } + + &__info { + display: flex; + flex-direction: column; + justify-content: center; + flex: 1; + width: calculateRem(185px); + padding: 0 calculateRem(15px); + } + + &__info-name { + font-size: $ibexa-text-font-size; + } + + &__info-description { + font-size: $ibexa-text-font-size-small; + color: $ibexa-color-dark-400; + } + + &__actions-wrapper { + display: flex; + justify-content: flex-end; + align-items: center; + } + + &__remove-button { + width: calculateRem(32px); + height: calculateRem(32px); + padding: 0; + display: inline-flex; + justify-content: center; + align-items: center; + + .ibexa-icon { + fill: $ibexa-color-dark; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_selected.locations.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_selected.locations.scss new file mode 100644 index 000000000..f4f33d1e4 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_selected.locations.scss @@ -0,0 +1,54 @@ +.c-selected-locations { + background-color: $ibexa-color-white; + position: fixed; + top: calculateRem(95px); + right: calculateRem(16px); + min-height: calculateRem(60px); + min-width: calculateRem(390px); + border: calculateRem(1px) solid $ibexa-color-light; + border-top-left-radius: $ibexa-border-radius; + border-bottom-left-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.15); + z-index: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: calculateRem(7px) calculateRem(12px) calculateRem(7px) calculateRem(22px); + } + + &__selection-counter { + color: $ibexa-color-dark; + font-size: calculateRem(22px); + font-weight: 600; + padding-right: calculateRem(16px); + } + + &--expanded { + bottom: calculateRem(100px); + min-width: calculateRem(491px); + overflow: hidden; + + .c-selected-locations { + &__items-wrapper { + display: block; + } + } + } + + &__items-wrapper { + display: none; + overflow: auto; + padding: 0 calculateRem(38px) calculateRem(16px) calculateRem(22px); + border-top: calculateRem(1px) solid $ibexa-color-light; + height: calc(100% - calculateRem(70px)); + } + + &__actions { + padding: calculateRem(16px) 0; + display: flex; + justify-content: flex-end; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_sort.switcher.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_sort.switcher.scss new file mode 100644 index 000000000..4a0ad6943 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_sort.switcher.scss @@ -0,0 +1,5 @@ +.c-sort-switcher { + padding: calculateRem(8px); + display: flex; + align-items: center; +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tab.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tab.scss new file mode 100644 index 000000000..7a7ca9a8f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tab.scss @@ -0,0 +1,66 @@ +.c-udw-tab { + height: calc(100vh - #{calculateRem(32px)}); + display: flex; + flex-direction: column; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &__top-bar { + background-color: $ibexa-color-white; + border-top-left-radius: $ibexa-border-radius; + border-top-right-radius: $ibexa-border-radius; + z-index: 2; + } + + &__content { + display: flex; + height: 100%; + flex-shrink: 1; + border-top: calculateRem(1px) solid $ibexa-color-light; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-black, 0.05); + } + + &__left-sidebar { + position: relative; + overflow: hidden; + margin-top: calculateRem(-1px); + width: calculateRem(66px); + background-color: $ibexa-color-white; + border: calculateRem(1px) solid $ibexa-color-light; + border-bottom: 0; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + } + + &__main { + flex: 3; + background-color: $ibexa-color-white; + overflow: auto; + } + + &__right-sidebar { + flex: 1; + background-color: $ibexa-color-white; + border-left: calculateRem(1px) solid $ibexa-color-light; + overflow-y: auto; + } + + &__bottom-bar { + background-color: $ibexa-color-white; + border-top: calculateRem(1px) solid $ibexa-color-light; + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-black, 0.05); + border-bottom-left-radius: $ibexa-border-radius; + border-bottom-right-radius: $ibexa-border-radius; + } + + &__dropdown-portal { + .ibexa-dropdown__items { + position: fixed; + z-index: 250; + } + } +} + +.m-bookmarks-tab { + .c-udw-tab__main { + display: flex; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tab.selector.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tab.selector.scss new file mode 100644 index 000000000..5489d27c0 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tab.selector.scss @@ -0,0 +1,43 @@ +.c-tab-selector { + &__item { + height: calculateRem(48px); + width: calculateRem(48px); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border-radius: $ibexa-border-radius; + margin: calculateRem(12px) calculateRem(8px) calculateRem(24px); + position: relative; + + .ibexa-icon { + fill: $ibexa-color-black; + } + + &--selected { + background-color: $ibexa-color-light-400; + + .ibexa-icon { + fill: $ibexa-color-black; + } + } + + &:not(:first-of-type) { + &:before { + content: ''; + position: absolute; + top: calculateRem(-12px); + left: calculateRem(12px); + height: calculateRem(1.5px); + width: calculateRem(24px); + background-color: $ibexa-color-dark-200; + } + } + + &:hover { + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_toggle.selection.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_toggle.selection.scss new file mode 100644 index 000000000..8425e1466 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_toggle.selection.scss @@ -0,0 +1,5 @@ +.c-udw-toggle-selection { + &--hidden { + visibility: hidden; + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_top.menu.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_top.menu.scss new file mode 100644 index 000000000..7c6bdf478 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_top.menu.scss @@ -0,0 +1,55 @@ +.c-top-menu { + position: relative; + display: flex; + align-items: center; + height: calculateRem(72px); + padding: 0 calculateRem(24px) 0 calculateRem(65px); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + + &__title-wrapper, + &__actions-wrapper { + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + } + + &--search-opened { + box-shadow: calculateRem(4px) calculateRem(22px) calculateRem(47px) 0 rgba($ibexa-color-info, 0.05); + + .c-top-menu { + &__title-wrapper, + &__actions-wrapper { + opacity: 0; + } + + &__cancel-btn-wrapper { + transform: scale(0); + } + } + } + + &__cancel-btn-wrapper { + margin-left: calculateRem(24px); + } + + &__cancel-btn { + border: none; + } + + &__title-wrapper { + margin: 0 calculateRem(40px) 0 0; + font-weight: 600; + color: $ibexa-color-dark; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + &__actions-wrapper { + display: flex; + } + + .ibexa-input-text-wrapper--search { + min-width: calculateRem(200px); + margin-left: calculateRem(40px); + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_top.menu.search.input.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_top.menu.search.input.scss new file mode 100644 index 000000000..b836e6d54 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_top.menu.search.input.scss @@ -0,0 +1,36 @@ +.c-top-menu-search-input { + margin-left: calculateRem(8px); + + &--search-opened { + .c-top-menu-search-input { + &__search-input { + opacity: 1; + transform: translateY(-50%) scaleX(1); + } + } + } + + &__search-btn { + transition: none; + } + + &__search-input { + position: absolute; + width: calc(100% - #{calculateRem(224px)}); + top: 50%; + left: calculateRem(65px); + border: none; + padding: 0; + font-family: $ibexa-font-family-headings; + font-weight: $ibexa-font-weight-bold; + font-size: $ibexa-text-font-size-extra-large; + opacity: 0; + transform: translateY(-50%) scaleX(0); + transform-origin: left; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition, transform 0s; + + &:focus { + outline: none; + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_translation.selector.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_translation.selector.scss new file mode 100644 index 000000000..fc0826bc7 --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_translation.selector.scss @@ -0,0 +1,64 @@ +.c-translation-selector { + @include container-box-shadow-right; + + position: fixed; + right: 0; + top: 0; + height: 100%; + width: calculateRem(700px); + background-color: $ibexa-color-white; + transform: scaleX(1); + transform-origin: right center; + opacity: 1; + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + padding: calculateRem(16px); + z-index: 5; + + &--hidden { + transform: scaleX(0); + opacity: 0; + } + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: calculateRem(4px) calculateRem(8px) calculateRem(24px) calculateRem(16px); + margin-bottom: calculateRem(24px); + border-bottom: calculateRem(1px) solid $ibexa-color-light; + } + + &__title { + margin-bottom: 0; + } + + &__close-button { + padding: calculateRem(8px); + } + + &__languages-wrapper { + max-height: calc(100% - #{calculateRem(50px)}); + overflow: auto; + width: 75%; + padding: calculateRem(16px); + } + + &__language { + background: $ibexa-color-white; + display: flex; + width: 100%; + padding: calculateRem(13px) calculateRem(10px); + border: calculateRem(1px) solid $ibexa-color-light; + border-radius: $ibexa-border-radius; + box-shadow: calculateRem(4px) calculateRem(2px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.05); + transition: all $ibexa-admin-transition-duration $ibexa-admin-transition; + cursor: pointer; + margin-bottom: calculateRem(8px); + + &:hover { + border-color: $ibexa-color-dark; + transform: scale(1.02) translateX(-10px); + box-shadow: calculateRem(4px) calculateRem(10px) calculateRem(17px) 0 rgba($ibexa-color-info, 0.2); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tree.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tree.scss new file mode 100644 index 000000000..1832d281f --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_tree.scss @@ -0,0 +1,31 @@ +.c-tree { + width: 100%; + height: 100%; + position: relative; + + &--single-select { + .c-list-item--is-selected { + & > .c-list-item__row { + color: $ibexa-color-primary; + + .c-list-item__label { + color: $ibexa-color-primary; + } + + .ibexa-icon { + fill: $ibexa-color-primary; + } + } + } + } + + .m-tree { + border-radius: $ibexa-border-radius; + } + + .c-list-item__prefix-actions-item { + .c-udw-toggle-selection { + margin-right: calculateRem(8px); + } + } +} diff --git a/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_view.switcher.scss b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_view.switcher.scss new file mode 100644 index 000000000..752a79b5b --- /dev/null +++ b/public/bundles/ibexaadminui/scss/ui/modules/universal-discovery/_view.switcher.scss @@ -0,0 +1,11 @@ +.c-udw-view-switcher { + padding: calculateRem(8px); + display: flex; + align-items: center; + + .c-simple-dropdown { + &__items { + min-width: calculateRem(200px); + } + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md new file mode 100644 index 000000000..e28fe58d0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md @@ -0,0 +1,161 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v18.0.0...v19.0.0) (2020-04-29) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v17.0.0...v18.0.0) (2020-03-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v16.0.0...v17.0.0) (2020-02-18) + +### Other changes + +* Updated translations. ([b3bc679](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/b3bc679)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Other changes + +* Updated translations. ([5249150](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/5249150)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.5...v15.0.0) (2019-10-23) + +### Other changes + +* Updated translations. ([b7ae885](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/b7ae885)) ([f03c652](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/f03c652)) + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.4...v11.0.5) (2019-08-26) + +### Other changes + +* Changed the URL under bugs key in package.json file. Now we have one issue tracker. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([7edd73b](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/7edd73b)) +* Updated translations. ([8fb4cc2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/8fb4cc2)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.3...v11.0.4) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.2...v11.0.3) (2019-07-04) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.1...v11.0.2) (2019-06-05) + +### Other changes + +* Updated translations. ([7d00af1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/7d00af1)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.0...v11.0.1) (2019-04-10) + +### Other changes + +* Updated translations. ([3a0fe51](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/3a0fe51)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.4...v11.0.0) (2019-02-28) + +### Other changes + +* Updated translations. ([0e55853](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/0e55853)) ([818eeae](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/818eeae)) ([707fa21](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/707fa21)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.3...v10.0.4) (2018-12-05) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.2...v10.0.3) (2018-10-08) + +### Other changes + +* Updated translations. ([896412d](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/896412d)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.1...v10.0.2) (2018-07-18) + +### Other changes + +* Updated translations. ([69db8e3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/69db8e3)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.0...v10.0.1) (2018-06-21) + +### Other changes + +* Updated translations. ([6360b78](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/6360b78)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([06caac5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/06caac5)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +### Other changes + +* Updated translations. ([02712bb](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/02712bb)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +### Other changes + +* Updated translations. ([7f80868](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/7f80868)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v0.1.1...v1.0.0-alpha.1) (2017-10-03) + +### Other changes + +* The plugin will not log a warning when `config.ckfinder.uploadUrl` is not specified (because `FileRepository` will do it itself). Closes [#5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/issues/5). ([1a15688](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/1a15688)) + + +## [0.1.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v0.1.0...v0.1.1) (2017-09-03) + +### Other changes + +* Aligned the implementation to changes in the image upload. ([eb456ac](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/eb456ac)) + + +## 0.1.0 (2017-05-08) + +### Features + +* Initial implementation. Closes [#1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/issues/1). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md new file mode 100644 index 000000000..2147fe5f4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 CKFinder adapter** – https://github.com/ckeditor/ckeditor5-adapter-ckfinder
    +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/README.md new file mode 100644 index 000000000..7ef9d16fe --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/README.md @@ -0,0 +1,19 @@ +CKEditor 5 CKFinder adapter +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-adapter-ckfinder.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-adapter-ckfinder) + +This package implements a CKEditor 5 upload adapter compatible with the [CKFinder file manager and uploader](https://ckeditor.com/ckfinder/)'s server–side connector. + +## Documentation + +See the ["CKFinder integration" guide](https://ckeditor.com/docs/ckeditor5/latest/features/ckfinder.html) and the [plugin documentation](https://ckeditor.com/docs/ckeditor5/latest/api/adapter-ckfinder.html) to learn how to configure the adapter. + +Check out the {@link features/image-upload/image-upload comprehensive "Image upload overview"} to learn about other ways to upload images into CKEditor 5. + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js new file mode 100644 index 000000000..ac1e4ce30 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js @@ -0,0 +1,4 @@ +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var e={704:(e,t,r)=>{e.exports=r(79)("./src/core.js")},448:(e,t,r)=>{e.exports=r(79)("./src/upload.js")},79:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var s=t[o]={exports:{}};return e[o](s,s.exports,r),s.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.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};(()=>{"use strict";r.r(o),r.d(o,{UploadAdapter:()=>a});var e=r(704),t=r(448);const n="ckCsrfToken",s=40,i="abcdefghijklmnopqrstuvwxyz0123456789";function d(){let e=function(e){e=e.toLowerCase();const t=document.cookie.split(";");for(const r of t){const t=r.split("=");if(decodeURIComponent(t[0].trim().toLowerCase())===e)return decodeURIComponent(t[1])}return null}(n);var t,r;return e&&e.length==s||(e=function(e){let t="";const r=new Uint8Array(e);window.crypto.getRandomValues(r);for(let e=0;e.5?o.toUpperCase():o}return t}(s),t=n,r=e,document.cookie=encodeURIComponent(t)+"="+encodeURIComponent(r)+";path=/"),e}class a extends e.Plugin{static get requires(){return[t.FileRepository]}static get pluginName(){return"CKFinderUploadAdapter"}init(){const e=this.editor.config.get("ckfinder.uploadUrl");e&&(this.editor.plugins.get(t.FileRepository).createUploadAdapter=t=>new l(t,e,this.editor.t))}}class l{constructor(e,t,r){this.loader=e,this.url=t,this.t=r}upload(){return this.loader.file.then((e=>new Promise(((t,r)=>{this._initRequest(),this._initListeners(t,r,e),this._sendRequest(e)}))))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const e=this.xhr=new XMLHttpRequest;e.open("POST",this.url,!0),e.responseType="json"}_initListeners(e,t,r){const o=this.xhr,n=this.loader,s=(0,this.t)("Cannot upload file:")+` ${r.name}.`;o.addEventListener("error",(()=>t(s))),o.addEventListener("abort",(()=>t())),o.addEventListener("load",(()=>{const r=o.response;if(!r||!r.uploaded)return t(r&&r.error&&r.error.message?r.error.message:s);e({default:r.url})})),o.upload&&o.upload.addEventListener("progress",(e=>{e.lengthComputable&&(n.uploadTotal=e.total,n.uploaded=e.loaded)}))}_sendRequest(e){const t=new FormData;t.append("upload",e),t.append("ckCsrfToken",d()),this.xhr.send(t)}}})(),(window.CKEditor5=window.CKEditor5||{}).adapterCkfinder=o})(); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json new file mode 100644 index 000000000..9e2582717 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + { + "name": "CKFinder upload adapter", + "className": "CKFinderUploadAdapter", + "path": "src/uploadadapter.js", + "description": "Implements the CKEditor 5 upload adapter compatible with the CKFinder file manager and uploader's server–side connector.", + "docs": "features/images/image-upload/image-upload.html#ckfinder" + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/package.json new file mode 100644 index 000000000..91277414b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/package.json @@ -0,0 +1,63 @@ +{ + "name": "@ckeditor/ckeditor5-adapter-ckfinder", + "version": "36.0.1", + "description": "CKFinder adapter for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "ckeditor5": "^36.0.1" + }, + "devDependencies": { + "@ckeditor/ckeditor5-basic-styles": "^36.0.1", + "@ckeditor/ckeditor5-core": "^36.0.1", + "@ckeditor/ckeditor5-clipboard": "^36.0.1", + "@ckeditor/ckeditor5-dev-utils": "^32.0.0", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-enter": "^36.0.1", + "@ckeditor/ckeditor5-heading": "^36.0.1", + "@ckeditor/ckeditor5-image": "^36.0.1", + "@ckeditor/ckeditor5-list": "^36.0.1", + "@ckeditor/ckeditor5-paragraph": "^36.0.1", + "@ckeditor/ckeditor5-theme-lark": "^36.0.1", + "@ckeditor/ckeditor5-typing": "^36.0.1", + "@ckeditor/ckeditor5-undo": "^36.0.1", + "@ckeditor/ckeditor5-upload": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-adapter-ckfinder" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "dll:build": "webpack", + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js new file mode 100644 index 000000000..df679f67c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module adapter-ckfinder + */ +export { default as UploadAdapter } from './uploadadapter'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js new file mode 100644 index 000000000..d2e8a31ae --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js @@ -0,0 +1,138 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals XMLHttpRequest, FormData */ +/** + * @module adapter-ckfinder/uploadadapter + */ +import { Plugin } from 'ckeditor5/src/core'; +import { FileRepository } from 'ckeditor5/src/upload'; +import { getCsrfToken } from './utils'; +/** + * A plugin that enables file uploads in CKEditor 5 using the CKFinder server–side connector. + * + * See the {@glink features/images/image-upload/ckfinder "CKFinder file manager integration" guide} to learn how to configure + * and use this feature as well as find out more about the full integration with the file manager + * provided by the {@link module:ckfinder/ckfinder~CKFinder} plugin. + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} to learn about + * other ways to upload images into CKEditor 5. + */ +export default class CKFinderUploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [FileRepository]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'CKFinderUploadAdapter'; + } + /** + * @inheritDoc + */ + init() { + const url = this.editor.config.get('ckfinder.uploadUrl'); + if (!url) { + return; + } + // Register CKFinderAdapter + this.editor.plugins.get(FileRepository).createUploadAdapter = loader => new UploadAdapter(loader, url, this.editor.t); + } +} +/** + * Upload adapter for CKFinder. + */ +class UploadAdapter { + /** + * Creates a new adapter instance. + */ + constructor(loader, url, t) { + this.loader = loader; + this.url = url; + this.t = t; + } + /** + * Starts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#upload + */ + upload() { + return this.loader.file.then(file => { + return new Promise((resolve, reject) => { + this._initRequest(); + this._initListeners(resolve, reject, file); + this._sendRequest(file); + }); + }); + } + /** + * Aborts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#abort + */ + abort() { + if (this.xhr) { + this.xhr.abort(); + } + } + /** + * Initializes the XMLHttpRequest object. + */ + _initRequest() { + const xhr = this.xhr = new XMLHttpRequest(); + xhr.open('POST', this.url, true); + xhr.responseType = 'json'; + } + /** + * Initializes XMLHttpRequest listeners. + * + * @param resolve Callback function to be called when the request is successful. + * @param reject Callback function to be called when the request cannot be completed. + * @param file File instance to be uploaded. + */ + _initListeners(resolve, reject, file) { + const xhr = this.xhr; + const loader = this.loader; + const t = this.t; + const genericError = t('Cannot upload file:') + ` ${file.name}.`; + xhr.addEventListener('error', () => reject(genericError)); + xhr.addEventListener('abort', () => reject()); + xhr.addEventListener('load', () => { + const response = xhr.response; + if (!response || !response.uploaded) { + return reject(response && response.error && response.error.message ? response.error.message : genericError); + } + resolve({ + default: response.url + }); + }); + // Upload progress when it's supported. + /* istanbul ignore else */ + if (xhr.upload) { + xhr.upload.addEventListener('progress', evt => { + if (evt.lengthComputable) { + loader.uploadTotal = evt.total; + loader.uploaded = evt.loaded; + } + }); + } + } + /** + * Prepares the data and sends the request. + * + * @param file File instance to be uploaded. + */ + _sendRequest(file) { + // Prepare form data. + const data = new FormData(); + data.append('upload', file); + data.append('ckCsrfToken', getCsrfToken()); + // Send request. + this.xhr.send(data); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js new file mode 100644 index 000000000..9f2d765dd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js @@ -0,0 +1,58 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals window, document */ +/** + * @module adapter-ckfinder/utils + */ +const TOKEN_COOKIE_NAME = 'ckCsrfToken'; +const TOKEN_LENGTH = 40; +const tokenCharset = 'abcdefghijklmnopqrstuvwxyz0123456789'; +/** + * Returns the CSRF token value. The value is a hash stored in `document.cookie` + * under the `ckCsrfToken` key. The CSRF token can be used to secure the communication + * between the web browser and the CKFinder server. + */ +export function getCsrfToken() { + let token = getCookie(TOKEN_COOKIE_NAME); + if (!token || token.length != TOKEN_LENGTH) { + token = generateToken(TOKEN_LENGTH); + setCookie(TOKEN_COOKIE_NAME, token); + } + return token; +} +/** + * Returns the value of the cookie with a given name or `null` if the cookie is not found. + */ +export function getCookie(name) { + name = name.toLowerCase(); + const parts = document.cookie.split(';'); + for (const part of parts) { + const pair = part.split('='); + const key = decodeURIComponent(pair[0].trim().toLowerCase()); + if (key === name) { + return decodeURIComponent(pair[1]); + } + } + return null; +} +/** + * Sets the value of the cookie with a given name. + */ +export function setCookie(name, value) { + document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';path=/'; +} +/** + * Generates the CSRF token with the given length. + */ +function generateToken(length) { + let result = ''; + const randValues = new Uint8Array(length); + window.crypto.getRandomValues(randValues); + for (let j = 0; j < randValues.length; j++) { + const character = tokenCharset.charAt(randValues[j] % tokenCharset.length); + result += Math.random() > 0.5 ? character.toUpperCase() : character; + } + return result; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/CHANGELOG.md new file mode 100644 index 000000000..3fb5a86ea --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/CHANGELOG.md @@ -0,0 +1,162 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v18.0.0...v19.0.0) (2020-04-29) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v17.0.0...v18.0.0) (2020-03-19) + +### Other changes + +* Updated translations. ([f1beaaa](https://github.com/ckeditor/ckeditor5-alignment/commit/f1beaaa)) + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v16.0.0...v17.0.0) (2020-02-18) + +### MAJOR BREAKING CHANGES + +* The `align-left`, `align-right`, `align-center`, and `align-justify` icons have been moved to `@ckeditor/ckeditor5-core`. + +### Other changes + +* Moved alignment icons to `@ckeditor/ckeditor5-core` (see [ckeditor/ckeditor5-table#227](https://github.com/ckeditor/ckeditor5-table/issues/227)). ([410e279](https://github.com/ckeditor/ckeditor5-alignment/commit/410e279)) +* Updated translations. ([288672f](https://github.com/ckeditor/ckeditor5-alignment/commit/288672f)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Other changes + +* Updated translations. ([9085f7b](https://github.com/ckeditor/ckeditor5-alignment/commit/9085f7b)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.2.0...v15.0.0) (2019-10-23) + +### Other changes + +* Updated translations. ([a719974](https://github.com/ckeditor/ckeditor5-alignment/commit/a719974)) ([2fed077](https://github.com/ckeditor/ckeditor5-alignment/commit/2fed077)) +* Added `pluginName` to the editor plugin part of the feature. ([3b42798](https://github.com/ckeditor/ckeditor5-alignment/commit/3b42798)) + + +## [11.2.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.3...v11.2.0) (2019-08-26) + +### Features + +* Integrated the text alignment feature with different editor content directions (LTR and RTL). See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([edc7d8b](https://github.com/ckeditor/ckeditor5-alignment/commit/edc7d8b)) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([599ea01](https://github.com/ckeditor/ckeditor5-alignment/commit/599ea01)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([54f81b3](https://github.com/ckeditor/ckeditor5-alignment/commit/54f81b3)) +* The text alignment toolbar should have a proper `aria-label` attribute (see [ckeditor/ckeditor5#1404](https://github.com/ckeditor/ckeditor5/issues/1404)). ([3ed81de](https://github.com/ckeditor/ckeditor5-alignment/commit/3ed81de)) +* Updated translations. ([feb4ab3](https://github.com/ckeditor/ckeditor5-alignment/commit/feb4ab3)) + + +## [11.1.3](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.2...v11.1.3) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.1.2](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.1...v11.1.2) (2019-07-04) + +### Other changes + +* Updated translations. ([bb7f494](https://github.com/ckeditor/ckeditor5-alignment/commit/bb7f494)) + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.0...v11.1.1) (2019-06-05) + +### Other changes + +* Updated translations. ([32c32c1](https://github.com/ckeditor/ckeditor5-alignment/commit/32c32c1)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.0.0...v11.1.0) (2019-04-10) + +### Features + +* Marked alignment as a formatting attribute using the `AttributeProperties#isFormatting` property. Closes [ckeditor/ckeditor5#1664](https://github.com/ckeditor/ckeditor5/issues/1664). ([6358e08](https://github.com/ckeditor/ckeditor5-alignment/commit/6358e08)) + +### Other changes + +* Updated translations. ([78bfc40](https://github.com/ckeditor/ckeditor5-alignment/commit/78bfc40)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.4...v11.0.0) (2019-02-28) + +### Other changes + +* Updated translations. ([45e8dd5](https://github.com/ckeditor/ckeditor5-alignment/commit/45e8dd5)) ([a92c37b](https://github.com/ckeditor/ckeditor5-alignment/commit/a92c37b)) ([ef68e54](https://github.com/ckeditor/ckeditor5-alignment/commit/ef68e54)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.3...v10.0.4) (2018-12-05) + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([1d71d33](https://github.com/ckeditor/ckeditor5-alignment/commit/1d71d33)) +* Updated translations. ([547f8d8](https://github.com/ckeditor/ckeditor5-alignment/commit/547f8d8)) ([43d8225](https://github.com/ckeditor/ckeditor5-alignment/commit/43d8225)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.2...v10.0.3) (2018-10-08) + +### Other changes + +* Updated translations. ([5b30202](https://github.com/ckeditor/ckeditor5-alignment/commit/5b30202)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.1...v10.0.2) (2018-07-18) + +### Other changes + +* Updated translations. ([33c281c](https://github.com/ckeditor/ckeditor5-alignment/commit/33c281c)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.0...v10.0.1) (2018-06-21) + +### Other changes + +* Updated translations. + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([eed1029](https://github.com/ckeditor/ckeditor5-alignment/commit/eed1029)) +* Updated translations. ([baa1fbe](https://github.com/ckeditor/ckeditor5-alignment/commit/baa1fbe)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-alignment/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +### Other changes + +* Updated translations. ([586ae62](https://github.com/ckeditor/ckeditor5-alignment/commit/586ae62)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-alignment/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-alignment/compare/v0.0.1...v1.0.0-beta.1) (2018-03-15) + +### Features + +* Initial implementation. Closes [#2](https://github.com/ckeditor/ckeditor5-alignment/issues/2). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/LICENSE.md new file mode 100644 index 000000000..b688d785a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 text alignment feature** – https://github.com/ckeditor/ckeditor5-alignment
    +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/README.md new file mode 100644 index 000000000..cb5510499 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/README.md @@ -0,0 +1,21 @@ +CKEditor 5 text alignment feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-alignment.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-alignment) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-alignment) + +This package implements text alignment support for CKEditor 5. + +## Demo + +Check out the [demo in the text alignment feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/text-alignment.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-alignment` package](https://ckeditor.com/docs/ckeditor5/latest/api/alignment.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/alignment.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/alignment.js new file mode 100644 index 000000000..a12ce5c19 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/alignment.js @@ -0,0 +1,5 @@ +!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var t={704:(t,e,n)=>{t.exports=n(79)("./src/core.js")},273:(t,e,n)=>{t.exports=n(79)("./src/ui.js")},209:(t,e,n)=>{t.exports=n(79)("./src/utils.js")},79:t=>{"use strict";t.exports=CKEditor5.dll}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var r=e[i]={exports:{}};return t[i](r,r.exports,n),r.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.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};(()=>{"use strict";n.r(i),n.d(i,{Alignment:()=>f,AlignmentEditing:()=>g,AlignmentUI:()=>d});var t=n(704),e=n(209);const o=["left","right","center","justify"];function r(t){return o.includes(t)}function a(t,e){return"rtl"==e.contentLanguageDirection?"right"===t:"left"===t}function s(t){const n=t.map((t=>{let e;return e="string"==typeof t?{name:t}:t,e})).filter((t=>{const n=o.includes(t.name);return n||(0,e.logWarning)("alignment-config-name-not-recognized",{option:t}),n})),i=n.filter((t=>Boolean(t.className))).length;if(i&&i{const r=o.slice(i+1);if(r.some((t=>t.name==n.name)))throw new e.CKEditorError("alignment-config-name-already-defined",{option:n,configuredOptions:t});if(n.className){if(r.some((t=>t.className==n.className)))throw new e.CKEditorError("alignment-config-classname-already-defined",{option:n,configuredOptions:t})}})),n}const l="alignment";class c extends t.Command{refresh(){const t=this.editor.locale,n=(0,e.first)(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=Boolean(n)&&this._canBeAligned(n),this.isEnabled&&n.hasAttribute("alignment")?this.value=n.getAttribute("alignment"):this.value="rtl"===t.contentLanguageDirection?"right":"left"}execute(t={}){const e=this.editor,n=e.locale,i=e.model,o=i.document,r=t.value;i.change((t=>{const e=Array.from(o.selection.getSelectedBlocks()).filter((t=>this._canBeAligned(t))),i=e[0].getAttribute("alignment");a(r,n)||i===r||!r?function(t,e){for(const n of t)e.removeAttribute(l,n)}(e,t):function(t,e,n){for(const i of t)e.setAttribute(l,n,i)}(e,t,r)}))}_canBeAligned(t){return this.editor.model.schema.checkAttribute(t,l)}}class g extends t.Plugin{static get pluginName(){return"AlignmentEditing"}constructor(t){super(t),t.config.define("alignment",{options:o.map((t=>({name:t})))})}init(){const t=this.editor,e=t.locale,n=t.model.schema,i=s(t.config.get("alignment.options")).filter((t=>r(t.name)&&!a(t.name,e))),o=i.some((t=>!!t.className));n.extend("$block",{allowAttributes:"alignment"}),t.model.schema.setAttributeProperties("alignment",{isFormatting:!0}),o?t.conversion.attributeToAttribute(function(t){const e={};for(const n of t)e[n.name]={key:"class",value:n.className};const n={model:{key:"alignment",values:t.map((t=>t.name))},view:e};return n}(i)):t.conversion.for("downcast").attributeToAttribute(function(t){const e={};for(const{name:n}of t)e[n]={key:"style",value:{"text-align":n}};const n={model:{key:"alignment",values:t.map((t=>t.name))},view:e};return n}(i));const l=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"style",value:{"text-align":n}},model:{key:"alignment",value:n}});return e}(i);for(const e of l)t.conversion.for("upcast").attributeToAttribute(e);const g=function(t){const e=[];for(const{name:n}of t)e.push({view:{key:"align",value:n},model:{key:"alignment",value:n}});return e}(i);for(const e of g)t.conversion.for("upcast").attributeToAttribute(e);t.commands.add("alignment",new c(t))}}var u=n(273);const m=new Map([["left",t.icons.alignLeft],["right",t.icons.alignRight],["center",t.icons.alignCenter],["justify",t.icons.alignJustify]]);class d extends t.Plugin{get localizedOptionTitles(){const t=this.editor.t;return{left:t("Align left"),right:t("Align right"),center:t("Align center"),justify:t("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const t=this.editor,e=t.ui.componentFactory,n=t.t,i=s(t.config.get("alignment.options"));i.map((t=>t.name)).filter(r).forEach((t=>this._addButton(t))),e.add("alignment",(o=>{const r=(0,u.createDropdown)(o);(0,u.addToolbarToDropdown)(r,(()=>i.map((t=>e.create(`alignment:${t.name}`)))),{enableActiveItemFocusOnDropdownOpen:!0,isVertical:!0,ariaLabel:n("Text alignment toolbar")}),r.buttonView.set({label:n("Text alignment"),tooltip:!0}),r.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const a="rtl"===o.contentLanguageDirection?m.get("right"):m.get("left"),s=t.commands.get("alignment");return r.buttonView.bind("icon").to(s,"value",(t=>m.get(t)||a)),r.bind("isEnabled").to(s,"isEnabled"),this.listenTo(r,"execute",(()=>{t.editing.view.focus()})),r}))}_addButton(t){const e=this.editor;e.ui.componentFactory.add(`alignment:${t}`,(n=>{const i=e.commands.get("alignment"),o=new u.ButtonView(n);return o.set({label:this.localizedOptionTitles[t],icon:m.get(t),tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(i),o.bind("isOn").to(i,"value",(e=>e===t)),this.listenTo(o,"execute",(()=>{e.execute("alignment",{value:t}),e.editing.view.focus()})),o}))}}class f extends t.Plugin{static get requires(){return[g,d]}static get pluginName(){return"Alignment"}}})(),(window.CKEditor5=window.CKEditor5||{}).alignment=i})(); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/af.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/af.js new file mode 100644 index 000000000..ebc5ba74c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/af.js @@ -0,0 +1 @@ +!function(n){const e=n.af=n.af||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs",Justify:"Belyn beide kante","Text alignment":"Teksbelyning","Text alignment toolbar":"Teksbelyning nutsbank"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ar.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ar.js new file mode 100644 index 000000000..59fc6bf3a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ar.js @@ -0,0 +1 @@ +!function(n){const i=n.ar=n.ar||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين",Justify:"ضبط","Text alignment":"محاذاة النص","Text alignment toolbar":"شريط أدوات محاذاة النص"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/az.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/az.js new file mode 100644 index 000000000..6a32cf6fd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/az.js @@ -0,0 +1 @@ +!function(n){const i=n.az=n.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir",Justify:"Eninə görə","Text alignment":"Mətn düzləndirməsi","Text alignment toolbar":"Mətnin düzləndirmə paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bg.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bg.js new file mode 100644 index 000000000..b1edc126e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bg.js @@ -0,0 +1 @@ +!function(n){const i=n.bg=n.bg||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Централно подравняване","Align left":"Ляво подравняване","Align right":"Дясно подравняване",Justify:"Разпредели по равно","Text alignment":"Подравняване на текста","Text alignment toolbar":"Лента за подравняване на текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bn.js new file mode 100644 index 000000000..2b04085b1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bn.js @@ -0,0 +1 @@ +!function(n){const i=n.bn=n.bn||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"কেন্দ্র সারিবদ্ধ করুন","Align left":"বামে সারিবদ্ধ করুন","Align right":"ডানদিকে সারিবদ্ধ করুন",Justify:"জাস্টিফাই","Text alignment":"টেক্সট সারিবদ্ধকরণ","Text alignment toolbar":"টেক্সট শ্রেণীবিন্যাস টুলবার"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bs.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bs.js new file mode 100644 index 000000000..3ccce9474 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/bs.js @@ -0,0 +1 @@ +!function(n){const a=n.bs=n.bs||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Centrirati","Align left":"Lijevo poravnanje","Align right":"Desno poravnanje",Justify:"","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje teksta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ca.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ca.js new file mode 100644 index 000000000..ff5c59649 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ca.js @@ -0,0 +1 @@ +!function(i){const e=i.ca=i.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta",Justify:"Justificar","Text alignment":"Alineació text","Text alignment toolbar":"Barra d'eines d'alineació de text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/cs.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/cs.js new file mode 100644 index 000000000..fa3e3d1a3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/cs.js @@ -0,0 +1 @@ +!function(n){const t=n.cs=n.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo",Justify:"Zarovnat do bloku","Text alignment":"Zarovnání textu","Text alignment toolbar":"Panel nástrojů zarovnání textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/da.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/da.js new file mode 100644 index 000000000..e82822136 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/da.js @@ -0,0 +1 @@ +!function(t){const n=t.da=t.da||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre",Justify:"Justér","Text alignment":"Tekstjustering","Text alignment toolbar":"Tekstjustering værktøjslinje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/de-ch.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/de-ch.js new file mode 100644 index 000000000..d1a2d5bdc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/de-ch.js @@ -0,0 +1 @@ +!function(t){const i=t["de-ch"]=t["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Textausrichtung Werkzeugleiste"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/de.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/de.js new file mode 100644 index 000000000..8030fcd62 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/de.js @@ -0,0 +1 @@ +!function(n){const t=n.de=n.de||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Text-Ausrichtung Toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/el.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/el.js new file mode 100644 index 000000000..99a740484 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/el.js @@ -0,0 +1 @@ +!function(n){const i=n.el=n.el||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Στοίχιση στο κέντρο","Align left":"Στοίχιση αριστερά","Align right":"Στοίχιση δεξιά",Justify:"Πλήρης στοίχηση","Text alignment":"Στοίχιση κειμένου","Text alignment toolbar":"Γραμμή εργαλείων στοίχισης κειμένου"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/en-au.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/en-au.js new file mode 100644 index 000000000..4325044de --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/en-au.js @@ -0,0 +1 @@ +!function(n){const t=n["en-au"]=n["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Align centre","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/en-gb.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/en-gb.js new file mode 100644 index 000000000..a31ea610b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/en-gb.js @@ -0,0 +1 @@ +!function(n){const i=n["en-gb"]=n["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/es-co.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/es-co.js new file mode 100644 index 000000000..71100cddc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/es-co.js @@ -0,0 +1 @@ +!function(i){const e=i["es-co"]=i["es-co"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha",Justify:"Justificar","Text alignment":"Alineación de texto","Text alignment toolbar":"Herramientas de alineación de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/es.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/es.js new file mode 100644 index 000000000..a7747f58a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/es.js @@ -0,0 +1 @@ +!function(e){const i=e.es=e.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha",Justify:"Justificar","Text alignment":"Alineación del texto","Text alignment toolbar":"Barra de herramientas de alineación del texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/et.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/et.js new file mode 100644 index 000000000..43b60e87e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/et.js @@ -0,0 +1 @@ +!function(n){const i=n.et=n.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Keskjoondus","Align left":"Vasakjoondus","Align right":"Paremjoondus",Justify:"Rööpjoondus","Text alignment":"Teksti joondamine","Text alignment toolbar":"Teksti joonduse tööriistariba"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fa.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fa.js new file mode 100644 index 000000000..db6882718 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fa.js @@ -0,0 +1 @@ +!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"تراز وسط","Align left":"تراز چپ","Align right":"تراز راست",Justify:"هم تراز کردن","Text alignment":"تراز متن","Text alignment toolbar":"نوار ابزار ترازبندی متن"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fi.js new file mode 100644 index 000000000..b4fafc161 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fi.js @@ -0,0 +1 @@ +!function(a){const i=a.fi=a.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Tasaa keskelle","Align left":"Tasaa vasemmalle","Align right":"Tasaa oikealle",Justify:"Tasaa molemmat reunat","Text alignment":"Tekstin tasaus","Text alignment toolbar":"Tekstin suuntauksen työkalupalkki"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fr.js new file mode 100644 index 000000000..c0580534f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/fr.js @@ -0,0 +1 @@ +!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite",Justify:"Justifier","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/gl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/gl.js new file mode 100644 index 000000000..888299b48 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/gl.js @@ -0,0 +1 @@ +!function(t){const e=t.gl=t.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrar horizontalmente","Align left":"Aliñar á esquerda","Align right":"Aliñar á dereita",Justify:"Xustificado","Text alignment":"Aliñamento do texto","Text alignment toolbar":"Barra de ferramentas de aliñamento de textos"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/he.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/he.js new file mode 100644 index 000000000..83d1d1d04 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/he.js @@ -0,0 +1 @@ +!function(n){const i=n.he=n.he||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"יישור באמצע","Align left":"יישור לשמאל","Align right":"יישור לימין",Justify:"מרכוז גבולות","Text alignment":"יישור טקסט","Text alignment toolbar":"סרגל כלים יישור טקסט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hi.js new file mode 100644 index 000000000..42b4a6f99 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hi.js @@ -0,0 +1 @@ +!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hr.js new file mode 100644 index 000000000..3557b6a7c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hr.js @@ -0,0 +1 @@ +!function(n){const a=n.hr=n.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Poravnaj po sredini","Align left":"Poravnaj ulijevo","Align right":"Poravnaj udesno",Justify:"Razvuci","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hu.js new file mode 100644 index 000000000..2f69b92fb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/hu.js @@ -0,0 +1 @@ +!function(i){const t=i.hu=i.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Középre igazítás","Align left":"Balra igazítás","Align right":"Jobbra igazítás",Justify:"Sorkizárt","Text alignment":"Szöveg igazítása","Text alignment toolbar":"Szöveg igazítás eszköztár"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/id.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/id.js new file mode 100644 index 000000000..7ccddf426 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/id.js @@ -0,0 +1 @@ +!function(a){const t=a.id=a.id||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Rata tengah","Align left":"Rata kiri","Align right":"Rata kanan",Justify:"Rata kanan-kiri","Text alignment":"Perataan teks","Text alignment toolbar":"Alat perataan teks"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/it.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/it.js new file mode 100644 index 000000000..1caef2a9f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/it.js @@ -0,0 +1 @@ +!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Allinea al centro","Align left":"Allinea a sinistra","Align right":"Allinea a destra",Justify:"Giustifica","Text alignment":"Allineamento del testo","Text alignment toolbar":"Barra degli strumenti dell'allineamento"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ja.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ja.js new file mode 100644 index 000000000..0ebf71d15 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ja.js @@ -0,0 +1 @@ +!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"中央揃え","Align left":"左揃え","Align right":"右揃え",Justify:"両端揃え","Text alignment":"文字揃え","Text alignment toolbar":"テキストの整列"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/jv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/jv.js new file mode 100644 index 000000000..4bdb43ce8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/jv.js @@ -0,0 +1 @@ +!function(n){const t=n.jv=n.jv||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Rata tengah","Align left":"Rata kiwa","Align right":"Rata tengen",Justify:"Rata kiwa tengen","Text alignment":"Perataan seratan","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/kk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/kk.js new file mode 100644 index 000000000..0bcf7db44 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/kk.js @@ -0,0 +1 @@ +!function(n){const i=n.kk=n.kk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ортадан туралау","Align left":"Солға туралау","Align right":"Оңға туралау",Justify:"","Text alignment":"Мәтінді туралау","Text alignment toolbar":"Мәтінді туралау құралдар тақтасы"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/km.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/km.js new file mode 100644 index 000000000..7c88ccc7f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/km.js @@ -0,0 +1 @@ +!function(n){const i=n.km=n.km||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"តម្រឹម​កណ្ដាល","Align left":"តម្រឹម​ឆ្វេង","Align right":"តម្រឹម​ស្ដាំ",Justify:"តម្រឹម​សងខាង","Text alignment":"ការ​តម្រឹម​អក្សរ","Text alignment toolbar":"របារ​ឧបករណ៍​តម្រឹម​អក្សរ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ko.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ko.js new file mode 100644 index 000000000..ff4f40b86 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ko.js @@ -0,0 +1 @@ +!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"가운데 정렬","Align left":"왼쪽 정렬","Align right":"오른쪽 정렬",Justify:"양쪽 정렬","Text alignment":"텍스트 정렬","Text alignment toolbar":"텍스트 정렬 툴바"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ku.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ku.js new file mode 100644 index 000000000..e2c240d87 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ku.js @@ -0,0 +1 @@ +!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"بەهێڵکردنی ناورەڕاست","Align left":"بەهێڵکردنی چەپ","Align right":"بەهێڵکردنی ڕاست",Justify:"هاوستوونی","Text alignment":"ڕیززکردنی تێکست","Text alignment toolbar":"تووڵامرازی ڕیززکردنی تێکست"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/lt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/lt.js new file mode 100644 index 000000000..d13ae57ce --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/lt.js @@ -0,0 +1 @@ +!function(i){const t=i.lt=i.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centruoti","Align left":"Lygiuoti į kairę","Align right":"Lygiuoti į dešinę",Justify:"Lygiuoti per visą plotį","Text alignment":"Teksto lygiavimas","Text alignment toolbar":"Teksto lygiavimo įrankių juosta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/lv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/lv.js new file mode 100644 index 000000000..8940fe5bb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/lv.js @@ -0,0 +1 @@ +!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Centrēt","Align left":"Pa kreisi","Align right":"Pa labi",Justify:"Izlīdzināt abas malas","Text alignment":"Teksta izlīdzināšana","Text alignment toolbar":"Teksta līdzināšanas rīkjosla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ms.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ms.js new file mode 100644 index 000000000..8ad0b7a6d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ms.js @@ -0,0 +1 @@ +!function(a){const n=a.ms=a.ms||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Jajarkan tengah","Align left":"Jajarkan kiri","Align right":"Jajarkan kiri",Justify:"Imbang","Text alignment":"Jajaran teks","Text alignment toolbar":"Bar alat capaian jajaran teks"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/nb.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/nb.js new file mode 100644 index 000000000..4ac840744 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/nb.js @@ -0,0 +1 @@ +!function(t){const n=t.nb=t.nb||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ne.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ne.js new file mode 100644 index 000000000..0bc20dcc9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ne.js @@ -0,0 +1 @@ +!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"केन्द्र पङ्क्तिबद्ध गर्नुहोस्","Align left":"बायाँ पङ्क्तिबद्ध गर्नुहोस्","Align right":"दायाँ पङ्क्तिबद्ध गर्नुहोस्",Justify:"जस्टिफाइ गर्नुहोस्","Text alignment":"पाठ संरेखण","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/nl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/nl.js new file mode 100644 index 000000000..f28c6674b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/nl.js @@ -0,0 +1 @@ +!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midden uitlijnen","Align left":"Links uitlijnen","Align right":"Rechts uitlijnen",Justify:"Volledig uitlijnen","Text alignment":"Tekst uitlijning","Text alignment toolbar":"Tekst uitlijning werkbalk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/no.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/no.js new file mode 100644 index 000000000..c319c8b98 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/no.js @@ -0,0 +1 @@ +!function(t){const n=t.no=t.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midtstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":"Verktøylinje for tekstjustering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pl.js new file mode 100644 index 000000000..37aea8932 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pl.js @@ -0,0 +1 @@ +!function(n){const i=n.pl=n.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Wyrównaj do środka","Align left":"Wyrównaj do lewej","Align right":"Wyrównaj do prawej",Justify:"Wyrównaj obustronnie","Text alignment":"Wyrównanie tekstu","Text alignment toolbar":"Pasek narzędzi wyrównania tekstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pt-br.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pt-br.js new file mode 100644 index 000000000..4d7c4cba9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pt-br.js @@ -0,0 +1 @@ +!function(t){const i=t["pt-br"]=t["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centralizar","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento do texto","Text alignment toolbar":"Ferramentas de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pt.js new file mode 100644 index 000000000..b5bdba8f5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/pt.js @@ -0,0 +1 @@ +!function(t){const i=t.pt=t.pt||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Alinhar ao centro","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento de texto","Text alignment toolbar":"Barra de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ro.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ro.js new file mode 100644 index 000000000..3b65596f1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ro.js @@ -0,0 +1 @@ +!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Aliniază la centru","Align left":"Aliniază la stânga","Align right":"Aliniază la dreapta",Justify:"Aliniază stânga-dreapta","Text alignment":"Aliniere text","Text alignment toolbar":"Bara aliniere text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ru.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ru.js new file mode 100644 index 000000000..8b01ad90b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ru.js @@ -0,0 +1 @@ +!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Выравнивание по центру","Align left":"Выравнивание по левому краю","Align right":"Выравнивание по правому краю",Justify:"Выравнивание по ширине","Text alignment":"Выравнивание текста","Text alignment toolbar":"Выравнивание"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sk.js new file mode 100644 index 000000000..c5df946bf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sk.js @@ -0,0 +1 @@ +!function(n){const a=n.sk=n.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Zarovnať na stred","Align left":"Zarovnať vľavo","Align right":"Zarovnať vpravo",Justify:"Do bloku","Text alignment":"Zarovnanie textu","Text alignment toolbar":"Panel nástrojov zarovnania textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sl.js new file mode 100644 index 000000000..00c159763 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sl.js @@ -0,0 +1 @@ +!function(a){const n=a.sl=a.sl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Sredinska poravnava","Align left":"Poravnava levo","Align right":"Poravnava desno",Justify:"Postavi na sredino","Text alignment":"Poravnava besedila","Text alignment toolbar":"Orodna vrstica besedila"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sq.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sq.js new file mode 100644 index 000000000..e23d77ec8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sq.js @@ -0,0 +1 @@ +!function(t){const i=t.sq=t.sq||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Radhit në mes","Align left":"Radhit majtas","Align right":"Radhit djathtas",Justify:"Plotësim","Text alignment":"Radhitja e tekstit","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sr-latn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sr-latn.js new file mode 100644 index 000000000..2a944dd49 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sr-latn.js @@ -0,0 +1 @@ +!function(n){const a=n["sr-latn"]=n["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Centralno ravnanje","Align left":"Levo ravnanje","Align right":"Desno ravnanje",Justify:"Obostrano ravnanje","Text alignment":"Ravnanje teksta","Text alignment toolbar":"Alatke za ravnanje teksta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sr.js new file mode 100644 index 000000000..b5105eb42 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sr.js @@ -0,0 +1 @@ +!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Централно равнанје","Align left":"Лево равнање","Align right":"Десно равнање",Justify:"Обострано равнање","Text alignment":"Равнање текста","Text alignment toolbar":"Алатке за равнање текста"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sv.js new file mode 100644 index 000000000..a6a6798e8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/sv.js @@ -0,0 +1 @@ +!function(t){const e=t.sv=t.sv||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrera","Align left":"Vänsterjustera","Align right":"Högerjustera",Justify:"Justera till marginaler","Text alignment":"Textjustering","Text alignment toolbar":"Verktygsfält för textjustering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/th.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/th.js new file mode 100644 index 000000000..2130cd773 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/th.js @@ -0,0 +1 @@ +!function(n){const t=n.th=n.th||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"จัดกึ่งกลาง","Align left":"จัดชิดซ้าย","Align right":"จัดชิดขวา",Justify:"จัด(ขอบ)","Text alignment":"จัดตำแหน่งข้อความ","Text alignment toolbar":"แถบเครื่องมือจัดตำแหน่งข้อความ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/tk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/tk.js new file mode 100644 index 000000000..0dd585b11 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/tk.js @@ -0,0 +1 @@ +!function(e){const i=e.tk=e.tk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Merkeze deňleşdir","Align left":"Çepe deňleşdiriň","Align right":"Saga deňleşdiriň",Justify:"Akla","Text alignment":"Tekstiň deňleşdirilmegi","Text alignment toolbar":"Teksti deňleşdirmek gurallar paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/tr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/tr.js new file mode 100644 index 000000000..b5d3fa180 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/tr.js @@ -0,0 +1 @@ +!function(a){const i=a.tr=a.tr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ortala","Align left":"Sola hizala","Align right":"Sağa hizala",Justify:"İki yana yasla","Text alignment":"Yazı hizalama","Text alignment toolbar":"Yazı Hizlama Araç Çubuğu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ug.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ug.js new file mode 100644 index 000000000..a8c649305 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ug.js @@ -0,0 +1 @@ +!function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"ئوتتۇرىغا توغرىلاش","Align left":"سولغا توغرىلاش","Align right":"ئوڭغا توغرىلاش",Justify:"ئوڭ سولدىن توغرىلا","Text alignment":"تېكىست توغرىلاش","Text alignment toolbar":"تېكىست توغرىلاش قورالبالدىقى"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/uk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/uk.js new file mode 100644 index 000000000..39aa2096b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/uk.js @@ -0,0 +1 @@ +!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"По центру","Align left":"По лівому краю","Align right":"По правому краю",Justify:"По ширині","Text alignment":"Вирівнювання тексту","Text alignment toolbar":"Панель інструментів вирівнювання тексту"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ur.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ur.js new file mode 100644 index 000000000..6bec1361a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/ur.js @@ -0,0 +1 @@ +!function(n){const i=n.ur=n.ur||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"درمیانی سیدھ","Align left":"بائیں سیدھ","Align right":"دائیں سیدھ",Justify:"برابر سیدھ","Text alignment":"متن کی سیدھ","Text alignment toolbar":"خانہ آلات برائے سیدھ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/uz.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/uz.js new file mode 100644 index 000000000..b6f263a36 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/uz.js @@ -0,0 +1 @@ +!function(i){const t=i.uz=i.uz||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"O'rtada tekislash","Align left":"Chap tomonda tekislash","Align right":"O'ng tomonda tekislash",Justify:"Kengligi bo'yicha tekislash","Text alignment":"Matnni tekislash","Text alignment toolbar":"Tekislash"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/vi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/vi.js new file mode 100644 index 000000000..94d9696bd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/vi.js @@ -0,0 +1 @@ +!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Canh giữa","Align left":"Canh trái","Align right":"Canh phải",Justify:"Canh đều","Text alignment":"Căn chỉnh văn bản","Text alignment toolbar":"Thanh công cụ canh chữ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/zh-cn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/zh-cn.js new file mode 100644 index 000000000..1d8f77151 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/zh-cn.js @@ -0,0 +1 @@ +!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"居中对齐","Align left":"左对齐","Align right":"右对齐",Justify:"两端对齐","Text alignment":"对齐","Text alignment toolbar":"对齐工具栏"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/zh.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/zh.js new file mode 100644 index 000000000..e2bdbe2e0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/build/translations/zh.js @@ -0,0 +1 @@ +!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"置中對齊","Align left":"靠左對齊","Align right":"靠右對齊",Justify:"左右對齊","Text alignment":"文字對齊","Text alignment toolbar":"文字對齊"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/ckeditor5-metadata.json new file mode 100644 index 000000000..2c559076b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/ckeditor5-metadata.json @@ -0,0 +1,31 @@ +{ + "plugins": [ + { + "name": "Alignment", + "className": "Alignment", + "path": "src/alignment.js", + "description": "Enables support for text alignment. You can use it to align your content to left, right and center or to justify it.", + "docs": "features/text-alignment.html", + "uiComponents": [ + { + "type": "SplitButton", + "name": "alignment", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/align-left.svg" + } + ], + "htmlOutput": [ + { + "elements": "$block", + "styles": "text-align", + "_comment": "By default, the alignment feature uses the `text-align` inline style." + }, + { + "elements": "$block", + "classes": "*", + "isAlternative": true, + "_comment": "If `config.alignment.options` is set, these classes are used for alignment instead of inline styles." + } + ] + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/contexts.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/contexts.json new file mode 100644 index 000000000..64c29bd55 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/contexts.json @@ -0,0 +1,8 @@ +{ + "Align left": "Toolbar button tooltip for aligning the text to the left.", + "Align right": "Toolbar button tooltip for aligning the text to the right.", + "Align center": "Toolbar button tooltip for aligning the text to center.", + "Justify": "Toolbar button tooltip for making the text justified.", + "Text alignment": "Dropdown button tooltip for the text alignment feature.", + "Text alignment toolbar": "Label used by assistive technologies describing the text alignment feature toolbar." +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/af.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/af.po new file mode 100644 index 000000000..5e1cc28f3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/af.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://www.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Belyn links" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Belyn regs" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Belyn in die middel" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Belyn beide kante" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Teksbelyning" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Teksbelyning nutsbank" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ar.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ar.po new file mode 100644 index 000000000..84a86b045 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ar.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://www.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "محاذاة لليسار" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "محاذاة لليمين" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "محاذاة في المنتصف" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "ضبط" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "محاذاة النص" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "شريط أدوات محاذاة النص" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/az.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/az.po new file mode 100644 index 000000000..ea8084b38 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/az.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://www.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Soldan düzləndir" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Sağdan düzləndir" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Mərkəzə düzləndir" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Eninə görə" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Mətn düzləndirməsi" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Mətnin düzləndirmə paneli" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bg.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bg.po new file mode 100644 index 000000000..9bb37973d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bg.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://www.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Ляво подравняване" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Дясно подравняване" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Централно подравняване" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Разпредели по равно" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Подравняване на текста" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Лента за подравняване на текст" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bn.po new file mode 100644 index 000000000..592164223 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bn.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://www.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "বামে সারিবদ্ধ করুন" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "ডানদিকে সারিবদ্ধ করুন" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "কেন্দ্র সারিবদ্ধ করুন" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "জাস্টিফাই" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "টেক্সট সারিবদ্ধকরণ" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "টেক্সট শ্রেণীবিন্যাস টুলবার" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bs.po new file mode 100644 index 000000000..ab67cdd96 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/bs.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://www.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Lijevo poravnanje" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Desno poravnanje" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrirati" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Poravnanje teksta" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Traka za poravnanje teksta" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ca.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ca.po new file mode 100644 index 000000000..7e1957a53 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ca.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://www.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Alineació esquerra" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Alineació dreta" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Alineació centre" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justificar" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Alineació text" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Barra d'eines d'alineació de text" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/cs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/cs.po new file mode 100644 index 000000000..41d749dbd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/cs.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://www.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Zarovnat vlevo" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Zarovnat vpravo" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Zarovnat na střed" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Zarovnat do bloku" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Zarovnání textu" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Panel nástrojů zarovnání textu" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/da.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/da.po new file mode 100644 index 000000000..a6d5f8677 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/da.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Justér venstre" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Justér højre" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Justér center" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justér" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Tekstjustering" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Tekstjustering værktøjslinje" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/de-ch.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/de-ch.po new file mode 100644 index 000000000..774c59170 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/de-ch.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://www.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Linksbündig" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Rechtsbündig" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Zentriert" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Blocksatz" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Textausrichtung" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Textausrichtung Werkzeugleiste" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/de.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/de.po new file mode 100644 index 000000000..a82547117 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/de.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Linksbündig" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Rechtsbündig" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Zentriert" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Blocksatz" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Textausrichtung" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Text-Ausrichtung Toolbar" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/el.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/el.po new file mode 100644 index 000000000..0b770ef89 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/el.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Στοίχιση αριστερά" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Στοίχιση δεξιά" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Στοίχιση στο κέντρο" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Πλήρης στοίχηση" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Στοίχιση κειμένου" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Γραμμή εργαλείων στοίχισης κειμένου" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en-au.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en-au.po new file mode 100644 index 000000000..c2fd15108 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en-au.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Align left" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Align right" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Align centre" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justify" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Text alignment" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Text alignment toolbar" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en-gb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en-gb.po new file mode 100644 index 000000000..731a28b83 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en-gb.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://www.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Align left" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Align right" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Align center" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justify" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Text alignment" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en.po new file mode 100644 index 000000000..c95265dff --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/en.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Align left" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Align right" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Align center" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justify" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Text alignment" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Text alignment toolbar" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/es-co.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/es-co.po new file mode 100644 index 000000000..ec774c57f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/es-co.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://www.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Alinear a la izquierda" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Alinear a la derecha" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrar" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justificar" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Alineación de texto" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Herramientas de alineación de texto" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/es.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/es.po new file mode 100644 index 000000000..9891174d2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/es.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://www.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Alinear a la izquierda" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Alinear a la derecha" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrar" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justificar" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Alineación del texto" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Barra de herramientas de alineación del texto" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/et.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/et.po new file mode 100644 index 000000000..f0bc1391c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/et.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://www.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Vasakjoondus" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Paremjoondus" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Keskjoondus" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Rööpjoondus" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Teksti joondamine" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Teksti joonduse tööriistariba" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fa.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fa.po new file mode 100644 index 000000000..1a195ada9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fa.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://www.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "تراز چپ" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "تراز راست" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "تراز وسط" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "هم تراز کردن" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "تراز متن" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "نوار ابزار ترازبندی متن" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fi.po new file mode 100644 index 000000000..71fee1b30 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fi.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Tasaa vasemmalle" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Tasaa oikealle" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Tasaa keskelle" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Tasaa molemmat reunat" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Tekstin tasaus" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Tekstin suuntauksen työkalupalkki" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fr.po new file mode 100644 index 000000000..0facff37b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/fr.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Aligner à gauche" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Aligner à droite" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrer" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justifier" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Alignement du texte" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Barre d'outils d'alignement du texte" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/gl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/gl.po new file mode 100644 index 000000000..78575249a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/gl.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Aliñar á esquerda" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Aliñar á dereita" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrar horizontalmente" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Xustificado" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Aliñamento do texto" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Barra de ferramentas de aliñamento de textos" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/he.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/he.po new file mode 100644 index 000000000..4fbb1f5a9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/he.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://www.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "יישור לשמאל" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "יישור לימין" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "יישור באמצע" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "מרכוז גבולות" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "יישור טקסט" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "סרגל כלים יישור טקסט" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hi.po new file mode 100644 index 000000000..94353899d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hi.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://www.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Align left" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Align right" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Align center" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justify" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Text alignment" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Text alignment toolbar" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hr.po new file mode 100644 index 000000000..fb4f26046 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hr.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Poravnaj ulijevo" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Poravnaj udesno" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Poravnaj po sredini" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Razvuci" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Poravnanje teksta" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Traka za poravnanje" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hu.po new file mode 100644 index 000000000..2e44414a1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/hu.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Balra igazítás" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Jobbra igazítás" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Középre igazítás" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Sorkizárt" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Szöveg igazítása" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Szöveg igazítás eszköztár" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/id.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/id.po new file mode 100644 index 000000000..06123ea03 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/id.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://www.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Rata kiri" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Rata kanan" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Rata tengah" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Rata kanan-kiri" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Perataan teks" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Alat perataan teks" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/it.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/it.po new file mode 100644 index 000000000..a0e65d3ad --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/it.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Allinea a sinistra" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Allinea a destra" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Allinea al centro" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Giustifica" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Allineamento del testo" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Barra degli strumenti dell'allineamento" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ja.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ja.po new file mode 100644 index 000000000..74855d4de --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ja.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "左揃え" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "右揃え" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "中央揃え" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "両端揃え" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "文字揃え" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "テキストの整列" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/jv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/jv.po new file mode 100644 index 000000000..8c871474c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/jv.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Javanese (https://www.transifex.com/ckeditor/teams/11143/jv/)\n" +"Language: jv\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Rata kiwa" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Rata tengen" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Rata tengah" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Rata kiwa tengen" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Perataan seratan" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/kk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/kk.po new file mode 100644 index 000000000..bc2d4c178 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/kk.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kazakh (https://www.transifex.com/ckeditor/teams/11143/kk/)\n" +"Language: kk\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Солға туралау" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Оңға туралау" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Ортадан туралау" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Мәтінді туралау" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Мәтінді туралау құралдар тақтасы" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/km.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/km.po new file mode 100644 index 000000000..2cf27d796 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/km.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "តម្រឹម​ឆ្វេង" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "តម្រឹម​ស្ដាំ" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "តម្រឹម​កណ្ដាល" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "តម្រឹម​សងខាង" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "ការ​តម្រឹម​អក្សរ" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "របារ​ឧបករណ៍​តម្រឹម​អក្សរ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ko.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ko.po new file mode 100644 index 000000000..cbca1a74f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ko.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://www.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "왼쪽 정렬" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "오른쪽 정렬" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "가운데 정렬" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "양쪽 정렬" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "텍스트 정렬" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "텍스트 정렬 툴바" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ku.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ku.po new file mode 100644 index 000000000..8834d3238 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ku.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "بەهێڵکردنی چەپ" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "بەهێڵکردنی ڕاست" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "بەهێڵکردنی ناورەڕاست" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "هاوستوونی" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "ڕیززکردنی تێکست" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "تووڵامرازی ڕیززکردنی تێکست" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/lt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/lt.po new file mode 100644 index 000000000..1f581f631 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/lt.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://www.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Lygiuoti į kairę" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Lygiuoti į dešinę" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centruoti" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Lygiuoti per visą plotį" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Teksto lygiavimas" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Teksto lygiavimo įrankių juosta" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/lv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/lv.po new file mode 100644 index 000000000..ae4289a22 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/lv.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://www.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Pa kreisi" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Pa labi" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrēt" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Izlīdzināt abas malas" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Teksta izlīdzināšana" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Teksta līdzināšanas rīkjosla" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ms.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ms.po new file mode 100644 index 000000000..b6ca9be2a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ms.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://www.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Jajarkan kiri" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Jajarkan kiri" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Jajarkan tengah" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Imbang" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Jajaran teks" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Bar alat capaian jajaran teks" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/nb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/nb.po new file mode 100644 index 000000000..646e32093 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/nb.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Venstrejuster" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Høyrejuster" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Midstill" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Blokkjuster" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Tekstjustering" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ne.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ne.po new file mode 100644 index 000000000..aaf9c7c5b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ne.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "बायाँ पङ्क्तिबद्ध गर्नुहोस्" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "दायाँ पङ्क्तिबद्ध गर्नुहोस्" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "केन्द्र पङ्क्तिबद्ध गर्नुहोस्" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "जस्टिफाइ गर्नुहोस्" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "पाठ संरेखण" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/nl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/nl.po new file mode 100644 index 000000000..be903f9dc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/nl.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://www.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Links uitlijnen" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Rechts uitlijnen" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Midden uitlijnen" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Volledig uitlijnen" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Tekst uitlijning" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Tekst uitlijning werkbalk" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/no.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/no.po new file mode 100644 index 000000000..669262684 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/no.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://www.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Venstrejuster" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Høyrejuster" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Midtstill" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Blokkjuster" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Tekstjustering" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Verktøylinje for tekstjustering" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pl.po new file mode 100644 index 000000000..479f59337 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pl.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Wyrównaj do lewej" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Wyrównaj do prawej" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Wyrównaj do środka" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Wyrównaj obustronnie" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Wyrównanie tekstu" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Pasek narzędzi wyrównania tekstu" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pt-br.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pt-br.po new file mode 100644 index 000000000..ac1c45955 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pt-br.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Alinhar à esquerda" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Alinhar à direita" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centralizar" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justificar" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Alinhamento do texto" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Ferramentas de alinhamento de texto" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pt.po new file mode 100644 index 000000000..d106e5163 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/pt.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Alinhar à esquerda" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Alinhar à direita" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Alinhar ao centro" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justificar" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Alinhamento de texto" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Barra de alinhamento de texto" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ro.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ro.po new file mode 100644 index 000000000..12a5ccdc4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ro.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Aliniază la stânga" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Aliniază la dreapta" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Aliniază la centru" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Aliniază stânga-dreapta" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Aliniere text" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Bara aliniere text" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ru.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ru.po new file mode 100644 index 000000000..3bca71bb4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ru.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://www.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Выравнивание по левому краю" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Выравнивание по правому краю" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Выравнивание по центру" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Выравнивание по ширине" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Выравнивание текста" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Выравнивание" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sk.po new file mode 100644 index 000000000..59534469c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sk.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Zarovnať vľavo" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Zarovnať vpravo" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Zarovnať na stred" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Do bloku" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Zarovnanie textu" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Panel nástrojov zarovnania textu" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sl.po new file mode 100644 index 000000000..7fb71eeaa --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sl.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://www.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Poravnava levo" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Poravnava desno" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Sredinska poravnava" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Postavi na sredino" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Poravnava besedila" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Orodna vrstica besedila" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sq.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sq.po new file mode 100644 index 000000000..2a6d54766 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sq.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://www.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Radhit majtas" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Radhit djathtas" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Radhit në mes" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Plotësim" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Radhitja e tekstit" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sr-latn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sr-latn.po new file mode 100644 index 000000000..53ae1308e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sr-latn.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://www.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Levo ravnanje" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Desno ravnanje" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centralno ravnanje" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Obostrano ravnanje" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Ravnanje teksta" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Alatke za ravnanje teksta" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sr.po new file mode 100644 index 000000000..24e23a325 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sr.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://www.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Лево равнање" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Десно равнање" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Централно равнанје" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Обострано равнање" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Равнање текста" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Алатке за равнање текста" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sv.po new file mode 100644 index 000000000..210e96d3f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/sv.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Vänsterjustera" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Högerjustera" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Centrera" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Justera till marginaler" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Textjustering" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Verktygsfält för textjustering" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/th.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/th.po new file mode 100644 index 000000000..df9c68f1f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/th.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://www.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "จัดชิดซ้าย" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "จัดชิดขวา" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "จัดกึ่งกลาง" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "จัด(ขอบ)" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "จัดตำแหน่งข้อความ" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "แถบเครื่องมือจัดตำแหน่งข้อความ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/tk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/tk.po new file mode 100644 index 000000000..5b0a50b93 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/tk.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://www.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Çepe deňleşdiriň" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Saga deňleşdiriň" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Merkeze deňleşdir" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Akla" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Tekstiň deňleşdirilmegi" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Teksti deňleşdirmek gurallar paneli" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/tr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/tr.po new file mode 100644 index 000000000..d94575796 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/tr.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Sola hizala" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Sağa hizala" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Ortala" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "İki yana yasla" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Yazı hizalama" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Yazı Hizlama Araç Çubuğu" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ug.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ug.po new file mode 100644 index 000000000..ea6e1ab7b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ug.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://www.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "سولغا توغرىلاش" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "ئوڭغا توغرىلاش" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "ئوتتۇرىغا توغرىلاش" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "ئوڭ سولدىن توغرىلا" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "تېكىست توغرىلاش" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "تېكىست توغرىلاش قورالبالدىقى" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/uk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/uk.po new file mode 100644 index 000000000..ff39ebba8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/uk.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://www.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "По лівому краю" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "По правому краю" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "По центру" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "По ширині" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Вирівнювання тексту" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Панель інструментів вирівнювання тексту" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ur.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ur.po new file mode 100644 index 000000000..6e62177e4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/ur.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://www.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "بائیں سیدھ" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "دائیں سیدھ" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "درمیانی سیدھ" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "برابر سیدھ" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "متن کی سیدھ" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "خانہ آلات برائے سیدھ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/uz.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/uz.po new file mode 100644 index 000000000..3b1bda4b6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/uz.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://www.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Chap tomonda tekislash" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "O'ng tomonda tekislash" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "O'rtada tekislash" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Kengligi bo'yicha tekislash" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Matnni tekislash" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Tekislash" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/vi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/vi.po new file mode 100644 index 000000000..95442379c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/vi.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://www.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "Canh trái" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "Canh phải" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "Canh giữa" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "Canh đều" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "Căn chỉnh văn bản" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "Thanh công cụ canh chữ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/zh-cn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/zh-cn.po new file mode 100644 index 000000000..c7352ff3b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/zh-cn.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "左对齐" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "右对齐" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "居中对齐" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "两端对齐" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "对齐" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "对齐工具栏" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/zh.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/zh.po new file mode 100644 index 000000000..2e7eb245d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/lang/translations/zh.po @@ -0,0 +1,41 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for aligning the text to the left." +msgid "Align left" +msgstr "靠左對齊" + +msgctxt "Toolbar button tooltip for aligning the text to the right." +msgid "Align right" +msgstr "靠右對齊" + +msgctxt "Toolbar button tooltip for aligning the text to center." +msgid "Align center" +msgstr "置中對齊" + +msgctxt "Toolbar button tooltip for making the text justified." +msgid "Justify" +msgstr "左右對齊" + +msgctxt "Dropdown button tooltip for the text alignment feature." +msgid "Text alignment" +msgstr "文字對齊" + +msgctxt "Label used by assistive technologies describing the text alignment feature toolbar." +msgid "Text alignment toolbar" +msgstr "文字對齊" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/package.json new file mode 100644 index 000000000..0547bcb1e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/package.json @@ -0,0 +1,61 @@ +{ + "name": "@ckeditor/ckeditor5-alignment", + "version": "36.0.1", + "description": "Text alignment feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "ckeditor5": "^36.0.1" + }, + "devDependencies": { + "@ckeditor/ckeditor5-block-quote": "^36.0.1", + "@ckeditor/ckeditor5-core": "^36.0.1", + "@ckeditor/ckeditor5-dev-utils": "^32.0.0", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-engine": "^36.0.1", + "@ckeditor/ckeditor5-enter": "^36.0.1", + "@ckeditor/ckeditor5-heading": "^36.0.1", + "@ckeditor/ckeditor5-image": "^36.0.1", + "@ckeditor/ckeditor5-list": "^36.0.1", + "@ckeditor/ckeditor5-paragraph": "^36.0.1", + "@ckeditor/ckeditor5-theme-lark": "^36.0.1", + "@ckeditor/ckeditor5-typing": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-alignment" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "dll:build": "webpack", + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignment.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignment.js new file mode 100644 index 000000000..ecb3c7222 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignment.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module alignment/alignment + */ +import { Plugin } from 'ckeditor5/src/core'; +import AlignmentEditing from './alignmentediting'; +import AlignmentUI from './alignmentui'; +/** + * The text alignment plugin. + * + * For a detailed overview, check the {@glink features/text-alignment Text alignment feature documentation} + * and the {@glink api/alignment package page}. + * + * This is a "glue" plugin which loads the {@link module:alignment/alignmentediting~AlignmentEditing} and + * {@link module:alignment/alignmentui~AlignmentUI} plugins. + */ +export default class Alignment extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [AlignmentEditing, AlignmentUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Alignment'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentcommand.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentcommand.js new file mode 100644 index 000000000..a0c4980e6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentcommand.js @@ -0,0 +1,88 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module alignment/alignmentcommand + */ +import { Command } from 'ckeditor5/src/core'; +import { first } from 'ckeditor5/src/utils'; +import { isDefault } from './utils'; +const ALIGNMENT = 'alignment'; +/** + * The alignment command plugin. + */ +export default class AlignmentCommand extends Command { + /** + * @inheritDoc + */ + refresh() { + const editor = this.editor; + const locale = editor.locale; + const firstBlock = first(this.editor.model.document.selection.getSelectedBlocks()); + // As first check whether to enable or disable the command as the value will always be false if the command cannot be enabled. + this.isEnabled = Boolean(firstBlock) && this._canBeAligned(firstBlock); + if (this.isEnabled && firstBlock.hasAttribute('alignment')) { + this.value = firstBlock.getAttribute('alignment'); + } + else { + this.value = locale.contentLanguageDirection === 'rtl' ? 'right' : 'left'; + } + } + /** + * Executes the command. Applies the alignment `value` to the selected blocks. + * If no `value` is passed, the `value` is the default one or it is equal to the currently selected block's alignment attribute, + * the command will remove the attribute from the selected blocks. + * + * @param options Options for the executed command. + * @param options.value The value to apply. + * @fires execute + */ + execute(options = {}) { + const editor = this.editor; + const locale = editor.locale; + const model = editor.model; + const doc = model.document; + const value = options.value; + model.change(writer => { + // Get only those blocks from selected that can have alignment set + const blocks = Array.from(doc.selection.getSelectedBlocks()).filter(block => this._canBeAligned(block)); + const currentAlignment = blocks[0].getAttribute('alignment'); + // Remove alignment attribute if current alignment is: + // - default (should not be stored in model as it will bloat model data) + // - equal to currently set + // - or no value is passed - denotes default alignment. + const removeAlignment = isDefault(value, locale) || currentAlignment === value || !value; + if (removeAlignment) { + removeAlignmentFromSelection(blocks, writer); + } + else { + setAlignmentOnSelection(blocks, writer, value); + } + }); + } + /** + * Checks whether a block can have alignment set. + * + * @param block The block to be checked. + */ + _canBeAligned(block) { + return this.editor.model.schema.checkAttribute(block, ALIGNMENT); + } +} +/** + * Removes the alignment attribute from blocks. + */ +function removeAlignmentFromSelection(blocks, writer) { + for (const block of blocks) { + writer.removeAttribute(ALIGNMENT, block); + } +} +/** + * Sets the alignment attribute on blocks. + */ +function setAlignmentOnSelection(blocks, writer, alignment) { + for (const block of blocks) { + writer.setAttribute(ALIGNMENT, alignment, block); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentediting.js new file mode 100644 index 000000000..7fedfd27c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentediting.js @@ -0,0 +1,147 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module alignment/alignmentediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AlignmentCommand from './alignmentcommand'; +import { isDefault, isSupported, normalizeAlignmentOptions, supportedOptions } from './utils'; +/** + * The alignment editing feature. It introduces the {@link module:alignment/alignmentcommand~AlignmentCommand command} and adds + * the `alignment` attribute for block elements in the {@link module:engine/model/model~Model model}. + */ +export default class AlignmentEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'AlignmentEditing'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + editor.config.define('alignment', { + options: supportedOptions.map(option => ({ name: option })) + }); + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const locale = editor.locale; + const schema = editor.model.schema; + const options = normalizeAlignmentOptions(editor.config.get('alignment.options')); + // Filter out unsupported options and those that are redundant, e.g. `left` in LTR / `right` in RTL mode. + const optionsToConvert = options.filter(option => isSupported(option.name) && !isDefault(option.name, locale)); + // Once there is at least one `className` defined, we switch to alignment with classes. + const shouldUseClasses = optionsToConvert.some(option => !!option.className); + // Allow alignment attribute on all blocks. + schema.extend('$block', { allowAttributes: 'alignment' }); + editor.model.schema.setAttributeProperties('alignment', { isFormatting: true }); + if (shouldUseClasses) { + editor.conversion.attributeToAttribute(buildClassDefinition(optionsToConvert)); + } + else { + // Downcast inline styles. + editor.conversion.for('downcast').attributeToAttribute(buildDowncastInlineDefinition(optionsToConvert)); + } + const upcastInlineDefinitions = buildUpcastInlineDefinitions(optionsToConvert); + // Always upcast from inline styles. + for (const definition of upcastInlineDefinitions) { + editor.conversion.for('upcast').attributeToAttribute(definition); + } + const upcastCompatibilityDefinitions = buildUpcastCompatibilityDefinitions(optionsToConvert); + // Always upcast from deprecated `align` attribute. + for (const definition of upcastCompatibilityDefinitions) { + editor.conversion.for('upcast').attributeToAttribute(definition); + } + editor.commands.add('alignment', new AlignmentCommand(editor)); + } +} +/** + * Prepare downcast conversion definition for inline alignment styling. + */ +function buildDowncastInlineDefinition(options) { + const view = {}; + for (const { name } of options) { + view[name] = { + key: 'style', + value: { + 'text-align': name + } + }; + } + const definition = { + model: { + key: 'alignment', + values: options.map(option => option.name) + }, + view + }; + return definition; +} +/** + * Prepare upcast definitions for inline alignment styles. + */ +function buildUpcastInlineDefinitions(options) { + const definitions = []; + for (const { name } of options) { + definitions.push({ + view: { + key: 'style', + value: { + 'text-align': name + } + }, + model: { + key: 'alignment', + value: name + } + }); + } + return definitions; +} +/** + * Prepare upcast definitions for deprecated `align` attribute. + */ +function buildUpcastCompatibilityDefinitions(options) { + const definitions = []; + for (const { name } of options) { + definitions.push({ + view: { + key: 'align', + value: name + }, + model: { + key: 'alignment', + value: name + } + }); + } + return definitions; +} +/** + * Prepare conversion definitions for upcast and downcast alignment with classes. + */ +function buildClassDefinition(options) { + const view = {}; + for (const option of options) { + view[option.name] = { + key: 'class', + value: option.className + }; + } + const definition = { + model: { + key: 'alignment', + values: options.map(option => option.name) + }, + view + }; + return definition; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentui.js new file mode 100644 index 000000000..96fec710c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/alignmentui.js @@ -0,0 +1,124 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module alignment/alignmentui + */ +import { Plugin, icons } from 'ckeditor5/src/core'; +import { ButtonView, createDropdown, addToolbarToDropdown } from 'ckeditor5/src/ui'; +import { isSupported, normalizeAlignmentOptions } from './utils'; +const iconsMap = new Map([ + ['left', icons.alignLeft], + ['right', icons.alignRight], + ['center', icons.alignCenter], + ['justify', icons.alignJustify] +]); +/** + * The default alignment UI plugin. + * + * It introduces the `'alignment:left'`, `'alignment:right'`, `'alignment:center'` and `'alignment:justify'` buttons + * and the `'alignment'` dropdown. + */ +export default class AlignmentUI extends Plugin { + /** + * Returns the localized option titles provided by the plugin. + * + * The following localized titles corresponding with + * {@link module:alignment/alignment~AlignmentConfig#options} are available: + * + * * `'left'`, + * * `'right'`, + * * `'center'`, + * * `'justify'`. + * + * @readonly + */ + get localizedOptionTitles() { + const t = this.editor.t; + return { + 'left': t('Align left'), + 'right': t('Align right'), + 'center': t('Align center'), + 'justify': t('Justify') + }; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'AlignmentUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const componentFactory = editor.ui.componentFactory; + const t = editor.t; + const options = normalizeAlignmentOptions(editor.config.get('alignment.options')); + options + .map(option => option.name) + .filter(isSupported) + .forEach(option => this._addButton(option)); + componentFactory.add('alignment', locale => { + const dropdownView = createDropdown(locale); + // Add existing alignment buttons to dropdown's toolbar. + addToolbarToDropdown(dropdownView, () => options.map(option => componentFactory.create(`alignment:${option.name}`)), { + enableActiveItemFocusOnDropdownOpen: true, + isVertical: true, + ariaLabel: t('Text alignment toolbar') + }); + // Configure dropdown properties an behavior. + dropdownView.buttonView.set({ + label: t('Text alignment'), + tooltip: true + }); + dropdownView.extendTemplate({ + attributes: { + class: 'ck-alignment-dropdown' + } + }); + // The default icon depends on the direction of the content. + const defaultIcon = locale.contentLanguageDirection === 'rtl' ? iconsMap.get('right') : iconsMap.get('left'); + const command = editor.commands.get('alignment'); + // Change icon to reflect current selection's alignment. + dropdownView.buttonView.bind('icon').to(command, 'value', value => iconsMap.get(value) || defaultIcon); + // Enable button if any of the buttons is enabled. + dropdownView.bind('isEnabled').to(command, 'isEnabled'); + // Focus the editable after executing the command. + // Overrides a default behaviour where the focus is moved to the dropdown button (#12125). + this.listenTo(dropdownView, 'execute', () => { + editor.editing.view.focus(); + }); + return dropdownView; + }); + } + /** + * Helper method for initializing the button and linking it with an appropriate command. + * + * @param option The name of the alignment option for which the button is added. + */ + _addButton(option) { + const editor = this.editor; + editor.ui.componentFactory.add(`alignment:${option}`, locale => { + const command = editor.commands.get('alignment'); + const buttonView = new ButtonView(locale); + buttonView.set({ + label: this.localizedOptionTitles[option], + icon: iconsMap.get(option), + tooltip: true, + isToggleable: true + }); + // Bind button model to command. + buttonView.bind('isEnabled').to(command); + buttonView.bind('isOn').to(command, 'value', value => value === option); + // Execute command. + this.listenTo(buttonView, 'execute', () => { + editor.execute('alignment', { value: option }); + editor.editing.view.focus(); + }); + return buttonView; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/index.js new file mode 100644 index 000000000..3104d3ecb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/index.js @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module alignment + */ +export { default as Alignment } from './alignment'; +export { default as AlignmentEditing } from './alignmentediting'; +export { default as AlignmentUI } from './alignmentui'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/utils.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/utils.js new file mode 100644 index 000000000..6d6894a9d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-alignment/src/utils.js @@ -0,0 +1,118 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { CKEditorError, logWarning } from 'ckeditor5/src/utils'; +/** + * @module alignment/utils + */ +/** + * The list of supported alignment options: + * + * * `'left'`, + * * `'right'`, + * * `'center'`, + * * `'justify'` + */ +export const supportedOptions = ['left', 'right', 'center', 'justify']; +/** + * Checks whether the passed option is supported by {@link module:alignment/alignmentediting~AlignmentEditing}. + * + * @param option The option value to check. + */ +export function isSupported(option) { + return supportedOptions.includes(option); +} +/** + * Checks whether alignment is the default one considering the direction + * of the editor content. + * + * @param alignment The name of the alignment to check. + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + */ +export function isDefault(alignment, locale) { + // Right now only LTR is supported so the 'left' value is always the default one. + if (locale.contentLanguageDirection == 'rtl') { + return alignment === 'right'; + } + else { + return alignment === 'left'; + } +} +/** + * Brings the configuration to the common form, an array of objects. + * + * @param configuredOptions Alignment plugin configuration. + * @returns Normalized object holding the configuration. + */ +export function normalizeAlignmentOptions(configuredOptions) { + const normalizedOptions = configuredOptions + .map(option => { + let result; + if (typeof option == 'string') { + result = { name: option }; + } + else { + result = option; + } + return result; + }) + // Remove all unknown options. + .filter(option => { + const isNameValid = supportedOptions.includes(option.name); + if (!isNameValid) { + /** + * The `name` in one of the `alignment.options` is not recognized. + * The available options are: `'left'`, `'right'`, `'center'` and `'justify'`. + * + * @error alignment-config-name-not-recognized + * @param option Options with unknown value of the `name` property. + */ + logWarning('alignment-config-name-not-recognized', { option }); + } + return isNameValid; + }); + const classNameCount = normalizedOptions.filter(option => Boolean(option.className)).length; + // We either use classes for all styling options or for none. + if (classNameCount && classNameCount < normalizedOptions.length) { + /** + * The `className` property has to be defined for all options once at least one option declares `className`. + * + * @error alignment-config-classnames-are-missing + * @param configuredOptions Contents of `alignment.options`. + */ + throw new CKEditorError('alignment-config-classnames-are-missing', { configuredOptions }); + } + // Validate resulting config. + normalizedOptions.forEach((option, index, allOptions) => { + const succeedingOptions = allOptions.slice(index + 1); + const nameAlreadyExists = succeedingOptions.some(item => item.name == option.name); + if (nameAlreadyExists) { + /** + * The same `name` in one of the `alignment.options` was already declared. + * Each `name` representing one alignment option can be set exactly once. + * + * @error alignment-config-name-already-defined + * @param option First option that declares given `name`. + * @param configuredOptions Contents of `alignment.options`. + */ + throw new CKEditorError('alignment-config-name-already-defined', { option, configuredOptions }); + } + // The `className` property is present. Check for duplicates then. + if (option.className) { + const classNameAlreadyExists = succeedingOptions.some(item => item.className == option.className); + if (classNameAlreadyExists) { + /** + * The same `className` in one of the `alignment.options` was already declared. + * + * @error alignment-config-classname-already-defined + * @param option First option that declares given `className`. + * @param configuredOptions + * Contents of `alignment.options`. + */ + throw new CKEditorError('alignment-config-classname-already-defined', { option, configuredOptions }); + } + } + }); + return normalizedOptions; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/CHANGELOG.md new file mode 100644 index 000000000..cef8c9ada --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/CHANGELOG.md @@ -0,0 +1,208 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v18.0.0...v19.0.0) (2020-04-29) + +### Features + +* Added auto format integration with the strike through using `~~` string. Closes [ckeditor/ckeditor5#6412](https://github.com/ckeditor/ckeditor5/issues/6412). ([9c3fd3e](https://github.com/ckeditor/ckeditor5-autoformat/commit/9c3fd3e)) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v17.0.0...v18.0.0) (2020-03-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v16.0.0...v17.0.0) (2020-02-18) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Features + +* Enabled code block autoformatting with the `` ``` `` sequence. Closes [ckeditor/ckeditor5#5672](https://github.com/ckeditor/ckeditor5/issues/5672). ([fb2d1b5](https://github.com/ckeditor/ckeditor5-autoformat/commit/fb2d1b5)) + +### Bug fixes + +* `BlockAutoformat` should not react to text typed after inline element. Closes [ckeditor/ckeditor5#5671](https://github.com/ckeditor/ckeditor5/issues/5671). ([241c294](https://github.com/ckeditor/ckeditor5-autoformat/commit/241c294)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.5...v15.0.0) (2019-10-23) + +### Bug fixes + +* Autoformat transformations in blocks containing inline elements. Closes [ckeditor/ckeditor5#1955](https://github.com/ckeditor/ckeditor5/issues/1955). ([133c647](https://github.com/ckeditor/ckeditor5-autoformat/commit/133c647)) + +### Other changes + +* Add `pluginName` property to editing plugins. ([44fcbc7](https://github.com/ckeditor/ckeditor5-autoformat/commit/44fcbc7)) + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.4...v11.0.5) (2019-08-26) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([65f5d11](https://github.com/ckeditor/ckeditor5-autoformat/commit/65f5d11)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.3...v11.0.4) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.2...v11.0.3) (2019-07-04) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.1...v11.0.2) (2019-06-05) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.0...v11.0.1) (2019-04-10) + +### Other changes + +* Any digit followed by a dot won't trigger the numbered list. Now, only `1` is supported by the `Autoformat` plugin. Closes [#60](https://github.com/ckeditor/ckeditor5-autoformat/issues/60). ([c7c4662](https://github.com/ckeditor/ckeditor5-autoformat/commit/c7c4662)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.4...v11.0.0) (2019-02-28) + +### Features + +* `BlockAutoformatEditing` will not format the text if the command is disabled. `InlineAutoformatEditing` will not format the text if the callback returned `false`. Closes [#64](https://github.com/ckeditor/ckeditor5-autoformat/issues/64). ([cc7f454](https://github.com/ckeditor/ckeditor5-autoformat/commit/cc7f454)) +* Cancel `BlockAutoformatEditing` autoformatting if given callback returned `false`. Closes [#66](https://github.com/ckeditor/ckeditor5-autoformat/issues/66). ([9b066f1](https://github.com/ckeditor/ckeditor5-autoformat/commit/9b066f1)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.3...v10.0.4) (2018-12-05) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.2...v10.0.3) (2018-10-08) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.1...v10.0.2) (2018-07-18) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.0...v10.0.1) (2018-06-21) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([a9a514a](https://github.com/ckeditor/ckeditor5-autoformat/commit/a9a514a)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +### Bug fixes + +* Autoformat should ignore transparent batches. Closes [#56](https://github.com/ckeditor/ckeditor5-autoformat/issues/56). ([e42f987](https://github.com/ckeditor/ckeditor5-autoformat/commit/e42f987)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +### Bug fixes + +* Fixed integration with undo. Closes [#53](https://github.com/ckeditor/ckeditor5-autoformat/issues/53). ([f5d68f4](https://github.com/ckeditor/ckeditor5-autoformat/commit/f5d68f4)) +* Ordered list will now be triggered by a numer and `.` or `)`. Closes [#42](https://github.com/ckeditor/ckeditor5-autoformat/issues/42). ([bcc4e3b](https://github.com/ckeditor/ckeditor5-autoformat/commit/bcc4e3b)) + + Thanks to [@vladikoff](https://github.com/vladikoff)! + +### Other changes + +* Aligned feature class naming to the new scheme. ([5f5b4a9](https://github.com/ckeditor/ckeditor5-autoformat/commit/5f5b4a9)) + + +## 0.0.1 (2017-10-27) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +### Bug fixes + +* `LiveRanges` used by `InlineAutoFormatEngine` are now properly detached. Closes [#39](https://github.com/ckeditor/ckeditor5-autoformat/issues/39). ([5f24ae8](https://github.com/ckeditor/ckeditor5-autoformat/commit/5f24ae8)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.6.0...v1.0.0-alpha.1) (2017-10-03) + +### Features + +* Added support for backticks which apply `` to the wrapped fragment of text. Closes [#35](https://github.com/ckeditor/ckeditor5-autoformat/issues/35). ([3e93bf6](https://github.com/ckeditor/ckeditor5-autoformat/commit/3e93bf6)) + + +## [0.6.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.5.1...v0.6.0) (2017-09-03) + +### Bug fixes + +* The `Autoformat` plugin should not require other features. Closes [#5](https://github.com/ckeditor/ckeditor5-autoformat/issues/5) and [#17](https://github.com/ckeditor/ckeditor5-autoformat/issues/17). ([d22c5b6](https://github.com/ckeditor/ckeditor5-autoformat/commit/d22c5b6)) +* Autoformatting will not be triggered if the batch with changes is `transparent` (e.g. it represents other user's changes). ([f1131bc](https://github.com/ckeditor/ckeditor5-autoformat/commit/f1131bc)) + +### Features + +* Added support for block quotes. Closes [#26](https://github.com/ckeditor/ckeditor5-autoformat/issues/26). ([4c1e83e](https://github.com/ckeditor/ckeditor5-autoformat/commit/4c1e83e)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([f20ef7d](https://github.com/ckeditor/ckeditor5-autoformat/commit/f20ef7d)) +* The autoformat feature will not depend on the configuration of the heading feature but it will use the available `heading*` commands. Closes [#29](https://github.com/ckeditor/ckeditor5-autoformat/issues/29). ([d0cee1f](https://github.com/ckeditor/ckeditor5-autoformat/commit/d0cee1f)) + +### BREAKING CHANGES + +* The command API has been changed. + +### NOTE + +* The Autoformat feature doesn't require Bold, Italic, Heading, etc. any longer. In order to make the most of the plugin, please make sure that relevant features are loaded in your editor. + + +## [0.5.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.5.0...v0.5.1) (2017-05-07) + +Internal changes only (updated dependencies, documentation, etc.). + +## [0.5.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.4.1...v0.5.0) (2017-04-05) + +### Features + +* Named existing plugin(s). ([e043947](https://github.com/ckeditor/ckeditor5-autoformat/commit/e043947)) + +### Other changes + +* Updated command names to match the latest API of the Heading feature. Closes [#22](https://github.com/ckeditor/ckeditor5-autoformat/issues/22). ([10b5561](https://github.com/ckeditor/ckeditor5-autoformat/commit/10b5561)) + + +## [0.4.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.4.0...v0.4.1) (2017-03-06) + +### Other changes + +* Aligned the use of the `heading` command to the changes in the `ckeditor5-heading` package. Closes [#20](https://github.com/ckeditor/ckeditor5/issues/20). ([6b8b759](https://github.com/ckeditor/ckeditor5-autoformat/commit/6b8b759)) diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/LICENSE.md new file mode 100644 index 000000000..774c74ecd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 autoformat feature** – https://github.com/ckeditor/ckeditor5-autoformat
    +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/README.md new file mode 100644 index 000000000..3f0abda0f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/README.md @@ -0,0 +1,21 @@ +CKEditor 5 autoformat feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-autoformat.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-autoformat) + +This package implements the autoformatting feature for CKEditor 5. It allows styling text by typing sequences like `**bold this**`. + +## Demo + +Check out the [demo in the autoformat feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/autoformat.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-autoformat` package](https://ckeditor.com/docs/ckeditor5/latest/api/autoformat.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/build/autoformat.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/build/autoformat.js new file mode 100644 index 000000000..1549a9902 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/build/autoformat.js @@ -0,0 +1,4 @@ +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var t={704:(t,e,o)=>{t.exports=o(79)("./src/core.js")},492:(t,e,o)=>{t.exports=o(79)("./src/engine.js")},181:(t,e,o)=>{t.exports=o(79)("./src/typing.js")},209:(t,e,o)=>{t.exports=o(79)("./src/utils.js")},79:t=>{"use strict";t.exports=CKEditor5.dll}},e={};function o(i){var s=e[i];if(void 0!==s)return s.exports;var n=e[i]={exports:{}};return t[i](n,n.exports,o),n.exports}o.d=(t,e)=>{for(var i in e)o.o(e,i)&&!o.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};(()=>{"use strict";o.r(i),o.d(i,{Autoformat:()=>c});var t=o(704),e=o(181),s=o(492),n=o(209);function r(t,e,o,i){let r,d=null;"function"==typeof i?r=i:(d=t.commands.get(i),r=()=>{t.execute(i)}),t.model.document.on("change:data",((a,c)=>{if(d&&!d.isEnabled||!e.isEnabled)return;const l=(0,n.first)(t.model.document.selection.getRanges());if(!l.isCollapsed)return;if(c.isUndo||!c.isLocal)return;const u=Array.from(t.model.document.differ.getChanges()),h=u[0];if(1!=u.length||"insert"!==h.type||"$text"!=h.name||1!=h.length)return;const g=h.position.parent;if(g.is("element","codeBlock"))return;if(g.is("element","listItem")&&"function"!=typeof i&&!["numberedList","bulletedList","todoList"].includes(i))return;if(d&&!0===d.value)return;const m=g.getChild(0),f=t.model.createRangeOn(m);if(!f.containsRange(l)&&!l.end.isEqual(f.end))return;const p=o.exec(m.data.substr(0,l.end.offset));p&&t.model.enqueueChange((e=>{const o=e.createPositionAt(g,0),i=e.createPositionAt(g,p[0].length),n=new s.LiveRange(o,i);if(!1!==r({match:p})){e.remove(n);const o=t.model.document.selection.getFirstRange(),i=e.createRangeIn(g);!g.isEmpty||i.isEqual(o)||i.containsRange(o,!0)||e.remove(g)}n.detach(),t.model.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function d(t,e,o,i){let s,n;o instanceof RegExp?s=o:n=o,n=n||(t=>{let e;const o=[],i=[];for(;null!==(e=s.exec(t))&&!(e&&e.length<4);){let{index:t,1:s,2:n,3:r}=e;const d=s+n+r;t+=e[0].length-d.length;const a=[t,t+s.length],c=[t+s.length+n.length,t+s.length+n.length+r.length];o.push(a),o.push(c),i.push([t+s.length,t+s.length+n.length])}return{remove:o,format:i}}),t.model.document.on("change:data",((o,s)=>{if(s.isUndo||!s.isLocal||!e.isEnabled)return;const r=t.model,d=r.document.selection;if(!d.isCollapsed)return;const c=Array.from(r.document.differ.getChanges()),l=c[0];if(1!=c.length||"insert"!==l.type||"$text"!=l.name||1!=l.length)return;const u=d.focus,h=u.parent,{text:g,range:m}=function(t,e){let o=t.start;const i=Array.from(t.getItems()).reduce(((t,i)=>!i.is("$text")&&!i.is("$textProxy")||i.getAttribute("code")?(o=e.createPositionAfter(i),""):t+i.data),"");return{text:i,range:e.createRange(o,t.end)}}(r.createRange(r.createPositionAt(h,0),u),r),f=n(g),p=a(m.start,f.format,r),x=a(m.start,f.remove,r);p.length&&x.length&&r.enqueueChange((e=>{if(!1!==i(e,p)){for(const t of x.reverse())e.remove(t);r.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function a(t,e,o){return e.filter((t=>void 0!==t[0]&&void 0!==t[1])).map((e=>o.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1]))))}class c extends t.Plugin{static get requires(){return[e.Delete]}static get pluginName(){return"Autoformat"}afterInit(){this._addListAutoformats(),this._addBasicStylesAutoformats(),this._addHeadingAutoformats(),this._addBlockQuoteAutoformats(),this._addCodeBlockAutoformats(),this._addHorizontalLineAutoformats()}_addListAutoformats(){const t=this.editor.commands;t.get("bulletedList")&&r(this.editor,this,/^[*-]\s$/,"bulletedList"),t.get("numberedList")&&r(this.editor,this,/^1[.|)]\s$/,"numberedList"),t.get("todoList")&&r(this.editor,this,/^\[\s?\]\s$/,"todoList"),t.get("checkTodoList")&&r(this.editor,this,/^\[\s?x\s?\]\s$/,(()=>{this.editor.execute("todoList"),this.editor.execute("checkTodoList")}))}_addBasicStylesAutoformats(){const t=this.editor.commands;if(t.get("bold")){const t=l(this.editor,"bold");d(this.editor,this,/(?:^|\s)(\*\*)([^*]+)(\*\*)$/g,t),d(this.editor,this,/(?:^|\s)(__)([^_]+)(__)$/g,t)}if(t.get("italic")){const t=l(this.editor,"italic");d(this.editor,this,/(?:^|\s)(\*)([^*_]+)(\*)$/g,t),d(this.editor,this,/(?:^|\s)(_)([^_]+)(_)$/g,t)}if(t.get("code")){const t=l(this.editor,"code");d(this.editor,this,/(`)([^`]+)(`)$/g,t)}if(t.get("strikethrough")){const t=l(this.editor,"strikethrough");d(this.editor,this,/(~~)([^~]+)(~~)$/g,t)}}_addHeadingAutoformats(){const t=this.editor.commands.get("heading");t&&t.modelElements.filter((t=>t.match(/^heading[1-6]$/))).forEach((e=>{const o=e[7],i=new RegExp(`^(#{${o}})\\s$`);r(this.editor,this,i,(()=>{if(!t.isEnabled||t.value===e)return!1;this.editor.execute("heading",{value:e})}))}))}_addBlockQuoteAutoformats(){this.editor.commands.get("blockQuote")&&r(this.editor,this,/^>\s$/,"blockQuote")}_addCodeBlockAutoformats(){const t=this.editor,e=t.model.document.selection;t.commands.get("codeBlock")&&r(t,this,/^```$/,(()=>{if(e.getFirstPosition().parent.is("element","listItem"))return!1;this.editor.execute("codeBlock",{usePreviousLanguageChoice:!0})}))}_addHorizontalLineAutoformats(){this.editor.commands.get("horizontalLine")&&r(this.editor,this,/^---$/,"horizontalLine")}}function l(t,e){return(o,i)=>{if(!t.commands.get(e).isEnabled)return!1;const s=t.model.schema.getValidRanges(i,e);for(const t of s)o.setAttribute(e,!0,t);o.removeSelectionAttribute(e)}}})(),(window.CKEditor5=window.CKEditor5||{}).autoformat=i})(); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json new file mode 100644 index 000000000..73fa5b529 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + { + "name": "Autoformat", + "className": "Autoformat", + "description": "Enables a set of predefined autoformatting actions. It allows for formatting text by typing sequences like **bold this**.", + "docs": "features/autoformat.html", + "path": "src/autoformat.js" + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/package.json new file mode 100644 index 000000000..c92354717 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/package.json @@ -0,0 +1,67 @@ +{ + "name": "@ckeditor/ckeditor5-autoformat", + "version": "36.0.1", + "description": "Autoformatting feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "ckeditor5": "^36.0.1" + }, + "devDependencies": { + "@ckeditor/ckeditor5-basic-styles": "^36.0.1", + "@ckeditor/ckeditor5-block-quote": "^36.0.1", + "@ckeditor/ckeditor5-code-block": "^36.0.1", + "@ckeditor/ckeditor5-core": "^36.0.1", + "@ckeditor/ckeditor5-dev-utils": "^32.0.0", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-engine": "^36.0.1", + "@ckeditor/ckeditor5-enter": "^36.0.1", + "@ckeditor/ckeditor5-heading": "^36.0.1", + "@ckeditor/ckeditor5-horizontal-line": "^36.0.1", + "@ckeditor/ckeditor5-list": "^36.0.1", + "@ckeditor/ckeditor5-paragraph": "^36.0.1", + "@ckeditor/ckeditor5-theme-lark": "^36.0.1", + "@ckeditor/ckeditor5-typing": "^36.0.1", + "@ckeditor/ckeditor5-undo": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-autoformat" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "depcheckIgnore": [ + "eslint-plugin-ckeditor5-rules" + ], + "scripts": { + "dll:build": "webpack", + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/autoformat.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/autoformat.js new file mode 100644 index 000000000..d45b41cad --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/autoformat.js @@ -0,0 +1,189 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { Plugin } from 'ckeditor5/src/core'; +import { Delete } from 'ckeditor5/src/typing'; +import blockAutoformatEditing from './blockautoformatediting'; +import inlineAutoformatEditing from './inlineautoformatediting'; +/** + * Enables a set of predefined autoformatting actions. + * + * For a detailed overview, check the {@glink features/autoformat Autoformatting feature documentation} + * and the {@glink api/autoformat package page}. + */ +export default class Autoformat extends Plugin { + /** + * @inheritdoc + */ + static get requires() { + return [Delete]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Autoformat'; + } + /** + * @inheritDoc + */ + afterInit() { + this._addListAutoformats(); + this._addBasicStylesAutoformats(); + this._addHeadingAutoformats(); + this._addBlockQuoteAutoformats(); + this._addCodeBlockAutoformats(); + this._addHorizontalLineAutoformats(); + } + /** + * Adds autoformatting related to the {@link module:list/list~List}. + * + * When typed: + * - `* ` or `- ` – A paragraph will be changed to a bulleted list. + * - `1. ` or `1) ` – A paragraph will be changed to a numbered list ("1" can be any digit or a list of digits). + * - `[] ` or `[ ] ` – A paragraph will be changed to a to-do list. + * - `[x] ` or `[ x ] ` – A paragraph will be changed to a checked to-do list. + */ + _addListAutoformats() { + const commands = this.editor.commands; + if (commands.get('bulletedList')) { + blockAutoformatEditing(this.editor, this, /^[*-]\s$/, 'bulletedList'); + } + if (commands.get('numberedList')) { + blockAutoformatEditing(this.editor, this, /^1[.|)]\s$/, 'numberedList'); + } + if (commands.get('todoList')) { + blockAutoformatEditing(this.editor, this, /^\[\s?\]\s$/, 'todoList'); + } + if (commands.get('checkTodoList')) { + blockAutoformatEditing(this.editor, this, /^\[\s?x\s?\]\s$/, () => { + this.editor.execute('todoList'); + this.editor.execute('checkTodoList'); + }); + } + } + /** + * Adds autoformatting related to the {@link module:basic-styles/bold~Bold}, + * {@link module:basic-styles/italic~Italic}, {@link module:basic-styles/code~Code} + * and {@link module:basic-styles/strikethrough~Strikethrough} + * + * When typed: + * - `**foobar**` – `**` characters are removed and `foobar` is set to bold, + * - `__foobar__` – `__` characters are removed and `foobar` is set to bold, + * - `*foobar*` – `*` characters are removed and `foobar` is set to italic, + * - `_foobar_` – `_` characters are removed and `foobar` is set to italic, + * - ``` `foobar` – ``` ` ``` characters are removed and `foobar` is set to code, + * - `~~foobar~~` – `~~` characters are removed and `foobar` is set to strikethrough. + */ + _addBasicStylesAutoformats() { + const commands = this.editor.commands; + if (commands.get('bold')) { + const boldCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'bold'); + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(\*\*)([^*]+)(\*\*)$/g, boldCallback); + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(__)([^_]+)(__)$/g, boldCallback); + } + if (commands.get('italic')) { + const italicCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'italic'); + // The italic autoformatter cannot be triggered by the bold markers, so we need to check the + // text before the pattern (e.g. `(?:^|[^\*])`). + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(\*)([^*_]+)(\*)$/g, italicCallback); + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(_)([^_]+)(_)$/g, italicCallback); + } + if (commands.get('code')) { + const codeCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'code'); + inlineAutoformatEditing(this.editor, this, /(`)([^`]+)(`)$/g, codeCallback); + } + if (commands.get('strikethrough')) { + const strikethroughCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'strikethrough'); + inlineAutoformatEditing(this.editor, this, /(~~)([^~]+)(~~)$/g, strikethroughCallback); + } + } + /** + * Adds autoformatting related to {@link module:heading/heading~Heading}. + * + * It is using a number at the end of the command name to associate it with the proper trigger: + * + * * `heading` with value `heading1` will be executed when typing `#`, + * * `heading` with value `heading2` will be executed when typing `##`, + * * ... up to `heading6` and `######`. + */ + _addHeadingAutoformats() { + const command = this.editor.commands.get('heading'); + if (command) { + command.modelElements + .filter(name => name.match(/^heading[1-6]$/)) + .forEach(modelName => { + const level = modelName[7]; + const pattern = new RegExp(`^(#{${level}})\\s$`); + blockAutoformatEditing(this.editor, this, pattern, () => { + // Should only be active if command is enabled and heading style associated with pattern is inactive. + if (!command.isEnabled || command.value === modelName) { + return false; + } + this.editor.execute('heading', { value: modelName }); + }); + }); + } + } + /** + * Adds autoformatting related to {@link module:block-quote/blockquote~BlockQuote}. + * + * When typed: + * * `> ` – A paragraph will be changed to a block quote. + */ + _addBlockQuoteAutoformats() { + if (this.editor.commands.get('blockQuote')) { + blockAutoformatEditing(this.editor, this, /^>\s$/, 'blockQuote'); + } + } + /** + * Adds autoformatting related to {@link module:code-block/codeblock~CodeBlock}. + * + * When typed: + * - `` ``` `` – A paragraph will be changed to a code block. + */ + _addCodeBlockAutoformats() { + const editor = this.editor; + const selection = editor.model.document.selection; + if (editor.commands.get('codeBlock')) { + blockAutoformatEditing(editor, this, /^```$/, () => { + if (selection.getFirstPosition().parent.is('element', 'listItem')) { + return false; + } + this.editor.execute('codeBlock', { + usePreviousLanguageChoice: true + }); + }); + } + } + /** + * Adds autoformatting related to {@link module:horizontal-line/horizontalline~HorizontalLine}. + * + * When typed: + * - `` --- `` – Will be replaced with a horizontal line. + */ + _addHorizontalLineAutoformats() { + if (this.editor.commands.get('horizontalLine')) { + blockAutoformatEditing(this.editor, this, /^---$/, 'horizontalLine'); + } + } +} +/** + * Helper function for getting `inlineAutoformatEditing` callbacks that checks if command is enabled. + */ +function getCallbackFunctionForInlineAutoformat(editor, attributeKey) { + return (writer, rangesToFormat) => { + const command = editor.commands.get(attributeKey); + if (!command.isEnabled) { + return false; + } + const validRanges = editor.model.schema.getValidRanges(rangesToFormat, attributeKey); + for (const range of validRanges) { + writer.setAttribute(attributeKey, true, range); + } + // After applying attribute to the text, remove given attribute from the selection. + // This way user is able to type a text without attribute used by auto formatter. + writer.removeSelectionAttribute(attributeKey); + }; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js new file mode 100644 index 000000000..22dad56e9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js @@ -0,0 +1,136 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { LiveRange } from 'ckeditor5/src/engine'; +import { first } from 'ckeditor5/src/utils'; +/** + * The block autoformatting engine. It allows to format various block patterns. For example, + * it can be configured to turn a paragraph starting with `*` and followed by a space into a list item. + * + * The autoformatting operation is integrated with the undo manager, + * so the autoformatting step can be undone if the user's intention was not to format the text. + * + * See the {@link module:autoformat/blockautoformatediting~blockAutoformatEditing `blockAutoformatEditing`} documentation + * to learn how to create custom block autoformatters. You can also use + * the {@link module:autoformat/autoformat~Autoformat} feature which enables a set of default autoformatters + * (lists, headings, bold and italic). + * + * @module autoformat/blockautoformatediting + */ +/** + * Creates a listener triggered on {@link module:engine/model/document~Document#event:change:data `change:data`} event in the document. + * Calls the callback when inserted text matches the regular expression or the command name + * if provided instead of the callback. + * + * Examples of usage: + * + * To convert a paragraph to heading 1 when `- ` is typed, using just the command name: + * + * ```ts + * blockAutoformatEditing( editor, plugin, /^\- $/, 'heading1' ); + * ``` + * + * To convert a paragraph to heading 1 when `- ` is typed, using just the callback: + * + * ```ts + * blockAutoformatEditing( editor, plugin, /^\- $/, ( context ) => { + * const { match } = context; + * const headingLevel = match[ 1 ].length; + * + * editor.execute( 'heading', { + * formatId: `heading${ headingLevel }` + * } ); + * } ); + * ``` + * + * @param editor The editor instance. + * @param plugin The autoformat plugin instance. + * @param pattern The regular expression to execute on just inserted text. The regular expression is tested against the text + * from the beginning until the caret position. + * @param callbackOrCommand The callback to execute or the command to run when the text is matched. + * In case of providing the callback, it receives the following parameter: + * * {Object} match RegExp.exec() result of matching the pattern to inserted text. + */ +export default function blockAutoformatEditing(editor, plugin, pattern, callbackOrCommand) { + let callback; + let command = null; + if (typeof callbackOrCommand == 'function') { + callback = callbackOrCommand; + } + else { + // We assume that the actual command name was provided. + command = editor.commands.get(callbackOrCommand); + callback = () => { + editor.execute(callbackOrCommand); + }; + } + editor.model.document.on('change:data', (evt, batch) => { + if (command && !command.isEnabled || !plugin.isEnabled) { + return; + } + const range = first(editor.model.document.selection.getRanges()); + if (!range.isCollapsed) { + return; + } + if (batch.isUndo || !batch.isLocal) { + return; + } + const changes = Array.from(editor.model.document.differ.getChanges()); + const entry = changes[0]; + // Typing is represented by only a single change. + if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) { + return; + } + const blockToFormat = entry.position.parent; + // Block formatting should be disabled in codeBlocks (#5800). + if (blockToFormat.is('element', 'codeBlock')) { + return; + } + // Only list commands and custom callbacks can be applied inside a list. + if (blockToFormat.is('element', 'listItem') && + typeof callbackOrCommand !== 'function' && + !['numberedList', 'bulletedList', 'todoList'].includes(callbackOrCommand)) { + return; + } + // In case a command is bound, do not re-execute it over an existing block style which would result with a style removal. + // Instead just drop processing so that autoformat trigger text is not lost. E.g. writing "# " in a level 1 heading. + if (command && command.value === true) { + return; + } + const firstNode = blockToFormat.getChild(0); + const firstNodeRange = editor.model.createRangeOn(firstNode); + // Range is only expected to be within or at the very end of the first text node. + if (!firstNodeRange.containsRange(range) && !range.end.isEqual(firstNodeRange.end)) { + return; + } + const match = pattern.exec(firstNode.data.substr(0, range.end.offset)); + // ...and this text node's data match the pattern. + if (!match) { + return; + } + // Use enqueueChange to create new batch to separate typing batch from the auto-format changes. + editor.model.enqueueChange(writer => { + // Matched range. + const start = writer.createPositionAt(blockToFormat, 0); + const end = writer.createPositionAt(blockToFormat, match[0].length); + const range = new LiveRange(start, end); + const wasChanged = callback({ match }); + // Remove matched text. + if (wasChanged !== false) { + writer.remove(range); + const selectionRange = editor.model.document.selection.getFirstRange(); + const blockRange = writer.createRangeIn(blockToFormat); + // If the block is empty and the document selection has been moved when + // applying formatting (e.g. is now in newly created block). + if (blockToFormat.isEmpty && !blockRange.isEqual(selectionRange) && !blockRange.containsRange(selectionRange, true)) { + writer.remove(blockToFormat); + } + } + range.detach(); + editor.model.enqueueChange(() => { + editor.plugins.get('Delete').requestUndoOnBackspace(); + }); + }); + }); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/index.js new file mode 100644 index 000000000..aa3090cc3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/index.js @@ -0,0 +1,8 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module autoformat + */ +export { default as Autoformat } from './autoformat'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js new file mode 100644 index 000000000..0e3f15e17 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js @@ -0,0 +1,173 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Enables autoformatting mechanism for a given {@link module:core/editor/editor~Editor}. + * + * It formats the matched text by applying the given model attribute or by running the provided formatting callback. + * On every {@link module:engine/model/document~Document#event:change:data data change} in the model document + * the autoformatting engine checks the text on the left of the selection + * and executes the provided action if the text matches given criteria (regular expression or callback). + * + * @param editor The editor instance. + * @param plugin The autoformat plugin instance. + * @param testRegexpOrCallback The regular expression or callback to execute on text. + * Provided regular expression *must* have three capture groups. The first and the third capture group + * should match opening and closing delimiters. The second capture group should match the text to format. + * + * ```ts + * // Matches the `**bold text**` pattern. + * // There are three capturing groups: + * // - The first to match the starting `**` delimiter. + * // - The second to match the text to format. + * // - The third to match the ending `**` delimiter. + * inlineAutoformatEditing( editor, plugin, /(\*\*)([^\*]+?)(\*\*)$/g, formatCallback ); + * ``` + * + * When a function is provided instead of the regular expression, it will be executed with the text to match as a parameter. + * The function should return proper "ranges" to delete and format. + * + * ```ts + * { + * remove: [ + * [ 0, 1 ], // Remove the first letter from the given text. + * [ 5, 6 ] // Remove the 6th letter from the given text. + * ], + * format: [ + * [ 1, 5 ] // Format all letters from 2nd to 5th. + * ] + * } + * ``` + * + * @param formatCallback A callback to apply actual formatting. + * It should return `false` if changes should not be applied (e.g. if a command is disabled). + * + * ```ts + * inlineAutoformatEditing( editor, plugin, /(\*\*)([^\*]+?)(\*\*)$/g, ( writer, rangesToFormat ) => { + * const command = editor.commands.get( 'bold' ); + * + * if ( !command.isEnabled ) { + * return false; + * } + * + * const validRanges = editor.model.schema.getValidRanges( rangesToFormat, 'bold' ); + * + * for ( let range of validRanges ) { + * writer.setAttribute( 'bold', true, range ); + * } + * } ); + * ``` + */ +export default function inlineAutoformatEditing(editor, plugin, testRegexpOrCallback, formatCallback) { + let regExp; + let testCallback; + if (testRegexpOrCallback instanceof RegExp) { + regExp = testRegexpOrCallback; + } + else { + testCallback = testRegexpOrCallback; + } + // A test callback run on changed text. + testCallback = testCallback || (text => { + let result; + const remove = []; + const format = []; + while ((result = regExp.exec(text)) !== null) { + // There should be full match and 3 capture groups. + if (result && result.length < 4) { + break; + } + let { index, '1': leftDel, '2': content, '3': rightDel } = result; + // Real matched string - there might be some non-capturing groups so we need to recalculate starting index. + const found = leftDel + content + rightDel; + index += result[0].length - found.length; + // Start and End offsets of delimiters to remove. + const delStart = [ + index, + index + leftDel.length + ]; + const delEnd = [ + index + leftDel.length + content.length, + index + leftDel.length + content.length + rightDel.length + ]; + remove.push(delStart); + remove.push(delEnd); + format.push([index + leftDel.length, index + leftDel.length + content.length]); + } + return { + remove, + format + }; + }); + editor.model.document.on('change:data', (evt, batch) => { + if (batch.isUndo || !batch.isLocal || !plugin.isEnabled) { + return; + } + const model = editor.model; + const selection = model.document.selection; + // Do nothing if selection is not collapsed. + if (!selection.isCollapsed) { + return; + } + const changes = Array.from(model.document.differ.getChanges()); + const entry = changes[0]; + // Typing is represented by only a single change. + if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) { + return; + } + const focus = selection.focus; + const block = focus.parent; + const { text, range } = getTextAfterCode(model.createRange(model.createPositionAt(block, 0), focus), model); + const testOutput = testCallback(text); + const rangesToFormat = testOutputToRanges(range.start, testOutput.format, model); + const rangesToRemove = testOutputToRanges(range.start, testOutput.remove, model); + if (!(rangesToFormat.length && rangesToRemove.length)) { + return; + } + // Use enqueueChange to create new batch to separate typing batch from the auto-format changes. + model.enqueueChange(writer => { + // Apply format. + const hasChanged = formatCallback(writer, rangesToFormat); + // Strict check on `false` to have backward compatibility (when callbacks were returning `undefined`). + if (hasChanged === false) { + return; + } + // Remove delimiters - use reversed order to not mix the offsets while removing. + for (const range of rangesToRemove.reverse()) { + writer.remove(range); + } + model.enqueueChange(() => { + editor.plugins.get('Delete').requestUndoOnBackspace(); + }); + }); + }); +} +/** + * Converts output of the test function provided to the inlineAutoformatEditing and converts it to the model ranges + * inside provided block. + */ +function testOutputToRanges(start, arrays, model) { + return arrays + .filter(array => (array[0] !== undefined && array[1] !== undefined)) + .map(array => { + return model.createRange(start.getShiftedBy(array[0]), start.getShiftedBy(array[1])); + }); +} +/** + * Returns the last text line after the last code element from the given range. + * It is similar to {@link module:typing/utils/getlasttextline.getLastTextLine `getLastTextLine()`}, + * but it ignores any text before the last `code`. + */ +function getTextAfterCode(range, model) { + let start = range.start; + const text = Array.from(range.getItems()).reduce((rangeText, node) => { + // Trim text to a last occurrence of an inline element and update range start. + if (!(node.is('$text') || node.is('$textProxy')) || node.getAttribute('code')) { + start = model.createPositionAfter(node); + return ''; + } + return rangeText + node.data; + }, ''); + return { text, range: model.createRange(start, range.end) }; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md new file mode 100644 index 000000000..3ec2314ae --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md @@ -0,0 +1,247 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v18.0.0...v19.0.0) (2020-04-29) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v17.0.0...v18.0.0) (2020-03-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v16.0.0...v17.0.0) (2020-02-18) + +### Bug fixes + +* Focus the editor before executing toolbar buttons' command. See [ckeditor/ckeditor5#353](https://github.com/ckeditor/ckeditor5/issues/353). ([6bbca98](https://github.com/ckeditor/ckeditor5-basic-styles/commit/6bbca98)) + +### Other changes + +* Updated translations. ([4def017](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4def017)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Other changes + +* Updated translations. ([9dfd52c](https://github.com/ckeditor/ckeditor5-basic-styles/commit/9dfd52c)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.4...v15.0.0) (2019-10-23) + +### Features + +* Provided support for numeric values for the `font-weight` attribute. Closes [#94](https://github.com/ckeditor/ckeditor5-basic-styles/issues/94). Closes [ckeditor/ckeditor5-paste-from-office#74](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/74). ([25a0d7c](https://github.com/ckeditor/ckeditor5-basic-styles/commit/25a0d7c)) + +### Other changes + +* Added `pluginName` property to editing plugins. ([d91773f](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d91773f)) +* Updated translations. ([56d6060](https://github.com/ckeditor/ckeditor5-basic-styles/commit/56d6060)) + + +## [11.1.4](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.3...v11.1.4) (2019-08-26) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([b9f5867](https://github.com/ckeditor/ckeditor5-basic-styles/commit/b9f5867)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([8293319](https://github.com/ckeditor/ckeditor5-basic-styles/commit/8293319)) +* Mark basic-styles attributes with 'copyOnEnter' property. ([0afbc20](https://github.com/ckeditor/ckeditor5-basic-styles/commit/0afbc20)) +* Updated translations. ([52de3fe](https://github.com/ckeditor/ckeditor5-basic-styles/commit/52de3fe)) + + +## [11.1.3](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.2...v11.1.3) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.1.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.1...v11.1.2) (2019-07-04) + +### Other changes + +* Updated translations. ([8914cfc](https://github.com/ckeditor/ckeditor5-basic-styles/commit/8914cfc)) ([fb07a45](https://github.com/ckeditor/ckeditor5-basic-styles/commit/fb07a45)) + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.0...v11.1.1) (2019-06-05) + +### Other changes + +* Updated translations. ([c9cdc44](https://github.com/ckeditor/ckeditor5-basic-styles/commit/c9cdc44)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.0.0...v11.1.0) (2019-04-10) + +### Features + +* Marked basic style attributes as a formatting using the `AttributeProperties#isFormatting` property. Closes [ckeditor/ckeditor5#1664](https://github.com/ckeditor/ckeditor5/issues/1664). ([fcfba54](https://github.com/ckeditor/ckeditor5-basic-styles/commit/fcfba54)) + +### Other changes + +* Optimized icons. ([018dda9](https://github.com/ckeditor/ckeditor5-basic-styles/commit/018dda9)) +* Updated translations. ([4365251](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4365251)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.1.0...v11.0.0) (2019-02-28) + +### Other changes + +* Updated translations. ([b96cf6d](https://github.com/ckeditor/ckeditor5-basic-styles/commit/b96cf6d)) ([8223ff2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/8223ff2)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.3...v10.1.0) (2018-12-05) + +### Features + +* Introduced the `Superscript` and the `Subscript` features. Closes [#76](https://github.com/ckeditor/ckeditor5-basic-styles/issues/76). Closes [#74](https://github.com/ckeditor/ckeditor5-basic-styles/issues/74). ([f281e99](https://github.com/ckeditor/ckeditor5-basic-styles/commit/f281e99)) + + Thanks to [@idleb](https://github.com/idleb)! + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([6314191](https://github.com/ckeditor/ckeditor5-basic-styles/commit/6314191)) +* Updated translations. ([f9d3d07](https://github.com/ckeditor/ckeditor5-basic-styles/commit/f9d3d07)) ([67fb2e2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/67fb2e2)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.2...v10.0.3) (2018-10-08) + +### Other changes + +* Updated translations. ([cf4e657](https://github.com/ckeditor/ckeditor5-basic-styles/commit/cf4e657)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.1...v10.0.2) (2018-07-18) + +### Bug fixes + +* The value of `AttributeCommand` should be taken from the first node on which this style is allowed. Closes [#56](https://github.com/ckeditor/ckeditor5-basic-styles/issues/56). ([64a0dbc](https://github.com/ckeditor/ckeditor5-basic-styles/commit/64a0dbc)) + +### Other changes + +* Updated translations. ([df8bcc4](https://github.com/ckeditor/ckeditor5-basic-styles/commit/df8bcc4)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.0...v10.0.1) (2018-06-21) + +### Other changes + +* Updated translations. + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([94da24e](https://github.com/ckeditor/ckeditor5-basic-styles/commit/94da24e)) +* Updated translations. ([dbebfe0](https://github.com/ckeditor/ckeditor5-basic-styles/commit/dbebfe0)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +### Other changes + +* Improved the "strikethrough" icon. Closes [ckeditor/ckeditor5#910](https://github.com/ckeditor/ckeditor5/issues/910). ([d559d8f](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d559d8f)) +* Updated translations. ([b4c8419](https://github.com/ckeditor/ckeditor5-basic-styles/commit/b4c8419)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +### Features + +* Added the strikethrough feature. ([78719c9](https://github.com/ckeditor/ckeditor5-basic-styles/commit/78719c9)) + + Thanks to [@Natim](https://github.com/Natim)! +* Updated icons for compatibility with the refreshed Lark theme (see [ckeditor/ckeditor5#645](https://github.com/ckeditor/ckeditor5/issues/645)). ([170fec2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/170fec2)) + +### Other changes + +* Aligned feature class naming to the new scheme. ([51a4b61](https://github.com/ckeditor/ckeditor5-basic-styles/commit/51a4b61)) +* Migrated package styles to PostCSS. Moved the visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([a5d5d9e](https://github.com/ckeditor/ckeditor5-basic-styles/commit/a5d5d9e)) +* Updated translations. ([1ff4312](https://github.com/ckeditor/ckeditor5-basic-styles/commit/1ff4312)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +### Other changes + +* Updated translations. ([398054d](https://github.com/ckeditor/ckeditor5-basic-styles/commit/398054d)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.9.0...v1.0.0-alpha.1) (2017-10-03) + +### Features + +* Introduced the `Code` plugin. Closes [#52](https://github.com/ckeditor/ckeditor5-basic-styles/issues/52). ([d720cb9](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d720cb9)) + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.8.1...v0.9.0) (2017-09-03) + +### Bug fixes + +* It should be possible to paste basic styles. See https://github.com/ckeditor/ckeditor5/issues/477. ([d2db7fe](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d2db7fe)) + +### Features + +* Introduced `AttributeCommand`. It was moved from `@ckeditor/ckeditor5-core/src/command/toggleattributecommand`. Closes [#47](https://github.com/ckeditor/ckeditor5-basic-styles/issues/47). ([0301d4a](https://github.com/ckeditor/ckeditor5-basic-styles/commit/0301d4a)) +* Introduced the `Underline` plugin. Closes [#51](https://github.com/ckeditor/ckeditor5-basic-styles/issues/51). ([f724ae0](https://github.com/ckeditor/ckeditor5-basic-styles/commit/f724ae0)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([36a976e](https://github.com/ckeditor/ckeditor5-basic-styles/commit/36a976e)) +* Cleaned up SVG icons. ([da10131](https://github.com/ckeditor/ckeditor5-basic-styles/commit/da10131)) +* Italic feature will use `` instead of ``. Closes [#28](https://github.com/ckeditor/ckeditor5-basic-styles/issues/28). ([9d1d5e2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/9d1d5e2)) + + Read more in [Editor Recommendations](http://ckeditor.github.io/editor-recommendations/features/italic.html). + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.8.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.8.0...v0.8.1) (2017-05-07) + +### Bug fixes + +* Bold and italic should not be allowed directly in the root element. Closes [#40](https://github.com/ckeditor/ckeditor5-basic-styles/issues/40). ([4a737bf](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4a737bf)) + +### Other changes + +* Updated translations. ([5250bec](https://github.com/ckeditor/ckeditor5-basic-styles/commit/5250bec)) + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.7.1...v0.8.0) (2017-04-05) + +### Features + +* Named existing plugin(s). ([5f649be](https://github.com/ckeditor/ckeditor5-basic-styles/commit/5f649be)) + +### Other changes + +* Updated translations. ([2aa33fd](https://github.com/ckeditor/ckeditor5-basic-styles/commit/2aa33fd)) + + +## [0.7.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.7.0...v0.7.1) (2017-03-06) + +### Other changes + +* Updated translations. ([4fd6e19](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4fd6e19)) diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/LICENSE.md new file mode 100644 index 000000000..5d4b9a53d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 basic styles feature** – https://github.com/ckeditor/ckeditor5-basic-styles
    +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/README.md new file mode 100644 index 000000000..43294c22d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/README.md @@ -0,0 +1,21 @@ +CKEditor 5 basic styles feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-basic-styles.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-basic-styles) + +This package contains CKEditor 5 features allowing to apply basic text formatting such as bold, italic, underline, and code in CKEditor 5. + +## Demo + +Check out the [demo in the basic styles feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/basic-styles.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-basic-styles` package](https://ckeditor.com/docs/ckeditor5/latest/api/basic-styles.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js new file mode 100644 index 000000000..b4baf5050 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js @@ -0,0 +1,5 @@ +!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var t={415:(t,e,i)=>{"use strict";i.d(e,{Z:()=>r});var n=i(609),s=i.n(n)()((function(t){return t[1]}));s.push([t.id,".ck-content code{background-color:hsla(0,0%,78%,.3);border-radius:2px;padding:.15em}.ck.ck-editor__editable .ck-code_selected{background-color:hsla(0,0%,78%,.5)}",""]);const r=s},609:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i=t(e);return e[2]?"@media ".concat(e[2]," {").concat(i,"}"):i})).join("")},e.i=function(t,i,n){"string"==typeof t&&(t=[[null,t,""]]);var s={};if(n)for(var r=0;r{"use strict";var n,s=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var t={};return function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}t[e]=i}return t[e]}}(),o=[];function a(t){for(var e=-1,i=0;i{t.exports=i(79)("./src/core.js")},181:(t,e,i)=>{t.exports=i(79)("./src/typing.js")},273:(t,e,i)=>{t.exports=i(79)("./src/ui.js")},79:t=>{"use strict";t.exports=CKEditor5.dll}},e={};function i(n){var s=e[n];if(void 0!==s)return s.exports;var r=e[n]={id:n,exports:{}};return t[n](r,r.exports,i),r.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.nc=void 0;var n={};(()=>{"use strict";i.r(n),i.d(n,{Bold:()=>l,BoldEditing:()=>r,BoldUI:()=>c,Code:()=>f,CodeEditing:()=>g,CodeUI:()=>w,Italic:()=>T,ItalicEditing:()=>y,ItalicUI:()=>E,Strikethrough:()=>N,StrikethroughEditing:()=>A,StrikethroughUI:()=>I,Subscript:()=>F,SubscriptEditing:()=>B,SubscriptUI:()=>U,Superscript:()=>j,SuperscriptEditing:()=>M,SuperscriptUI:()=>V,Underline:()=>H,UnderlineEditing:()=>z,UnderlineUI:()=>q});var t=i(704);class e extends t.Command{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const s=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of s)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,i=t.document.selection;if(i.isCollapsed)return i.hasAttribute(this.attributeKey);for(const t of i.getRanges())for(const i of t.getItems())if(e.checkAttribute(i,this.attributeKey))return i.hasAttribute(this.attributeKey);return!1}}const s="bold";class r extends t.Plugin{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:s}),t.model.schema.setAttributeProperties(s,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:s,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e&&("bold"==e||Number(e)>=600)?{name:!0,styles:["font-weight"]}:null}]}),t.commands.add(s,new e(t,s)),t.keystrokes.set("CTRL+B",s)}}var o=i(273);const a="bold";class c extends t.Plugin{static get pluginName(){return"BoldUI"}init(){const e=this.editor,i=e.t;e.ui.componentFactory.add(a,(n=>{const s=e.commands.get(a),r=new o.ButtonView(n);return r.set({label:i("Bold"),icon:t.icons.bold,keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),this.listenTo(r,"execute",(()=>{e.execute(a),e.editing.view.focus()})),r}))}}class l extends t.Plugin{static get requires(){return[r,c]}static get pluginName(){return"Bold"}}var u=i(181);const d="code";class g extends t.Plugin{static get pluginName(){return"CodeEditing"}static get requires(){return[u.TwoStepCaretMovement]}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:d}),t.model.schema.setAttributeProperties(d,{isFormatting:!0,copyOnEnter:!1}),t.conversion.attributeToElement({model:d,view:"code",upcastAlso:{styles:{"word-wrap":"break-word"}}}),t.commands.add(d,new e(t,d)),t.plugins.get(u.TwoStepCaretMovement).registerAttribute(d),(0,u.inlineHighlight)(t,d,"code","ck-code_selected")}}var m=i(62),p=i.n(m),h=i(415),b={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};p()(h.Z,b);h.Z.locals;const v="code";class w extends t.Plugin{static get pluginName(){return"CodeUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(v,(i=>{const n=t.commands.get(v),s=new o.ButtonView(i);return s.set({label:e("Code"),icon:'',tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(v),t.editing.view.focus()})),s}))}}class f extends t.Plugin{static get requires(){return[g,w]}static get pluginName(){return"Code"}}const x="italic";class y extends t.Plugin{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:x}),t.model.schema.setAttributeProperties(x,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:x,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(x,new e(t,x)),t.keystrokes.set("CTRL+I",x)}}const S="italic";class E extends t.Plugin{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(S,(i=>{const n=t.commands.get(S),s=new o.ButtonView(i);return s.set({label:e("Italic"),icon:'',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(S),t.editing.view.focus()})),s}))}}class T extends t.Plugin{static get requires(){return[y,E]}static get pluginName(){return"Italic"}}const k="strikethrough";class A extends t.Plugin{static get pluginName(){return"StrikethroughEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:k}),t.model.schema.setAttributeProperties(k,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:k,view:"s",upcastAlso:["del","strike",{styles:{"text-decoration":"line-through"}}]}),t.commands.add(k,new e(t,k)),t.keystrokes.set("CTRL+SHIFT+X","strikethrough")}}const C="strikethrough";class I extends t.Plugin{static get pluginName(){return"StrikethroughUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(C,(i=>{const n=t.commands.get(C),s=new o.ButtonView(i);return s.set({label:e("Strikethrough"),icon:'',keystroke:"CTRL+SHIFT+X",tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(C),t.editing.view.focus()})),s}))}}class N extends t.Plugin{static get requires(){return[A,I]}static get pluginName(){return"Strikethrough"}}const P="subscript";class B extends t.Plugin{static get pluginName(){return"SubscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:P}),t.model.schema.setAttributeProperties(P,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:P,view:"sub",upcastAlso:[{styles:{"vertical-align":"sub"}}]}),t.commands.add(P,new e(t,P))}}const O="subscript";class U extends t.Plugin{static get pluginName(){return"SubscriptUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(O,(i=>{const n=t.commands.get(O),s=new o.ButtonView(i);return s.set({label:e("Subscript"),icon:'',tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(O),t.editing.view.focus()})),s}))}}class F extends t.Plugin{static get requires(){return[B,U]}static get pluginName(){return"Subscript"}}const L="superscript";class M extends t.Plugin{static get pluginName(){return"SuperscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:L}),t.model.schema.setAttributeProperties(L,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:L,view:"sup",upcastAlso:[{styles:{"vertical-align":"super"}}]}),t.commands.add(L,new e(t,L))}}const R="superscript";class V extends t.Plugin{static get pluginName(){return"SuperscriptUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(R,(i=>{const n=t.commands.get(R),s=new o.ButtonView(i);return s.set({label:e("Superscript"),icon:'',tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(R),t.editing.view.focus()})),s}))}}class j extends t.Plugin{static get requires(){return[M,V]}static get pluginName(){return"Superscript"}}const K="underline";class z extends t.Plugin{static get pluginName(){return"UnderlineEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:K}),t.model.schema.setAttributeProperties(K,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:K,view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}}),t.commands.add(K,new e(t,K)),t.keystrokes.set("CTRL+U","underline")}}const _="underline";class q extends t.Plugin{static get pluginName(){return"UnderlineUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(_,(i=>{const n=t.commands.get(_),s=new o.ButtonView(i);return s.set({label:e("Underline"),icon:'',keystroke:"CTRL+U",tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(s,"execute",(()=>{t.execute(_),t.editing.view.focus()})),s}))}}class H extends t.Plugin{static get requires(){return[z,q]}static get pluginName(){return"Underline"}}})(),(window.CKEditor5=window.CKEditor5||{}).basicStyles=n})(); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/af.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/af.js new file mode 100644 index 000000000..b927ce58f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/af.js @@ -0,0 +1 @@ +!function(r){const e=r.af=r.af||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Vet",Code:"Bronkode",Italic:"Kursief",Strikethrough:"Deurstreep",Subscript:"Onderskrif",Superscript:"Boskrif",Underline:"Onderstreep"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js new file mode 100644 index 000000000..f81c9e376 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js @@ -0,0 +1 @@ +!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"عريض",Code:"شفرة برمجية",Italic:"مائل",Strikethrough:"يتوسطه خط",Subscript:"حرف منخفض",Superscript:"حرف مرتفع",Underline:"تحته خط"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js new file mode 100644 index 000000000..819f02f27 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js @@ -0,0 +1 @@ +!function(i){const t=i.ast=i.ast||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrina",Code:"",Italic:"Cursiva",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/az.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/az.js new file mode 100644 index 000000000..6582a6dd4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/az.js @@ -0,0 +1 @@ +!function(a){const i=a.az=a.az||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Yarıqalın",Code:"Kod",Italic:"Maili",Strikethrough:"Qaralanmış",Subscript:"Alt yazı",Superscript:"Üst yazı",Underline:"Altdan xətt"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js new file mode 100644 index 000000000..f39a9df29 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js @@ -0,0 +1 @@ +!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Удебелен",Code:"Код",Italic:"Курсив",Strikethrough:"Зачертаване",Subscript:"Долен индекс",Superscript:"Горен индекс",Underline:"Подчертаване"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js new file mode 100644 index 000000000..e977b159b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js @@ -0,0 +1 @@ +!function(i){const n=i.bn=i.bn||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"বোল্ড",Code:"কোড",Italic:"ইটালিক",Strikethrough:"স্ট্রাইকথ্রু",Subscript:"সাবস্ক্রিপ্ট",Superscript:"সুপারস্ক্রিপ্ট",Underline:"আন্ডারলাইন"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js new file mode 100644 index 000000000..02b33846a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js @@ -0,0 +1 @@ +!function(o){const i=o.bs=o.bs||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Zakrivljeno",Strikethrough:"Precrtano",Subscript:"",Superscript:"",Underline:"Podcrtano"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js new file mode 100644 index 000000000..7658adefd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js @@ -0,0 +1 @@ +!function(i){const r=i.ca=i.ca||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Negreta",Code:"Codi",Italic:"Cursiva",Strikethrough:"Marcat",Subscript:"Subíndex",Superscript:"Superíndex",Underline:"Subrallat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js new file mode 100644 index 000000000..c5bd1295d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js @@ -0,0 +1 @@ +!function(n){const i=n.cs=n.cs||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tučné",Code:"Kódový blok",Italic:"Kurzíva",Strikethrough:"Přeškrtnuté",Subscript:"Dolní index",Superscript:"Horní index",Underline:"Podtržené"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/da.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/da.js new file mode 100644 index 000000000..ffbf6228e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/da.js @@ -0,0 +1 @@ +!function(t){const e=t.da=t.da||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fed",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gennemstreg",Subscript:"Sænket skrift",Superscript:"Hævet skrift",Underline:"Understreget"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js new file mode 100644 index 000000000..ca3885b5b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js @@ -0,0 +1 @@ +!function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett",Code:"Code",Italic:"Kursiv",Strikethrough:"Durchgestrichen",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/de.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/de.js new file mode 100644 index 000000000..9b86f99ed --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/de.js @@ -0,0 +1 @@ +!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett",Code:"Code",Italic:"Kursiv",Strikethrough:"Durchgestrichen",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/el.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/el.js new file mode 100644 index 000000000..31392698c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/el.js @@ -0,0 +1 @@ +!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Έντονα",Code:"Κώδικας",Italic:"Πλάγια",Strikethrough:"Διακριτή διαγραφή",Subscript:"Δείκτης",Superscript:"Εκθέτης",Underline:"Υπογράμμιση"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js new file mode 100644 index 000000000..0ad33934f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js @@ -0,0 +1 @@ +!function(i){const t=i["en-au"]=i["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js new file mode 100644 index 000000000..679b61245 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js @@ -0,0 +1 @@ +!function(i){const t=i["en-gb"]=i["en-gb"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js new file mode 100644 index 000000000..14eb4402c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js @@ -0,0 +1 @@ +!function(i){const o=i.eo=i.eo||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"grasa",Code:"",Italic:"kursiva",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js new file mode 100644 index 000000000..4d1fe73c2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js @@ -0,0 +1 @@ +!function(i){const o=i["es-co"]=i["es-co"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Negrita",Code:"Código",Italic:"Cursiva",Strikethrough:"Tachado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subrayado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/es.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/es.js new file mode 100644 index 000000000..e08429170 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/es.js @@ -0,0 +1 @@ +!function(i){const d=i.es=i.es||{};d.dictionary=Object.assign(d.dictionary||{},{Bold:"Negrita",Code:"Código",Italic:"Cursiva",Strikethrough:"Tachado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subrayado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/et.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/et.js new file mode 100644 index 000000000..7e09b8945 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/et.js @@ -0,0 +1 @@ +!function(i){const n=i.et=i.et||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Rasvane",Code:"Kood",Italic:"Kaldkiri",Strikethrough:"Läbijoonitud",Subscript:"Alaindeks",Superscript:"Ülaindeks",Underline:"Allajoonitud"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js new file mode 100644 index 000000000..2ad6521bf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js @@ -0,0 +1 @@ +!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Lodia",Code:"Kodea",Italic:"Etzana",Strikethrough:"",Subscript:"",Superscript:"",Underline:"Azpimarra"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js new file mode 100644 index 000000000..cecd56222 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js @@ -0,0 +1 @@ +!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"درشت",Code:"کد",Italic:"کج",Strikethrough:"خط خورده",Subscript:"پایین نویس",Superscript:"بالانویس",Underline:"خط زیر"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js new file mode 100644 index 000000000..d6b6f2480 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js @@ -0,0 +1 @@ +!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Lihavointi",Code:"Koodi",Italic:"Kursivointi",Strikethrough:"Yliviivaus",Subscript:"Alaindeksi",Superscript:"Yläindeksi",Underline:"Alleviivaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js new file mode 100644 index 000000000..645241023 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js @@ -0,0 +1 @@ +!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Gras",Code:"Code",Italic:"Italique",Strikethrough:"Barré",Subscript:"Indice",Superscript:"Exposant",Underline:"Souligné"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js new file mode 100644 index 000000000..c018be66c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js @@ -0,0 +1 @@ +!function(i){const c=i.gl=i.gl||{};c.dictionary=Object.assign(c.dictionary||{},{Bold:"Negra",Code:"Código",Italic:"Itálica",Strikethrough:"Riscado",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subliñado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js new file mode 100644 index 000000000..be1c42a7c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js @@ -0,0 +1 @@ +!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ઘાટુ - બોલ્ડ્",Code:"",Italic:"ત્રાંસુ - ઇટલિક્",Strikethrough:"",Subscript:"",Superscript:"",Underline:"નીચે લિટી - અન્ડરલાઇન્"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/he.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/he.js new file mode 100644 index 000000000..c6de5391a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/he.js @@ -0,0 +1 @@ +!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"מודגש",Code:"קוד",Italic:"נטוי",Strikethrough:"קו חוצה",Subscript:"כתב תחתי",Superscript:"כתב עילי",Underline:"קו תחתון"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js new file mode 100644 index 000000000..c74dc1307 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js @@ -0,0 +1 @@ +!function(i){const t=i.hi=i.hi||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Bold",Code:"Code",Italic:"Italic",Strikethrough:"Strikethrough",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js new file mode 100644 index 000000000..890fb4c67 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js @@ -0,0 +1 @@ +!function(n){const o=n.hr=n.hr||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Ukošeno",Strikethrough:"Precrtano",Subscript:"Indeks",Superscript:"Eksponent",Underline:"Podcrtavanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js new file mode 100644 index 000000000..8366f796c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js @@ -0,0 +1 @@ +!function(t){const i=t.hu=t.hu||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Félkövér",Code:"Forráskód",Italic:"Dőlt",Strikethrough:"Áthúzott",Subscript:"Alsó index",Superscript:"Felső index",Underline:"Aláhúzott"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/id.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/id.js new file mode 100644 index 000000000..626d5a8e7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/id.js @@ -0,0 +1 @@ +!function(i){const r=i.id=i.id||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Tebal",Code:"Kode",Italic:"Miring",Strikethrough:"Coret",Subscript:"Subskrip",Superscript:"Superskrip",Underline:"Garis bawah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/it.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/it.js new file mode 100644 index 000000000..c439e07d7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/it.js @@ -0,0 +1 @@ +!function(i){const t=i.it=i.it||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Grassetto",Code:"Codice",Italic:"Corsivo",Strikethrough:"Barrato",Subscript:"Pedice",Superscript:"Apice",Underline:"Sottolineato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js new file mode 100644 index 000000000..1b9b49da6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js @@ -0,0 +1 @@ +!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ボールド",Code:"コード",Italic:"イタリック",Strikethrough:"取り消し線",Subscript:"下付き文字",Superscript:"上付き文字",Underline:"アンダーライン"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js new file mode 100644 index 000000000..041f3a558 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js @@ -0,0 +1 @@ +!function(i){const n=i.jv=i.jv||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Kandhel",Code:"Kode",Italic:"Miring",Strikethrough:"Seratan dicoret",Subscript:"",Superscript:"",Underline:"Garis ngandhap"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/km.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/km.js new file mode 100644 index 000000000..12bcca30e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/km.js @@ -0,0 +1 @@ +!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"ដិត",Code:"កូដ",Italic:"ទ្រេត",Strikethrough:"ឆូតកណ្ដាល",Subscript:"អក្សរ​តូចក្រោម",Superscript:"អក្សរ​តូចលើ",Underline:"គូស​បន្ទាត់​ក្រោម"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js new file mode 100644 index 000000000..eab4d855d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js @@ -0,0 +1 @@ +!function(i){const n=i.kn=i.kn||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"‍‍ದಪ್ಪ",Code:"",Italic:"‍ಇಟಾಲಿಕ್",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js new file mode 100644 index 000000000..2b200a027 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js @@ -0,0 +1 @@ +!function(i){const o=i.ko=i.ko||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"굵게",Code:"코드",Italic:"기울임꼴",Strikethrough:"취소선",Subscript:"아래 첨자",Superscript:"위 첨자",Underline:"밑줄"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js new file mode 100644 index 000000000..2e022007e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js @@ -0,0 +1 @@ +!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"قەڵەو",Code:"کۆد",Italic:"لار",Strikethrough:"هێڵ بەسەرداهاتوو",Subscript:"ژێرنووس",Superscript:"سەرنووس",Underline:"ژێرهێڵ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js new file mode 100644 index 000000000..e9501bd1a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js @@ -0,0 +1 @@ +!function(i){const a=i.lt=i.lt||{};a.dictionary=Object.assign(a.dictionary||{},{Bold:"Paryškintas",Code:"Kodas",Italic:"Kursyvas",Strikethrough:"Perbrauktas",Subscript:"Žemiau",Superscript:"Aukščiau",Underline:"Pabrauktas"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js new file mode 100644 index 000000000..26579c763 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js @@ -0,0 +1 @@ +!function(s){const t=s.lv=s.lv||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Trekns",Code:"Kods",Italic:"Kursīvs",Strikethrough:"Nosvītrots",Subscript:"Apakšraksts",Superscript:"Augšraksts",Underline:"Pasvītrots"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js new file mode 100644 index 000000000..1c5ae8a06 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js @@ -0,0 +1 @@ +!function(i){const r=i.ms=i.ms||{};r.dictionary=Object.assign(r.dictionary||{},{Bold:"Tebal",Code:"Kod",Italic:"Italik",Strikethrough:"Garis lorek",Subscript:"Subskrip",Superscript:"Superskrip",Underline:"Garis bawah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js new file mode 100644 index 000000000..b2e26b588 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js @@ -0,0 +1 @@ +!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Fet",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gjennomstreking",Subscript:"",Superscript:"",Underline:"Understreking"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js new file mode 100644 index 000000000..1f2c6b145 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js @@ -0,0 +1 @@ +!function(i){const n=i.ne=i.ne||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"बोल्ड",Code:"कोड",Italic:"इटालिक",Strikethrough:"स्ट्राइकथ्रू",Subscript:"सबस्क्रिप्ट",Superscript:"सुपरस्क्रिप्ट",Underline:"रेखांकन"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js new file mode 100644 index 000000000..22a95ae8f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js @@ -0,0 +1 @@ +!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Vet",Code:"Code",Italic:"Cursief",Strikethrough:"Doorhalen",Subscript:"Subscript",Superscript:"Superscript",Underline:"Onderlijnen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/no.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/no.js new file mode 100644 index 000000000..ace47f7ab --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/no.js @@ -0,0 +1 @@ +!function(t){const e=t.no=t.no||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fet",Code:"Kode",Italic:"Kursiv",Strikethrough:"Gjennomstreket",Subscript:"Senket skrift",Superscript:"Hevet skrift",Underline:"Understreket"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js new file mode 100644 index 000000000..077a6d373 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js @@ -0,0 +1 @@ +!function(i){const c=i.oc=i.oc||{};c.dictionary=Object.assign(c.dictionary||{},{Bold:"Gras",Code:"",Italic:"Italica",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js new file mode 100644 index 000000000..c2780c03d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js @@ -0,0 +1 @@ +!function(e){const i=e.pl=e.pl||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Pogrubienie",Code:"Kod",Italic:"Kursywa",Strikethrough:"Przekreślenie",Subscript:"Indeks dolny",Superscript:"Indeks górny",Underline:"Podkreślenie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js new file mode 100644 index 000000000..455777710 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js @@ -0,0 +1 @@ +!function(i){const o=i["pt-br"]=i["pt-br"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Negrito",Code:"Código",Italic:"Itálico",Strikethrough:"Tachado",Subscript:"Subscrito",Superscript:"Sobrescrito",Underline:"Sublinhado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js new file mode 100644 index 000000000..e637c8268 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js @@ -0,0 +1 @@ +!function(i){const o=i.pt=i.pt||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Negrito",Code:"Código",Italic:"Itálico",Strikethrough:"Riscado",Subscript:"Subscrito",Superscript:"Sobrescrito",Underline:"Sublinhado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js new file mode 100644 index 000000000..fe9daad0e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js @@ -0,0 +1 @@ +!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Îngroșat",Code:"Cod",Italic:"Cursiv",Strikethrough:"Tăiere text cu o linie",Subscript:"Indice",Superscript:"Exponent",Underline:"Subliniat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js new file mode 100644 index 000000000..d7c6c1644 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js @@ -0,0 +1 @@ +!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Жирный",Code:"Исходный код",Italic:"Курсив",Strikethrough:"Зачеркнутый",Subscript:"Подстрочный",Superscript:"Надстрочный",Underline:"Подчеркнутый"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/si.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/si.js new file mode 100644 index 000000000..10755aa9a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/si.js @@ -0,0 +1 @@ +!function(i){const n=i.si=i.si||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"තදකුරු",Code:"",Italic:"ඇලකුරු",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js new file mode 100644 index 000000000..d530d7fd4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js @@ -0,0 +1 @@ +!function(n){const i=n.sk=n.sk||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tučné",Code:"Kód",Italic:"Kurzíva",Strikethrough:"Preškrtnuté",Subscript:"Dolný index",Superscript:"Horný index",Underline:"Podčiarknuté"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js new file mode 100644 index 000000000..59357ea51 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js @@ -0,0 +1 @@ +!function(o){const i=o.sl=o.sl||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Krepko",Code:"Koda",Italic:"Poševno",Strikethrough:"Prečrtano",Subscript:"Naročnik",Superscript:"Nadpis",Underline:"Podčrtaj"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js new file mode 100644 index 000000000..45e8f3622 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js @@ -0,0 +1 @@ +!function(i){const n=i.sq=i.sq||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Trash",Code:"Kod",Italic:"Pjerrtë",Strikethrough:"Vi në mes",Subscript:"",Superscript:"",Underline:"Nënvizuar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js new file mode 100644 index 000000000..b521dffa7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js @@ -0,0 +1 @@ +!function(n){const o=n["sr-latn"]=n["sr-latn"]||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano",Code:"Kod",Italic:"Kurziv",Strikethrough:"Precrtan",Subscript:"Index dole",Superscript:"Index gore",Underline:"Podvučen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js new file mode 100644 index 000000000..63fe2c5db --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js @@ -0,0 +1 @@ +!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Подебљано",Code:"Код",Italic:"Курзив",Strikethrough:"Прецртан",Subscript:"Индекс доле",Superscript:"Индекс горе",Underline:"Подвучен"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js new file mode 100644 index 000000000..e83d7c45d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js @@ -0,0 +1 @@ +!function(n){const t=n.sv=n.sv||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fet",Code:"Kod",Italic:"Kursiv",Strikethrough:"Genomstruken",Subscript:"Nedsänkta tecken",Superscript:"Upphöjda tecken",Underline:"Understrykning"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/th.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/th.js new file mode 100644 index 000000000..8ed9300bd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/th.js @@ -0,0 +1 @@ +!function(i){const t=i.th=i.th||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"ตัวหนา",Code:"โค้ด",Italic:"ตัวเอียง",Strikethrough:"ขีดทับ",Subscript:"ตัวห้อย",Superscript:"ตัวยก",Underline:"ขีดเส้นใต้"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js new file mode 100644 index 000000000..cee05efb1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js @@ -0,0 +1 @@ +!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Galyň",Code:"Kod",Italic:"Italik",Strikethrough:"Üsti çyzykly",Subscript:"Aşaky ýazgy",Superscript:"Üst ýazgy",Underline:"Aşagy çyzykly"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js new file mode 100644 index 000000000..b6f74b7aa --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js @@ -0,0 +1 @@ +!function(i){const t=i.tr=i.tr||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Kalın",Code:"Kod",Italic:"İtalik",Strikethrough:"Üstü çizili",Subscript:"Alt Simge",Superscript:"Üst Simge",Underline:"Altı Çizgili"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js new file mode 100644 index 000000000..ac7d76a24 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js @@ -0,0 +1 @@ +!function(t){const i=t.tt=t.tt||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Калын",Code:"Код",Italic:"",Strikethrough:"",Subscript:"",Superscript:"",Underline:""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js new file mode 100644 index 000000000..00081a4ca --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js @@ -0,0 +1 @@ +!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"توم",Code:"كود",Italic:"يانتۇ",Strikethrough:"ئۆچۈرۈش سىزىقى",Subscript:"ئاستبەلگە",Superscript:"ئۈستبەلگە",Underline:"ئاستى سىزىق"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js new file mode 100644 index 000000000..8874594f2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js @@ -0,0 +1 @@ +!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Жирний",Code:"Код",Italic:"Курсив",Strikethrough:"Закреслений",Subscript:"Нижній індекс",Superscript:"Верхній індекс",Underline:"Підкреслений"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js new file mode 100644 index 000000000..f49125e36 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js @@ -0,0 +1 @@ +!function(i){const n=i.ur=i.ur||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"جلّی",Code:"کوڈ",Italic:"ترچھا",Strikethrough:"خط کشیدہ",Subscript:"زير نوشت",Superscript:"بالا نوشت",Underline:"ترچھا"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js new file mode 100644 index 000000000..cf441de94 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js @@ -0,0 +1 @@ +!function(i){const n=i.uz=i.uz||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Qalin",Code:"Manba kodi",Italic:"Kursiv",Strikethrough:"Chizilgan",Subscript:"Pastki yozuv",Superscript:"Yuqori yozuv",Underline:"Tagi chizilgan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js new file mode 100644 index 000000000..b612d491c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js @@ -0,0 +1 @@ +!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Đậm",Code:"Code",Italic:"Nghiêng",Strikethrough:"Gạch ngang",Subscript:"Chữ nhỏ dưới",Superscript:"Chữ nhỏ trên",Underline:"Gạch dưới"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js new file mode 100644 index 000000000..f9f9a11f2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js @@ -0,0 +1 @@ +!function(i){const n=i["zh-cn"]=i["zh-cn"]||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"加粗",Code:"代码",Italic:"倾斜",Strikethrough:"删除线",Subscript:"下标",Superscript:"上标",Underline:"下划线"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js new file mode 100644 index 000000000..c7480eb8e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js @@ -0,0 +1 @@ +!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"粗體",Code:"代碼",Italic:"斜體",Strikethrough:"刪除線",Subscript:"下標",Superscript:"上標",Underline:"底線"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json new file mode 100644 index 000000000..91308e78f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json @@ -0,0 +1,137 @@ +{ + "plugins": [ + { + "name": "Bold", + "className": "Bold", + "description": "Implements bold formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/bold.js", + "uiComponents": [ + { + "type": "Button", + "name": "bold", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/bold.svg" + } + ], + "htmlOutput": [ + { + "elements": "strong" + } + ] + }, + { + "name": "Code", + "className": "Code", + "description": "Implements inline code formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/code.js", + "uiComponents": [ + { + "type": "Button", + "name": "code", + "iconPath": "theme/icons/code.svg" + } + ], + "htmlOutput": [ + { + "elements": "code" + } + ] + }, + { + "name": "Italic", + "className": "Italic", + "description": "Implements italic formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/italic.js", + "uiComponents": [ + { + "type": "Button", + "name": "italic", + "iconPath": "theme/icons/italic.svg" + } + ], + "htmlOutput": [ + { + "elements": "i" + } + ] + }, + { + "name": "Strikethrough", + "className": "Strikethrough", + "description": "Implements strikethrough formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/strikethrough.js", + "uiComponents": [ + { + "type": "Button", + "name": "strikethrough", + "iconPath": "theme/icons/strikethrough.svg" + } + ], + "htmlOutput": [ + { + "elements": "s" + } + ] + }, + { + "name": "Subscript", + "className": "Subscript", + "description": "Implements subscript formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/subscript.js", + "uiComponents": [ + { + "type": "Button", + "name": "subscript", + "iconPath": "theme/icons/subscript.svg" + } + ], + "htmlOutput": [ + { + "elements": "sub" + } + ] + }, + { + "name": "Superscript", + "className": "Superscript", + "description": "Implements superscript formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/superscript.js", + "uiComponents": [ + { + "type": "Button", + "name": "superscript", + "iconPath": "theme/icons/superscript.svg" + } + ], + "htmlOutput": [ + { + "elements": "sup" + } + ] + }, + { + "name": "Underline", + "className": "Underline", + "description": "Implements underline formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/underline.js", + "uiComponents": [ + { + "type": "Button", + "name": "underline", + "iconPath": "theme/icons/underline.svg" + } + ], + "htmlOutput": [ + { + "elements": "u" + } + ] + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/contexts.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/contexts.json new file mode 100644 index 000000000..6f0d9a8e6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/contexts.json @@ -0,0 +1,9 @@ +{ + "Bold": "Toolbar button tooltip for the Bold feature.", + "Italic": "Toolbar button tooltip for the Italic feature.", + "Underline": "Toolbar button tooltip for the Underline feature.", + "Code": "Toolbar button tooltip for the Code feature.", + "Strikethrough": "Toolbar button tooltip for the Strikethrough feature.", + "Subscript": "Toolbar button tooltip for the Subscript feature.", + "Superscript": "Toolbar button tooltip for the Superscript feature." +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po new file mode 100644 index 000000000..aac80fa99 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://www.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Vet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursief" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Onderstreep" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Bronkode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Deurstreep" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Onderskrif" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Boskrif" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po new file mode 100644 index 000000000..508f1ffe1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://www.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "عريض" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "مائل" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "تحته خط" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "شفرة برمجية" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "يتوسطه خط" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "حرف منخفض" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "حرف مرتفع" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po new file mode 100644 index 000000000..480348dcb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Asturian (https://www.transifex.com/ckeditor/teams/11143/ast/)\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrina" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po new file mode 100644 index 000000000..85d98c6ea --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://www.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Yarıqalın" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Maili" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Altdan xətt" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Qaralanmış" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alt yazı" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Üst yazı" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po new file mode 100644 index 000000000..2215766f9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://www.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Удебелен" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курсив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Подчертаване" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Зачертаване" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Долен индекс" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Горен индекс" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po new file mode 100644 index 000000000..181700b8f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://www.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "বোল্ড" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ইটালিক" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "আন্ডারলাইন" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "কোড" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "স্ট্রাইকথ্রু" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "সাবস্ক্রিপ্ট" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "সুপারস্ক্রিপ্ট" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po new file mode 100644 index 000000000..573814cb6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://www.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Podebljano" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Zakrivljeno" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podcrtano" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Precrtano" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po new file mode 100644 index 000000000..3c14fbcc9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://www.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negreta" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subrallat" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Codi" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Marcat" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndex" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndex" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po new file mode 100644 index 000000000..047f8a669 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://www.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tučné" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kurzíva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podtržené" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kódový blok" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Přeškrtnuté" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Dolní index" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Horní index" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po new file mode 100644 index 000000000..ec097ed44 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fed" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understreget" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gennemstreg" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Sænket skrift" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hævet skrift" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po new file mode 100644 index 000000000..e68d3a223 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://www.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fett" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Unterstrichen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Durchgestrichen" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Tiefgestellt" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hochgestellt" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po new file mode 100644 index 000000000..edeb33ea6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fett" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Unterstrichen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Durchgestrichen" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Tiefgestellt" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hochgestellt" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po new file mode 100644 index 000000000..eab450332 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Έντονα" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Πλάγια" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Υπογράμμιση" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Κώδικας" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Διακριτή διαγραφή" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Δείκτης" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Εκθέτης" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po new file mode 100644 index 000000000..3799f08c4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po new file mode 100644 index 000000000..a73dcbd46 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://www.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po new file mode 100644 index 000000000..0e74953b2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po new file mode 100644 index 000000000..17081b461 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Esperanto (https://www.transifex.com/ckeditor/teams/11143/eo/)\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "grasa" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "kursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po new file mode 100644 index 000000000..923e07de6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://www.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrita" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subrayado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tachado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndice" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po new file mode 100644 index 000000000..9773999f1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://www.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrita" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subrayado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tachado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndice" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po new file mode 100644 index 000000000..367a426af --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://www.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Rasvane" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kaldkiri" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Allajoonitud" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kood" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Läbijoonitud" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alaindeks" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Ülaindeks" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po new file mode 100644 index 000000000..9b082ddb5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://www.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Lodia" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Etzana" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Azpimarra" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kodea" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po new file mode 100644 index 000000000..0161b6685 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://www.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "درشت" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "کج" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "خط زیر" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "کد" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "خط خورده" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "پایین نویس" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "بالانویس" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po new file mode 100644 index 000000000..3ab9d2031 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Lihavointi" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursivointi" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Alleviivaus" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Koodi" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Yliviivaus" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alaindeksi" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Yläindeksi" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po new file mode 100644 index 000000000..c79874329 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Gras" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italique" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Souligné" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Barré" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Exposant" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po new file mode 100644 index 000000000..a0aa95c5f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negra" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Itálica" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subliñado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Riscado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndice" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po new file mode 100644 index 000000000..27cf384e2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Gujarati (https://www.transifex.com/ckeditor/teams/11143/gu/)\n" +"Language: gu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ઘાટુ - બોલ્ડ્" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ત્રાંસુ - ઇટલિક્" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "નીચે લિટી - અન્ડરલાઇન્" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po new file mode 100644 index 000000000..91a83eac7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://www.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "מודגש" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "נטוי" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "קו תחתון" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "קוד" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "קו חוצה" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "כתב תחתי" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "כתב עילי" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po new file mode 100644 index 000000000..d5c2b4de5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://www.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po new file mode 100644 index 000000000..586ac7fd5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Podebljano" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Ukošeno" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podcrtavanje" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Precrtano" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indeks" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Eksponent" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po new file mode 100644 index 000000000..64df88cc5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Félkövér" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Dőlt" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Aláhúzott" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Forráskód" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Áthúzott" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alsó index" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Felső index" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po new file mode 100644 index 000000000..a39b8735a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://www.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tebal" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Miring" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Garis bawah" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Coret" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subskrip" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superskrip" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po new file mode 100644 index 000000000..1f577bf6f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Grassetto" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Corsivo" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Sottolineato" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Codice" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Barrato" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Pedice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Apice" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po new file mode 100644 index 000000000..f74ef5209 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ボールド" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "イタリック" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "アンダーライン" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "コード" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "取り消し線" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "下付き文字" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "上付き文字" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po new file mode 100644 index 000000000..fcc9087a1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Javanese (https://www.transifex.com/ckeditor/teams/11143/jv/)\n" +"Language: jv\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Kandhel" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Miring" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Garis ngandhap" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Seratan dicoret" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po new file mode 100644 index 000000000..0c37fc477 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ដិត" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ទ្រេត" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "គូស​បន្ទាត់​ក្រោម" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "កូដ" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "ឆូតកណ្ដាល" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "អក្សរ​តូចក្រោម" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "អក្សរ​តូចលើ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po new file mode 100644 index 000000000..fa7e51964 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://www.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "‍‍ದಪ್ಪ" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "‍ಇಟಾಲಿಕ್" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po new file mode 100644 index 000000000..2fc25471d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://www.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "굵게" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "기울임꼴" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "밑줄" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "코드" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "취소선" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "아래 첨자" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "위 첨자" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po new file mode 100644 index 000000000..3e6d4a2ac --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "قەڵەو" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "لار" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ژێرهێڵ" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "کۆد" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "هێڵ بەسەرداهاتوو" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "ژێرنووس" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "سەرنووس" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po new file mode 100644 index 000000000..01148f835 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://www.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Paryškintas" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursyvas" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Pabrauktas" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kodas" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Perbrauktas" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Žemiau" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Aukščiau" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po new file mode 100644 index 000000000..0fedd542d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://www.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Trekns" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursīvs" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Pasvītrots" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kods" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Nosvītrots" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Apakšraksts" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Augšraksts" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po new file mode 100644 index 000000000..d5aa85843 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://www.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tebal" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italik" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Garis bawah" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Garis lorek" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subskrip" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superskrip" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po new file mode 100644 index 000000000..c8005fad4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understreking" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gjennomstreking" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po new file mode 100644 index 000000000..d736261c5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "बोल्ड" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "इटालिक" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "रेखांकन" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "कोड" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "स्ट्राइकथ्रू" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "सबस्क्रिप्ट" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "सुपरस्क्रिप्ट" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po new file mode 100644 index 000000000..0d33f1e23 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://www.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Vet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursief" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Onderlijnen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Doorhalen" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po new file mode 100644 index 000000000..b3b61c918 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://www.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understreket" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gjennomstreket" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Senket skrift" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hevet skrift" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po new file mode 100644 index 000000000..91b919015 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Occitan (post 1500) (https://www.transifex.com/ckeditor/teams/11143/oc/)\n" +"Language: oc\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Gras" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italica" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po new file mode 100644 index 000000000..687c4e693 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Pogrubienie" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursywa" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podkreślenie" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Przekreślenie" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indeks dolny" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Indeks górny" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po new file mode 100644 index 000000000..02357ae71 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrito" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Itálico" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Sublinhado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tachado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscrito" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Sobrescrito" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po new file mode 100644 index 000000000..fbd12a2b2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrito" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Itálico" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Sublinhado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Riscado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscrito" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Sobrescrito" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po new file mode 100644 index 000000000..cf0f0ea3a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Îngroșat" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subliniat" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Cod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tăiere text cu o linie" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Exponent" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po new file mode 100644 index 000000000..01fa7a09a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://www.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Жирный" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курсив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Подчеркнутый" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Исходный код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Зачеркнутый" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Подстрочный" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Надстрочный" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po new file mode 100644 index 000000000..288e33cdf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Sinhala (Sri Lanka) (https://www.transifex.com/ckeditor/teams/11143/si_LK/)\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "තදකුරු" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ඇලකුරු" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po new file mode 100644 index 000000000..2dcd6b93d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tučné" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kurzíva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podčiarknuté" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kód" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Preškrtnuté" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Dolný index" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Horný index" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po new file mode 100644 index 000000000..9da9debd8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://www.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Krepko" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Poševno" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podčrtaj" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Koda" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Prečrtano" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Naročnik" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Nadpis" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po new file mode 100644 index 000000000..a9dc04c24 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://www.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Trash" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Pjerrtë" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Nënvizuar" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Vi në mes" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po new file mode 100644 index 000000000..0715d1522 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://www.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Podebljano" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kurziv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podvučen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Precrtan" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Index dole" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Index gore" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po new file mode 100644 index 000000000..a2d78b056 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://www.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Подебљано" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курзив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Подвучен" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Прецртан" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Индекс доле" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Индекс горе" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po new file mode 100644 index 000000000..0a7416f09 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understrykning" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Genomstruken" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Nedsänkta tecken" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Upphöjda tecken" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po new file mode 100644 index 000000000..fe5c0d650 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://www.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ตัวหนา" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ตัวเอียง" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ขีดเส้นใต้" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "โค้ด" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "ขีดทับ" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "ตัวห้อย" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "ตัวยก" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po new file mode 100644 index 000000000..7592d3fcf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://www.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Galyň" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italik" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Aşagy çyzykly" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Üsti çyzykly" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Aşaky ýazgy" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Üst ýazgy" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po new file mode 100644 index 000000000..77b9c107b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Kalın" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "İtalik" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Altı Çizgili" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Üstü çizili" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alt Simge" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Üst Simge" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po new file mode 100644 index 000000000..067be84eb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Tatar (https://www.transifex.com/ckeditor/teams/11143/tt/)\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Калын" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po new file mode 100644 index 000000000..6ad97aeca --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://www.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "توم" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "يانتۇ" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ئاستى سىزىق" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "كود" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "ئۆچۈرۈش سىزىقى" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "ئاستبەلگە" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "ئۈستبەلگە" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po new file mode 100644 index 000000000..8a425043d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://www.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Жирний" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курсив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Підкреслений" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Закреслений" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Нижній індекс" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Верхній індекс" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po new file mode 100644 index 000000000..1b977804b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://www.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "جلّی" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ترچھا" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ترچھا" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "کوڈ" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "خط کشیدہ" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "زير نوشت" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "بالا نوشت" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po new file mode 100644 index 000000000..e0a1145fe --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://www.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Qalin" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Tagi chizilgan" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Manba kodi" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Chizilgan" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Pastki yozuv" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Yuqori yozuv" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po new file mode 100644 index 000000000..1779557ce --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://www.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Đậm" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Nghiêng" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Gạch dưới" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gạch ngang" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Chữ nhỏ dưới" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Chữ nhỏ trên" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po new file mode 100644 index 000000000..5a2c952fc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "加粗" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "倾斜" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "下划线" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "代码" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "删除线" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "下标" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "上标" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po new file mode 100644 index 000000000..9a2a6da23 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po @@ -0,0 +1,45 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "粗體" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "斜體" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "底線" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "代碼" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "刪除線" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "下標" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "上標" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/package.json new file mode 100644 index 000000000..614e19bdb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/package.json @@ -0,0 +1,58 @@ +{ + "name": "@ckeditor/ckeditor5-basic-styles", + "version": "36.0.1", + "description": "Basic styles feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "ckeditor5": "^36.0.1" + }, + "devDependencies": { + "@ckeditor/ckeditor5-core": "^36.0.1", + "@ckeditor/ckeditor5-dev-utils": "^32.0.0", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-engine": "^36.0.1", + "@ckeditor/ckeditor5-essentials": "^36.0.1", + "@ckeditor/ckeditor5-paragraph": "^36.0.1", + "@ckeditor/ckeditor5-theme-lark": "^36.0.1", + "@ckeditor/ckeditor5-ui": "^36.0.1", + "@ckeditor/ckeditor5-utils": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-basic-styles" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "dll:build": "webpack", + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js new file mode 100644 index 000000000..7b5a22934 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js @@ -0,0 +1,105 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/attributecommand + */ +import { Command } from 'ckeditor5/src/core'; +/** + * An extension of the base {@link module:core/command~Command} class, which provides utilities for a command + * that toggles a single attribute on a text or an element. + * + * `AttributeCommand` uses {@link module:engine/model/document~Document#selection} + * to decide which nodes (if any) should be changed, and applies or removes the attribute from them. + * + * The command checks the {@link module:engine/model/model~Model#schema} to decide if it can be enabled + * for the current selection and to which nodes the attribute can be applied. + */ +export default class AttributeCommand extends Command { + /** + * @param attributeKey Attribute that will be set by the command. + */ + constructor(editor, attributeKey) { + super(editor); + this.attributeKey = attributeKey; + } + /** + * Updates the command's {@link #value} and {@link #isEnabled} based on the current selection. + */ + refresh() { + const model = this.editor.model; + const doc = model.document; + this.value = this._getValueFromFirstAllowedNode(); + this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, this.attributeKey); + } + /** + * Executes the command — applies the attribute to the selection or removes it from the selection. + * + * If the command is active (`value == true`), it will remove attributes. Otherwise, it will set attributes. + * + * The execution result differs, depending on the {@link module:engine/model/document~Document#selection}: + * + * * If the selection is on a range, the command applies the attribute to all nodes in that range + * (if they are allowed to have this attribute by the {@link module:engine/model/schema~Schema schema}). + * * If the selection is collapsed in a non-empty node, the command applies the attribute to the + * {@link module:engine/model/document~Document#selection} itself (note that typed characters copy attributes from the selection). + * * If the selection is collapsed in an empty node, the command applies the attribute to the parent node of the selection (note + * that the selection inherits all attributes from a node if it is in an empty node). + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, + * the command will apply the attribute, otherwise the command will remove the attribute. + * If not set, the command will look for its current value to decide what it should do. + */ + execute(options = {}) { + const model = this.editor.model; + const doc = model.document; + const selection = doc.selection; + const value = (options.forceValue === undefined) ? !this.value : options.forceValue; + model.change(writer => { + if (selection.isCollapsed) { + if (value) { + writer.setSelectionAttribute(this.attributeKey, true); + } + else { + writer.removeSelectionAttribute(this.attributeKey); + } + } + else { + const ranges = model.schema.getValidRanges(selection.getRanges(), this.attributeKey); + for (const range of ranges) { + if (value) { + writer.setAttribute(this.attributeKey, value, range); + } + else { + writer.removeAttribute(this.attributeKey, range); + } + } + } + }); + } + /** + * Checks the attribute value of the first node in the selection that allows the attribute. + * For the collapsed selection returns the selection attribute. + * + * @returns The attribute value. + */ + _getValueFromFirstAllowedNode() { + const model = this.editor.model; + const schema = model.schema; + const selection = model.document.selection; + if (selection.isCollapsed) { + return selection.hasAttribute(this.attributeKey); + } + for (const range of selection.getRanges()) { + for (const item of range.getItems()) { + if (schema.checkAttribute(item, this.attributeKey)) { + return item.hasAttribute(this.attributeKey); + } + } + } + return false; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold.js new file mode 100644 index 000000000..966c5bd8e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold + */ +import { Plugin } from 'ckeditor5/src/core'; +import BoldEditing from './bold/boldediting'; +import BoldUI from './bold/boldui'; +/** + * The bold feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation} + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/bold/boldediting~BoldEditing bold editing feature} + * and {@link module:basic-styles/bold/boldui~BoldUI bold UI feature}. + */ +export default class Bold extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [BoldEditing, BoldUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Bold'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js new file mode 100644 index 000000000..97ec424fd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js @@ -0,0 +1,62 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold/boldediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AttributeCommand from '../attributecommand'; +const BOLD = 'bold'; +/** + * The bold editing feature. + * + * It registers the `'bold'` command and introduces the `bold` attribute in the model which renders to the view + * as a `` element. + */ +export default class BoldEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BoldEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow bold attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: BOLD }); + editor.model.schema.setAttributeProperties(BOLD, { + isFormatting: true, + copyOnEnter: true + }); + // Build converter from model to view for data and editing pipelines. + editor.conversion.attributeToElement({ + model: BOLD, + view: 'strong', + upcastAlso: [ + 'b', + viewElement => { + const fontWeight = viewElement.getStyle('font-weight'); + if (!fontWeight) { + return null; + } + // Value of the `font-weight` attribute can be defined as a string or a number. + if (fontWeight == 'bold' || Number(fontWeight) >= 600) { + return { + name: true, + styles: ['font-weight'] + }; + } + return null; + } + ] + }); + // Create bold command. + editor.commands.add(BOLD, new AttributeCommand(editor, BOLD)); + // Set the Ctrl+B keystroke. + editor.keystrokes.set('CTRL+B', BOLD); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js new file mode 100644 index 000000000..265833cfb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js @@ -0,0 +1,47 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold/boldui + */ +import { Plugin, icons } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +const BOLD = 'bold'; +/** + * The bold UI feature. It introduces the Bold button. + */ +export default class BoldUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BoldUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add bold button to feature components. + editor.ui.componentFactory.add(BOLD, locale => { + const command = editor.commands.get(BOLD); + const view = new ButtonView(locale); + view.set({ + label: t('Bold'), + icon: icons.bold, + keystroke: 'CTRL+B', + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(BOLD); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code.js new file mode 100644 index 000000000..ba6677b87 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code.js @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code + */ +import { Plugin } from 'ckeditor5/src/core'; +import CodeEditing from './code/codeediting'; +import CodeUI from './code/codeui'; +import '../theme/code.css'; +/** + * The code feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation} + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/code/codeediting~CodeEditing code editing feature} + * and {@link module:basic-styles/code/codeui~CodeUI code UI feature}. + */ +export default class Code extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [CodeEditing, CodeUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Code'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js new file mode 100644 index 000000000..f8120abf1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js @@ -0,0 +1,59 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code/codeediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import { TwoStepCaretMovement, inlineHighlight } from 'ckeditor5/src/typing'; +import AttributeCommand from '../attributecommand'; +const CODE = 'code'; +const HIGHLIGHT_CLASS = 'ck-code_selected'; +/** + * The code editing feature. + * + * It registers the `'code'` command and introduces the `code` attribute in the model which renders to the view + * as a `` element. + */ +export default class CodeEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'CodeEditing'; + } + /** + * @inheritDoc + */ + static get requires() { + return [TwoStepCaretMovement]; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow code attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: CODE }); + editor.model.schema.setAttributeProperties(CODE, { + isFormatting: true, + copyOnEnter: false + }); + editor.conversion.attributeToElement({ + model: CODE, + view: 'code', + upcastAlso: { + styles: { + 'word-wrap': 'break-word' + } + } + }); + // Create code command. + editor.commands.add(CODE, new AttributeCommand(editor, CODE)); + // Enable two-step caret movement for `code` attribute. + editor.plugins.get(TwoStepCaretMovement).registerAttribute(CODE); + // Setup highlight over selected element. + inlineHighlight(editor, CODE, 'code', HIGHLIGHT_CLASS); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js new file mode 100644 index 000000000..74db11487 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code/codeui + */ +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import codeIcon from '../../theme/icons/code.svg'; +import '../../theme/code.css'; +const CODE = 'code'; +/** + * The code UI feature. It introduces the Code button. + */ +export default class CodeUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'CodeUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add code button to feature components. + editor.ui.componentFactory.add(CODE, locale => { + const command = editor.commands.get(CODE); + const view = new ButtonView(locale); + view.set({ + label: t('Code'), + icon: codeIcon, + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(CODE); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/index.js new file mode 100644 index 000000000..dd5bb7b29 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/index.js @@ -0,0 +1,28 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles + */ +export { default as Bold } from './bold'; +export { default as BoldEditing } from './bold/boldediting'; +export { default as BoldUI } from './bold/boldui'; +export { default as Code } from './code'; +export { default as CodeEditing } from './code/codeediting'; +export { default as CodeUI } from './code/codeui'; +export { default as Italic } from './italic'; +export { default as ItalicEditing } from './italic/italicediting'; +export { default as ItalicUI } from './italic/italicui'; +export { default as Strikethrough } from './strikethrough'; +export { default as StrikethroughEditing } from './strikethrough/strikethroughediting'; +export { default as StrikethroughUI } from './strikethrough/strikethroughui'; +export { default as Subscript } from './subscript'; +export { default as SubscriptEditing } from './subscript/subscriptediting'; +export { default as SubscriptUI } from './subscript/subscriptui'; +export { default as Superscript } from './superscript'; +export { default as SuperscriptEditing } from './superscript/superscriptediting'; +export { default as SuperscriptUI } from './superscript/superscriptui'; +export { default as Underline } from './underline'; +export { default as UnderlineEditing } from './underline/underlineediting'; +export { default as UnderlineUI } from './underline/underlineui'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic.js new file mode 100644 index 000000000..70f37fc36 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic + */ +import { Plugin } from 'ckeditor5/src/core'; +import ItalicEditing from './italic/italicediting'; +import ItalicUI from './italic/italicui'; +/** + * The italic feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation} + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/italic/italicediting~ItalicEditing} and + * {@link module:basic-styles/italic/italicui~ItalicUI} plugins. + */ +export default class Italic extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [ItalicEditing, ItalicUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Italic'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js new file mode 100644 index 000000000..18ee9b9ba --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js @@ -0,0 +1,52 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic/italicediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AttributeCommand from '../attributecommand'; +const ITALIC = 'italic'; +/** + * The italic editing feature. + * + * It registers the `'italic'` command, the Ctrl+I keystroke and introduces the `italic` attribute in the model + * which renders to the view as an `` element. + */ +export default class ItalicEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'ItalicEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow italic attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: ITALIC }); + editor.model.schema.setAttributeProperties(ITALIC, { + isFormatting: true, + copyOnEnter: true + }); + editor.conversion.attributeToElement({ + model: ITALIC, + view: 'i', + upcastAlso: [ + 'em', + { + styles: { + 'font-style': 'italic' + } + } + ] + }); + // Create italic command. + editor.commands.add(ITALIC, new AttributeCommand(editor, ITALIC)); + // Set the Ctrl+I keystroke. + editor.keystrokes.set('CTRL+I', ITALIC); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js new file mode 100644 index 000000000..c1a9314aa --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic/italicui + */ +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import italicIcon from '../../theme/icons/italic.svg'; +const ITALIC = 'italic'; +/** + * The italic UI feature. It introduces the Italic button. + */ +export default class ItalicUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'ItalicUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add bold button to feature components. + editor.ui.componentFactory.add(ITALIC, locale => { + const command = editor.commands.get(ITALIC); + const view = new ButtonView(locale); + view.set({ + label: t('Italic'), + icon: italicIcon, + keystroke: 'CTRL+I', + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(ITALIC); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js new file mode 100644 index 000000000..81438e74b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough + */ +import { Plugin } from 'ckeditor5/src/core'; +import StrikethroughEditing from './strikethrough/strikethroughediting'; +import StrikethroughUI from './strikethrough/strikethroughui'; +/** + * The strikethrough feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation} + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/strikethrough/strikethroughediting~StrikethroughEditing} and + * {@link module:basic-styles/strikethrough/strikethroughui~StrikethroughUI} plugins. + */ +export default class Strikethrough extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [StrikethroughEditing, StrikethroughUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Strikethrough'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js new file mode 100644 index 000000000..1779ba604 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js @@ -0,0 +1,54 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough/strikethroughediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AttributeCommand from '../attributecommand'; +const STRIKETHROUGH = 'strikethrough'; +/** + * The strikethrough editing feature. + * + * It registers the `'strikethrough'` command, the Ctrl+Shift+X keystroke and introduces the + * `strikethroughsthrough` attribute in the model which renders to the view + * as a `` element. + */ +export default class StrikethroughEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'StrikethroughEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow strikethrough attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: STRIKETHROUGH }); + editor.model.schema.setAttributeProperties(STRIKETHROUGH, { + isFormatting: true, + copyOnEnter: true + }); + editor.conversion.attributeToElement({ + model: STRIKETHROUGH, + view: 's', + upcastAlso: [ + 'del', + 'strike', + { + styles: { + 'text-decoration': 'line-through' + } + } + ] + }); + // Create strikethrough command. + editor.commands.add(STRIKETHROUGH, new AttributeCommand(editor, STRIKETHROUGH)); + // Set the Ctrl+Shift+X keystroke. + editor.keystrokes.set('CTRL+SHIFT+X', 'strikethrough'); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js new file mode 100644 index 000000000..34e042c41 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough/strikethroughui + */ +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import strikethroughIcon from '../../theme/icons/strikethrough.svg'; +const STRIKETHROUGH = 'strikethrough'; +/** + * The strikethrough UI feature. It introduces the Strikethrough button. + */ +export default class StrikethroughUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'StrikethroughUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add strikethrough button to feature components. + editor.ui.componentFactory.add(STRIKETHROUGH, locale => { + const command = editor.commands.get(STRIKETHROUGH); + const view = new ButtonView(locale); + view.set({ + label: t('Strikethrough'), + icon: strikethroughIcon, + keystroke: 'CTRL+SHIFT+X', + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(STRIKETHROUGH); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript.js new file mode 100644 index 000000000..3bdb20f50 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript.js @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript + */ +import { Plugin } from 'ckeditor5/src/core'; +import SubscriptEditing from './subscript/subscriptediting'; +import SubscriptUI from './subscript/subscriptui'; +/** + * The subscript feature. + * + * It loads the {@link module:basic-styles/subscript/subscriptediting~SubscriptEditing} and + * {@link module:basic-styles/subscript/subscriptui~SubscriptUI} plugins. + */ +export default class Subscript extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [SubscriptEditing, SubscriptUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Subscript'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js new file mode 100644 index 000000000..8ef8576df --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript/subscriptediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AttributeCommand from '../attributecommand'; +const SUBSCRIPT = 'subscript'; +/** + * The subscript editing feature. + * + * It registers the `sub` command and introduces the `sub` attribute in the model which renders to the view + * as a `` element. + */ +export default class SubscriptEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SubscriptEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow sub attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: SUBSCRIPT }); + editor.model.schema.setAttributeProperties(SUBSCRIPT, { + isFormatting: true, + copyOnEnter: true + }); + // Build converter from model to view for data and editing pipelines. + editor.conversion.attributeToElement({ + model: SUBSCRIPT, + view: 'sub', + upcastAlso: [ + { + styles: { + 'vertical-align': 'sub' + } + } + ] + }); + // Create sub command. + editor.commands.add(SUBSCRIPT, new AttributeCommand(editor, SUBSCRIPT)); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js new file mode 100644 index 000000000..66631bbc0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js @@ -0,0 +1,47 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript/subscriptui + */ +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import subscriptIcon from '../../theme/icons/subscript.svg'; +const SUBSCRIPT = 'subscript'; +/** + * The subscript UI feature. It introduces the Subscript button. + */ +export default class SubscriptUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SubscriptUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add subscript button to feature components. + editor.ui.componentFactory.add(SUBSCRIPT, locale => { + const command = editor.commands.get(SUBSCRIPT); + const view = new ButtonView(locale); + view.set({ + label: t('Subscript'), + icon: subscriptIcon, + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(SUBSCRIPT); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript.js new file mode 100644 index 000000000..563550f69 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript.js @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript + */ +import { Plugin } from 'ckeditor5/src/core'; +import SuperscriptEditing from './superscript/superscriptediting'; +import SuperscriptUI from './superscript/superscriptui'; +/** + * The superscript feature. + * + * It loads the {@link module:basic-styles/superscript/superscriptediting~SuperscriptEditing} and + * {@link module:basic-styles/superscript/superscriptui~SuperscriptUI} plugins. + */ +export default class Superscript extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [SuperscriptEditing, SuperscriptUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Superscript'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js new file mode 100644 index 000000000..afd7cda60 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript/superscriptediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AttributeCommand from '../attributecommand'; +const SUPERSCRIPT = 'superscript'; +/** + * The superscript editing feature. + * + * It registers the `super` command and introduces the `super` attribute in the model which renders to the view + * as a `` element. + */ +export default class SuperscriptEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SuperscriptEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow super attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: SUPERSCRIPT }); + editor.model.schema.setAttributeProperties(SUPERSCRIPT, { + isFormatting: true, + copyOnEnter: true + }); + // Build converter from model to view for data and editing pipelines. + editor.conversion.attributeToElement({ + model: SUPERSCRIPT, + view: 'sup', + upcastAlso: [ + { + styles: { + 'vertical-align': 'super' + } + } + ] + }); + // Create super command. + editor.commands.add(SUPERSCRIPT, new AttributeCommand(editor, SUPERSCRIPT)); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js new file mode 100644 index 000000000..6ce6d4056 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js @@ -0,0 +1,47 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript/superscriptui + */ +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import superscriptIcon from '../../theme/icons/superscript.svg'; +const SUPERSCRIPT = 'superscript'; +/** + * The superscript UI feature. It introduces the Superscript button. + */ +export default class SuperscriptUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SuperscriptUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add superscript button to feature components. + editor.ui.componentFactory.add(SUPERSCRIPT, locale => { + const command = editor.commands.get(SUPERSCRIPT); + const view = new ButtonView(locale); + view.set({ + label: t('Superscript'), + icon: superscriptIcon, + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(SUPERSCRIPT); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline.js new file mode 100644 index 000000000..430336fe0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline + */ +import { Plugin } from 'ckeditor5/src/core'; +import UnderlineEditing from './underline/underlineediting'; +import UnderlineUI from './underline/underlineui'; +/** + * The underline feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature documentation} + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/underline/underlineediting~UnderlineEditing} and + * {@link module:basic-styles/underline/underlineui~UnderlineUI} plugins. + */ +export default class Underline extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [UnderlineEditing, UnderlineUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Underline'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js new file mode 100644 index 000000000..f83c1f905 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js @@ -0,0 +1,49 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline/underlineediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import AttributeCommand from '../attributecommand'; +const UNDERLINE = 'underline'; +/** + * The underline editing feature. + * + * It registers the `'underline'` command, the Ctrl+U keystroke + * and introduces the `underline` attribute in the model which renders to the view as an `` element. + */ +export default class UnderlineEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'UnderlineEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow strikethrough attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: UNDERLINE }); + editor.model.schema.setAttributeProperties(UNDERLINE, { + isFormatting: true, + copyOnEnter: true + }); + editor.conversion.attributeToElement({ + model: UNDERLINE, + view: 'u', + upcastAlso: { + styles: { + 'text-decoration': 'underline' + } + } + }); + // Create underline command. + editor.commands.add(UNDERLINE, new AttributeCommand(editor, UNDERLINE)); + // Set the Ctrl+U keystroke. + editor.keystrokes.set('CTRL+U', 'underline'); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js new file mode 100644 index 000000000..d0b5d5782 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline/underlineui + */ +import { Plugin } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import underlineIcon from '../../theme/icons/underline.svg'; +const UNDERLINE = 'underline'; +/** + * The underline UI feature. It introduces the Underline button. + */ +export default class UnderlineUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'UnderlineUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Add bold button to feature components. + editor.ui.componentFactory.add(UNDERLINE, locale => { + const command = editor.commands.get(UNDERLINE); + const view = new ButtonView(locale); + view.set({ + label: t('Underline'), + icon: underlineIcon, + keystroke: 'CTRL+U', + tooltip: true, + isToggleable: true + }); + view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(view, 'execute', () => { + editor.execute(UNDERLINE); + editor.editing.view.focus(); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/code.css b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/code.css new file mode 100644 index 000000000..e7769a7a8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/code.css @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content code { + background-color: hsla(0, 0%, 78%, 0.3); + padding: .15em; + border-radius: 2px; +} + +.ck.ck-editor__editable .ck-code_selected { + background-color: hsla(0, 0%, 78%, 0.5); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg new file mode 100644 index 000000000..0cd08e178 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg new file mode 100644 index 000000000..efd83d1de --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg new file mode 100644 index 000000000..9b307bc02 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg new file mode 100644 index 000000000..0cb413e9c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg new file mode 100644 index 000000000..92b5eb1d1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg new file mode 100644 index 000000000..149b64fa5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/CHANGELOG.md new file mode 100644 index 000000000..a8e5f240d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/CHANGELOG.md @@ -0,0 +1,204 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v18.0.0...v19.0.0) (2020-04-29) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v17.0.0...v18.0.0) (2020-03-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v16.0.0...v17.0.0) (2020-02-18) + +### Bug fixes + +* Focus the editor before executing toolbar buttons' command. See [ckeditor/ckeditor5#353](https://github.com/ckeditor/ckeditor5/issues/353). ([4223ff2](https://github.com/ckeditor/ckeditor5-block-quote/commit/4223ff2)) + +### Other changes + +* Updated translations. ([77fbbad](https://github.com/ckeditor/ckeditor5-block-quote/commit/77fbbad)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Other changes + +* Updated translations. ([e49b7b0](https://github.com/ckeditor/ckeditor5-block-quote/commit/e49b7b0)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.3...v15.0.0) (2019-10-23) + +### Other changes + +* Add `pluginName` property to editing plugins. ([3d6b419](https://github.com/ckeditor/ckeditor5-block-quote/commit/3d6b419)) +* Updated translations. ([47acb53](https://github.com/ckeditor/ckeditor5-block-quote/commit/47acb53)) + + +## [11.1.3](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.2...v11.1.3) (2019-08-26) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([aa24686](https://github.com/ckeditor/ckeditor5-block-quote/commit/aa24686)) + +### Other changes + +* Adjusted blockquote content styles for better compatibility with RTL languages. See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([c48b703](https://github.com/ckeditor/ckeditor5-block-quote/commit/c48b703)) +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([ffcbcfc](https://github.com/ckeditor/ckeditor5-block-quote/commit/ffcbcfc)) +* Updated translations. ([537f761](https://github.com/ckeditor/ckeditor5-block-quote/commit/537f761)) + + +## [11.1.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.1...v11.1.2) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.0...v11.1.1) (2019-07-04) + +### Other changes + +* Updated translations. ([3ab78f2](https://github.com/ckeditor/ckeditor5-block-quote/commit/3ab78f2)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.0.1...v11.1.0) (2019-06-05) + +### Features + +* Added possibility to force quoting or un-quoting in `execute()`. Closes: [#35](https://github.com/ckeditor/ckeditor5-block-quote/issues/35). ([e9a5027](https://github.com/ckeditor/ckeditor5-block-quote/commit/e9a5027)) + +### Other changes + +* Updated translations. ([eb15fc6](https://github.com/ckeditor/ckeditor5-block-quote/commit/eb15fc6)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.0.0...v11.0.1) (2019-04-10) + +### Other changes + +* Updated translations. ([c524349](https://github.com/ckeditor/ckeditor5-block-quote/commit/c524349)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.1.1...v11.0.0) (2019-02-28) + +### Other changes + +* Make `BlockQuoteCommand` wrap only top-most blocks. ([17c9d3b](https://github.com/ckeditor/ckeditor5-block-quote/commit/17c9d3b)) +* Updated translations. ([f452b45](https://github.com/ckeditor/ckeditor5-block-quote/commit/f452b45)) ([8d8fde2](https://github.com/ckeditor/ckeditor5-block-quote/commit/8d8fde2)) ([cb7ec44](https://github.com/ckeditor/ckeditor5-block-quote/commit/cb7ec44)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.1.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.1.0...v10.1.1) (2018-12-05) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.0.2...v10.1.0) (2018-10-08) + +### Features + +* Implemented a post-fixer for cleaning incorrect blockquotes. ([fcb00c0](https://github.com/ckeditor/ckeditor5-block-quote/commit/fcb00c0)) + +### Other changes + +* Updated translations. ([a0078f3](https://github.com/ckeditor/ckeditor5-block-quote/commit/a0078f3)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.0.1...v10.0.2) (2018-07-18) + +### Other changes + +* Updated translations. ([170a8fd](https://github.com/ckeditor/ckeditor5-block-quote/commit/170a8fd)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.0.0...v10.0.1) (2018-06-21) + +### Other changes + +* Updated translations. ([4a51fd8](https://github.com/ckeditor/ckeditor5-block-quote/commit/4a51fd8)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([a4fa6e7](https://github.com/ckeditor/ckeditor5-block-quote/commit/a4fa6e7)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +### Bug fixes + +* The outline of a quoted image should not be cropped. Closes [#15](https://github.com/ckeditor/ckeditor5-block-quote/issues/15). ([1512135](https://github.com/ckeditor/ckeditor5-block-quote/commit/1512135)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +### Other changes + +* Aligned feature class naming to the new scheme. ([cc723c3](https://github.com/ckeditor/ckeditor5-block-quote/commit/cc723c3)) +* Migrated package styles to PostCSS. Moved the visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([c973931](https://github.com/ckeditor/ckeditor5-block-quote/commit/c973931)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +### Other changes + +* Updated translations. ([e150fe2](https://github.com/ckeditor/ckeditor5-block-quote/commit/e150fe2)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v0.2.0...v1.0.0-alpha.1) (2017-10-03) + +### Other changes + +* Improved default blockquote styling so it does not overlap with floated images. Closes [#12](https://github.com/ckeditor/ckeditor5-block-quote/issues/12). ([fb09418](https://github.com/ckeditor/ckeditor5-block-quote/commit/fb09418)) + + +## [0.2.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v0.1.1...v0.2.0) (2017-09-03) + +### Features + +* Enter in the block quote will scroll the viewport to the selection. See ckeditor/ckeditor5-engine#660. ([09dc740](https://github.com/ckeditor/ckeditor5-block-quote/commit/09dc740)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([627510a](https://github.com/ckeditor/ckeditor5-block-quote/commit/627510a)) + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.1.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v0.1.0...v0.1.1) (2017-05-07) + +### Bug fixes + +* Block quote should not be applied to image's caption. Closes: [#10](https://github.com/ckeditor/ckeditor5-block-quote/issues/10). ([06de874](https://github.com/ckeditor/ckeditor5-block-quote/commit/06de874)) + +### Other changes + +* Updated translations. ([5e23f86](https://github.com/ckeditor/ckeditor5-block-quote/commit/5e23f86)) + + +## 0.1.0 (2017-04-05) + +### Features + +* Introduced the block quote feature. Closes [#1](https://github.com/ckeditor/ckeditor5-block-quote/issues/1). ([239015b](https://github.com/ckeditor/ckeditor5-block-quote/commit/239015b)) diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/LICENSE.md new file mode 100644 index 000000000..3df2186c0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 block quote feature** – https://github.com/ckeditor/ckeditor5-block-quote
    +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/README.md new file mode 100644 index 000000000..1c7045a12 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/README.md @@ -0,0 +1,21 @@ +CKEditor 5 block quote feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-block-quote.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-block-quote) + +This package implements block quote support for CKEditor 5. + +## Demo + +Check out the [demo in the block quote feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/block-quote.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-block-quote` package](https://ckeditor.com/docs/ckeditor5/latest/api/block-quote.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/block-quote.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/block-quote.js new file mode 100644 index 000000000..cf7f8bf4c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/block-quote.js @@ -0,0 +1,5 @@ +!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var e={446:(e,t,o)=>{"use strict";o.d(t,{Z:()=>i});var n=o(609),r=o.n(n)()((function(e){return e[1]}));r.push([e.id,".ck-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}",""]);const i=r},609:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var o=e(t);return t[2]?"@media ".concat(t[2]," {").concat(o,"}"):o})).join("")},t.i=function(e,o,n){"string"==typeof e&&(e=[[null,e,""]]);var r={};if(n)for(var i=0;i{"use strict";var n,r=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},i=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),c=[];function s(e){for(var t=-1,o=0;o{e.exports=o(79)("./src/core.js")},331:(e,t,o)=>{e.exports=o(79)("./src/enter.js")},181:(e,t,o)=>{e.exports=o(79)("./src/typing.js")},273:(e,t,o)=>{e.exports=o(79)("./src/ui.js")},209:(e,t,o)=>{e.exports=o(79)("./src/utils.js")},79:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={id:n,exports:{}};return e[n](i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},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.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nc=void 0;var n={};(()=>{"use strict";o.r(n),o.d(n,{BlockQuote:()=>g,BlockQuoteEditing:()=>u,BlockQuoteUI:()=>v});var e=o(704),t=o(331),r=o(181),i=o(209);class c extends e.Command{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,o=t.schema,n=t.document.selection,r=Array.from(n.getSelectedBlocks()),i=void 0===e.forceValue?!this.value:e.forceValue;t.change((e=>{if(i){const t=r.filter((e=>s(e)||a(o,e)));this._applyQuote(e,t)}else this._removeQuote(e,r.filter(s))}))}_getValue(){const e=this.editor.model.document.selection,t=(0,i.first)(e.getSelectedBlocks());return!(!t||!s(t))}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,o=(0,i.first)(e.getSelectedBlocks());return!!o&&a(t,o)}_removeQuote(e,t){l(e,t).reverse().forEach((t=>{if(t.start.isAtStart&&t.end.isAtEnd)return void e.unwrap(t.start.parent);if(t.start.isAtStart){const o=e.createPositionBefore(t.start.parent);return void e.move(t,o)}t.end.isAtEnd||e.split(t.end);const o=e.createPositionAfter(t.end.parent);e.move(t,o)}))}_applyQuote(e,t){const o=[];l(e,t).reverse().forEach((t=>{let n=s(t.start);n||(n=e.createElement("blockQuote"),e.wrap(t,n)),o.push(n)})),o.reverse().reduce(((t,o)=>t.nextSibling==o?(e.merge(e.createPositionAfter(t)),t):o))}}function s(e){return"blockQuote"==e.parent.name?e.parent:null}function l(e,t){let o,n=0;const r=[];for(;n{const n=e.model.document.differ.getChanges();for(const e of n)if("insert"==e.type){const n=e.position.nodeAfter;if(!n)continue;if(n.is("element","blockQuote")&&n.isEmpty)return o.remove(n),!0;if(n.is("element","blockQuote")&&!t.checkChild(e.position,n))return o.unwrap(n),!0;if(n.is("element")){const e=o.createRangeIn(n);for(const n of e.getItems())if(n.is("element","blockQuote")&&!t.checkChild(o.createPositionBefore(n),n))return o.unwrap(n),!0}}else if("remove"==e.type){const t=e.position.parent;if(t.is("element","blockQuote")&&t.isEmpty)return o.remove(t),!0}return!1}));const o=this.editor.editing.view.document,n=e.model.document.selection,r=e.commands.get("blockQuote");this.listenTo(o,"enter",((t,o)=>{if(!n.isCollapsed||!r.value)return;n.getLastPosition().parent.isEmpty&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),o.preventDefault(),t.stop())}),{context:"blockquote"}),this.listenTo(o,"delete",((t,o)=>{if("backward"!=o.direction||!n.isCollapsed||!r.value)return;const i=n.getLastPosition().parent;i.isEmpty&&!i.previousSibling&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),o.preventDefault(),t.stop())}),{context:"blockquote"})}}var d=o(273),f=o(62),p=o.n(f),m=o(446),h={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};p()(m.Z,h);m.Z.locals;class v extends e.Plugin{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor,o=t.t;t.ui.componentFactory.add("blockQuote",(n=>{const r=t.commands.get("blockQuote"),i=new d.ButtonView(n);return i.set({label:o("Block quote"),icon:e.icons.quote,tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute("blockQuote"),t.editing.view.focus()})),i}))}}class g extends e.Plugin{static get requires(){return[u,v]}static get pluginName(){return"BlockQuote"}}})(),(window.CKEditor5=window.CKEditor5||{}).blockQuote=n})(); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/af.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/af.js new file mode 100644 index 000000000..e35bd01a6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/af.js @@ -0,0 +1 @@ +!function(n){const i=n.af=n.af||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Verwysingsaanhaling"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ar.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ar.js new file mode 100644 index 000000000..a6df1fefb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ar.js @@ -0,0 +1 @@ +!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"اقتباس"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/az.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/az.js new file mode 100644 index 000000000..22158de92 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/az.js @@ -0,0 +1 @@ +!function(i){const o=i.az=i.az||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Sitat bloku"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bg.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bg.js new file mode 100644 index 000000000..f8b2a459a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bg.js @@ -0,0 +1 @@ +!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bn.js new file mode 100644 index 000000000..7b319b2ac --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bn.js @@ -0,0 +1 @@ +!function(n){const i=n.bn=n.bn||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"ব্লক কোট"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bs.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bs.js new file mode 100644 index 000000000..0a20b7167 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/bs.js @@ -0,0 +1 @@ +!function(i){const n=i.bs=i.bs||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ca.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ca.js new file mode 100644 index 000000000..e3f5bfd42 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ca.js @@ -0,0 +1 @@ +!function(c){const i=c.ca=c.ca||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cita de bloc"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/cs.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/cs.js new file mode 100644 index 000000000..6bf6efd96 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/cs.js @@ -0,0 +1 @@ +!function(c){const i=c.cs=c.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citace"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/da.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/da.js new file mode 100644 index 000000000..517b5cb29 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/da.js @@ -0,0 +1 @@ +!function(i){const o=i.da=i.da||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blot citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js new file mode 100644 index 000000000..d021ce37f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js @@ -0,0 +1 @@ +!function(c){const i=c["de-ch"]=c["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/de.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/de.js new file mode 100644 index 000000000..5bafd444b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/de.js @@ -0,0 +1 @@ +!function(i){const o=i.de=i.de||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/el.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/el.js new file mode 100644 index 000000000..2e7cea930 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/el.js @@ -0,0 +1 @@ +!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Περιοχή παράθεσης"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js new file mode 100644 index 000000000..a44520cf4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js @@ -0,0 +1 @@ +!function(n){const o=n["en-au"]=n["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js new file mode 100644 index 000000000..3fd172f1d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js @@ -0,0 +1 @@ +!function(n){const o=n["en-gb"]=n["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js new file mode 100644 index 000000000..370b102e9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js @@ -0,0 +1 @@ +!function(o){const i=o["es-co"]=o["es-co"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/es.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/es.js new file mode 100644 index 000000000..cea535613 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/es.js @@ -0,0 +1 @@ +!function(i){const o=i.es=i.es||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/et.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/et.js new file mode 100644 index 000000000..2a02d6ac8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/et.js @@ -0,0 +1 @@ +!function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Tsitaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/eu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/eu.js new file mode 100644 index 000000000..80be33cc5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/eu.js @@ -0,0 +1 @@ +!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Aipua"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fa.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fa.js new file mode 100644 index 000000000..f508a1072 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fa.js @@ -0,0 +1 @@ +!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" بلوک نقل قول"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fi.js new file mode 100644 index 000000000..173289c17 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fi.js @@ -0,0 +1 @@ +!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Lainaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fr.js new file mode 100644 index 000000000..002cb154b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/fr.js @@ -0,0 +1 @@ +!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citation"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/gl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/gl.js new file mode 100644 index 000000000..943c041c3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/gl.js @@ -0,0 +1 @@ +!function(i){const o=i.gl=i.gl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/gu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/gu.js new file mode 100644 index 000000000..2ead639c5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/gu.js @@ -0,0 +1 @@ +!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" વિચાર ટાંકો"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/he.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/he.js new file mode 100644 index 000000000..3b7116281 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/he.js @@ -0,0 +1 @@ +!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"בלוק ציטוט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hi.js new file mode 100644 index 000000000..02ad5ca21 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hi.js @@ -0,0 +1 @@ +!function(i){const o=i.hi=i.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hr.js new file mode 100644 index 000000000..98514f628 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hr.js @@ -0,0 +1 @@ +!function(i){const o=i.hr=i.hr||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blok citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hu.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hu.js new file mode 100644 index 000000000..a7f2c85d2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/hu.js @@ -0,0 +1 @@ +!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Idézet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/id.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/id.js new file mode 100644 index 000000000..061777fb2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/id.js @@ -0,0 +1 @@ +!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Kutipan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/it.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/it.js new file mode 100644 index 000000000..aaa70543c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/it.js @@ -0,0 +1 @@ +!function(i){const o=i.it=i.it||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blocco citazione"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ja.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ja.js new file mode 100644 index 000000000..7978b9f57 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ja.js @@ -0,0 +1 @@ +!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ブロッククオート(引用)"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/km.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/km.js new file mode 100644 index 000000000..d6dcaafaa --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/km.js @@ -0,0 +1 @@ +!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ប្លុក​ពាក្យ​សម្រង់"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/kn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/kn.js new file mode 100644 index 000000000..47f43c7c4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/kn.js @@ -0,0 +1 @@ +!function(n){const i=n.kn=n.kn||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ko.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ko.js new file mode 100644 index 000000000..3ed928318 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ko.js @@ -0,0 +1 @@ +!function(o){const i=o.ko=o.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"인용 단락"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ku.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ku.js new file mode 100644 index 000000000..a0a5d055c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ku.js @@ -0,0 +1 @@ +!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"وتەی وەرگیراو"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/lt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/lt.js new file mode 100644 index 000000000..e7a9e1a53 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/lt.js @@ -0,0 +1 @@ +!function(t){const i=t.lt=t.lt||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citata"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/lv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/lv.js new file mode 100644 index 000000000..aa8716973 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/lv.js @@ -0,0 +1 @@ +!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citāts"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ms.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ms.js new file mode 100644 index 000000000..384ac23cf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ms.js @@ -0,0 +1 @@ +!function(i){const n=i.ms=i.ms||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Blok petikan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/nb.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/nb.js new file mode 100644 index 000000000..8b6ff6f44 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/nb.js @@ -0,0 +1 @@ +!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ne.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ne.js new file mode 100644 index 000000000..3f9e689b3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ne.js @@ -0,0 +1 @@ +!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"ब्लक उद्धरण"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/nl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/nl.js new file mode 100644 index 000000000..510449366 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/nl.js @@ -0,0 +1 @@ +!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blok citaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/no.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/no.js new file mode 100644 index 000000000..92ac6331d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/no.js @@ -0,0 +1 @@ +!function(o){const n=o.no=o.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pl.js new file mode 100644 index 000000000..db1f5a83e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pl.js @@ -0,0 +1 @@ +!function(o){const i=o.pl=o.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cytat blokowy"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js new file mode 100644 index 000000000..5e48dbeeb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js @@ -0,0 +1 @@ +!function(o){const i=o["pt-br"]=o["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloco de citação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pt.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pt.js new file mode 100644 index 000000000..2c3449ef7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/pt.js @@ -0,0 +1 @@ +!function(o){const i=o.pt=o.pt||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloco de citação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ro.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ro.js new file mode 100644 index 000000000..d6671e1de --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ro.js @@ -0,0 +1 @@ +!function(o){const i=o.ro=o.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloc citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ru.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ru.js new file mode 100644 index 000000000..459160811 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ru.js @@ -0,0 +1 @@ +!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sk.js new file mode 100644 index 000000000..6ccea39c5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sk.js @@ -0,0 +1 @@ +!function(i){const n=i.sk=i.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citát"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sl.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sl.js new file mode 100644 index 000000000..dd31080f3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sl.js @@ -0,0 +1 @@ +!function(i){const o=i.sl=i.sl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blokiraj citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sq.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sq.js new file mode 100644 index 000000000..1e47d0253 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sq.js @@ -0,0 +1 @@ +!function(n){const o=n.sq=n.sq||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Thonjëzat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js new file mode 100644 index 000000000..b630bc6d2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js @@ -0,0 +1 @@ +!function(n){const t=n["sr-latn"]=n["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sr.js new file mode 100644 index 000000000..516a7a887 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sr.js @@ -0,0 +1 @@ +!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sv.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sv.js new file mode 100644 index 000000000..e2a086904 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/sv.js @@ -0,0 +1 @@ +!function(i){const o=i.sv=i.sv||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockcitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/th.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/th.js new file mode 100644 index 000000000..2305940d4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/th.js @@ -0,0 +1 @@ +!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"คำพูดบล็อก"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/tk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/tk.js new file mode 100644 index 000000000..98d5f3835 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/tk.js @@ -0,0 +1 @@ +!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Sitata blokirläň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/tr.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/tr.js new file mode 100644 index 000000000..afef9dabb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/tr.js @@ -0,0 +1 @@ +!function(n){const t=n.tr=n.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Alıntı"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ug.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ug.js new file mode 100644 index 000000000..41f4bff1d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ug.js @@ -0,0 +1 @@ +!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"نەقىل"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/uk.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/uk.js new file mode 100644 index 000000000..9678c6904 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/uk.js @@ -0,0 +1 @@ +!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ur.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ur.js new file mode 100644 index 000000000..be45717ee --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/ur.js @@ -0,0 +1 @@ +!function(i){const n=i.ur=i.ur||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"خانہ اقتباس"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/uz.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/uz.js new file mode 100644 index 000000000..af1a4af55 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/uz.js @@ -0,0 +1 @@ +!function(i){const o=i.uz=i.uz||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Iqtibos"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/vi.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/vi.js new file mode 100644 index 000000000..0593468cc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/vi.js @@ -0,0 +1 @@ +!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Trích dẫn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js new file mode 100644 index 000000000..8e83d4b0c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js @@ -0,0 +1 @@ +!function(n){const c=n["zh-cn"]=n["zh-cn"]||{};c.dictionary=Object.assign(c.dictionary||{},{"Block quote":"块引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/zh.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/zh.js new file mode 100644 index 000000000..0877dc5df --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/build/translations/zh.js @@ -0,0 +1 @@ +!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"段落引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json new file mode 100644 index 000000000..6668d4659 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json @@ -0,0 +1,23 @@ +{ + "plugins": [ + { + "name": "Block quote", + "className": "BlockQuote", + "description": "Implements the block quote support to easily include quotations and passages in the rich-text content.", + "docs": "features/block-quote.html", + "path": "src/blockquote.js", + "uiComponents": [ + { + "type": "Button", + "name": "blockQuote", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/quote.svg" + } + ], + "htmlOutput": [ + { + "elements": "blockquote" + } + ] + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/contexts.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/contexts.json new file mode 100644 index 000000000..163affa15 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/contexts.json @@ -0,0 +1,3 @@ +{ + "Block quote": "Toolbar button tooltip for the Block quote feature." +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/af.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/af.po new file mode 100644 index 000000000..e49ba32a0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/af.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://www.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Verwysingsaanhaling" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po new file mode 100644 index 000000000..8619604eb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://www.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "اقتباس" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/az.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/az.po new file mode 100644 index 000000000..36fb0534e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/az.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://www.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Sitat bloku" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po new file mode 100644 index 000000000..b55856162 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://www.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитат" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po new file mode 100644 index 000000000..825b2f759 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://www.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ব্লক কোট" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po new file mode 100644 index 000000000..038de0aae --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://www.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po new file mode 100644 index 000000000..3a8f32d78 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://www.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloc" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po new file mode 100644 index 000000000..167b438cf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://www.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citace" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/da.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/da.po new file mode 100644 index 000000000..267fc91d7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/da.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blot citat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po new file mode 100644 index 000000000..683ec5319 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://www.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockzitat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/de.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/de.po new file mode 100644 index 000000000..067b0f927 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/de.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockzitat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/el.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/el.po new file mode 100644 index 000000000..47f04e817 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/el.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Περιοχή παράθεσης" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po new file mode 100644 index 000000000..981e2f110 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po new file mode 100644 index 000000000..0b06b9ff1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://www.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en.po new file mode 100644 index 000000000..c2697ad4a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/en.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po new file mode 100644 index 000000000..d98b446ca --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://www.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/es.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/es.po new file mode 100644 index 000000000..b984ad66b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/es.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://www.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/et.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/et.po new file mode 100644 index 000000000..51b259b1e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/et.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://www.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Tsitaat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po new file mode 100644 index 000000000..e9f5ebc07 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://www.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Aipua" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po new file mode 100644 index 000000000..f751e4db2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://www.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr " بلوک نقل قول" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po new file mode 100644 index 000000000..32f6768b6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Lainaus" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po new file mode 100644 index 000000000..92ca49566 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citation" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po new file mode 100644 index 000000000..b6e054dce --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po new file mode 100644 index 000000000..8ed163acd --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Gujarati (https://www.transifex.com/ckeditor/teams/11143/gu/)\n" +"Language: gu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr " વિચાર ટાંકો" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/he.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/he.po new file mode 100644 index 000000000..d84f10a37 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/he.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://www.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "בלוק ציטוט" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po new file mode 100644 index 000000000..762e519ff --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://www.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po new file mode 100644 index 000000000..a24edc6ac --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok citat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po new file mode 100644 index 000000000..800eb57cf --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Idézet" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/id.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/id.po new file mode 100644 index 000000000..653037e09 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/id.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://www.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Kutipan" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/it.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/it.po new file mode 100644 index 000000000..19810caa6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/it.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blocco citazione" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po new file mode 100644 index 000000000..9739a5be1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ブロッククオート(引用)" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/km.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/km.po new file mode 100644 index 000000000..0890734f8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/km.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ប្លុក​ពាក្យ​សម្រង់" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po new file mode 100644 index 000000000..c6e8c6639 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://www.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po new file mode 100644 index 000000000..c4718db97 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://www.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "인용 단락" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po new file mode 100644 index 000000000..34831944d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "وتەی وەرگیراو" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po new file mode 100644 index 000000000..1bb58261b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://www.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citata" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po new file mode 100644 index 000000000..cd0598817 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://www.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citāts" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po new file mode 100644 index 000000000..1e99b49f1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://www.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok petikan" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po new file mode 100644 index 000000000..e5a0d7868 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokksitat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po new file mode 100644 index 000000000..88dce9ace --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ब्लक उद्धरण" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po new file mode 100644 index 000000000..4c3ddb2c7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://www.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok citaat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/no.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/no.po new file mode 100644 index 000000000..451673a26 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/no.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://www.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokksitat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po new file mode 100644 index 000000000..105f6c5d7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cytat blokowy" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po new file mode 100644 index 000000000..a105eba80 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloco de citação" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po new file mode 100644 index 000000000..ef4108497 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloco de citação" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po new file mode 100644 index 000000000..be5611038 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloc citat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po new file mode 100644 index 000000000..4a8e9b9fc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://www.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитата" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po new file mode 100644 index 000000000..d4f2b6a39 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citát" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po new file mode 100644 index 000000000..3d6a5210c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://www.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokiraj citat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po new file mode 100644 index 000000000..adf68ab55 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://www.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Thonjëzat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po new file mode 100644 index 000000000..4008f6ad4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://www.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po new file mode 100644 index 000000000..1a0fdb6b4 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://www.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитат" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po new file mode 100644 index 000000000..b229872c9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockcitat" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/th.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/th.po new file mode 100644 index 000000000..ce5ef92e8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/th.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://www.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "คำพูดบล็อก" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po new file mode 100644 index 000000000..0ff1c16b8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://www.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Sitata blokirläň" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po new file mode 100644 index 000000000..4029a650a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Alıntı" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po new file mode 100644 index 000000000..0f877f8ca --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://www.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "نەقىل" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po new file mode 100644 index 000000000..1d0c4f2af --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://www.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитата" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po new file mode 100644 index 000000000..303ea8c45 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://www.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "خانہ اقتباس" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po new file mode 100644 index 000000000..ffa4a38e6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://www.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Iqtibos" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po new file mode 100644 index 000000000..0c04f75c5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://www.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Trích dẫn" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po new file mode 100644 index 000000000..a96386895 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "块引用" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po new file mode 100644 index 000000000..fdfa49bf6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po @@ -0,0 +1,21 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "段落引用" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/package.json new file mode 100644 index 000000000..18a001296 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/package.json @@ -0,0 +1,62 @@ +{ + "name": "@ckeditor/ckeditor5-block-quote", + "version": "36.0.1", + "description": "Block quote feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "ckeditor5": "^36.0.1" + }, + "devDependencies": { + "@ckeditor/ckeditor5-basic-styles": "^36.0.1", + "@ckeditor/ckeditor5-core": "^36.0.1", + "@ckeditor/ckeditor5-dev-utils": "^32.0.0", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-engine": "^36.0.1", + "@ckeditor/ckeditor5-enter": "^36.0.1", + "@ckeditor/ckeditor5-heading": "^36.0.1", + "@ckeditor/ckeditor5-image": "^36.0.1", + "@ckeditor/ckeditor5-list": "^36.0.1", + "@ckeditor/ckeditor5-paragraph": "^36.0.1", + "@ckeditor/ckeditor5-table": "^36.0.1", + "@ckeditor/ckeditor5-theme-lark": "^36.0.1", + "@ckeditor/ckeditor5-typing": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-block-quote" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "dll:build": "webpack", + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquote.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquote.js new file mode 100644 index 000000000..63c89dd8a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquote.js @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquote + */ +import { Plugin } from 'ckeditor5/src/core'; +import BlockQuoteEditing from './blockquoteediting'; +import BlockQuoteUI from './blockquoteui'; +/** + * The block quote plugin. + * + * For more information about this feature check the {@glink api/block-quote package page}. + * + * This is a "glue" plugin which loads the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature} + * and {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuote extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [BlockQuoteEditing, BlockQuoteUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockQuote'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js new file mode 100644 index 000000000..918e72a37 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js @@ -0,0 +1,172 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquotecommand + */ +import { Command } from 'ckeditor5/src/core'; +import { first } from 'ckeditor5/src/utils'; +/** + * The block quote command plugin. + * + * @extends module:core/command~Command + */ +export default class BlockQuoteCommand extends Command { + /** + * @inheritDoc + */ + refresh() { + this.value = this._getValue(); + this.isEnabled = this._checkEnabled(); + } + /** + * Executes the command. When the command {@link #value is on}, all top-most block quotes within + * the selection will be removed. If it is off, all selected blocks will be wrapped with + * a block quote. + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, + * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. + */ + execute(options = {}) { + const model = this.editor.model; + const schema = model.schema; + const selection = model.document.selection; + const blocks = Array.from(selection.getSelectedBlocks()); + const value = (options.forceValue === undefined) ? !this.value : options.forceValue; + model.change(writer => { + if (!value) { + this._removeQuote(writer, blocks.filter(findQuote)); + } + else { + const blocksToQuote = blocks.filter(block => { + // Already quoted blocks needs to be considered while quoting too + // in order to reuse their elements. + return findQuote(block) || checkCanBeQuoted(schema, block); + }); + this._applyQuote(writer, blocksToQuote); + } + }); + } + /** + * Checks the command's {@link #value}. + */ + _getValue() { + const selection = this.editor.model.document.selection; + const firstBlock = first(selection.getSelectedBlocks()); + // In the current implementation, the block quote must be an immediate parent of a block element. + return !!(firstBlock && findQuote(firstBlock)); + } + /** + * Checks whether the command can be enabled in the current context. + * + * @returns Whether the command should be enabled. + */ + _checkEnabled() { + if (this.value) { + return true; + } + const selection = this.editor.model.document.selection; + const schema = this.editor.model.schema; + const firstBlock = first(selection.getSelectedBlocks()); + if (!firstBlock) { + return false; + } + return checkCanBeQuoted(schema, firstBlock); + } + /** + * Removes the quote from given blocks. + * + * If blocks which are supposed to be "unquoted" are in the middle of a quote, + * start it or end it, then the quote will be split (if needed) and the blocks + * will be moved out of it, so other quoted blocks remained quoted. + */ + _removeQuote(writer, blocks) { + // Unquote all groups of block. Iterate in the reverse order to not break following ranges. + getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => { + if (groupRange.start.isAtStart && groupRange.end.isAtEnd) { + writer.unwrap(groupRange.start.parent); + return; + } + // The group of blocks are at the beginning of an so let's move them left (out of the ). + if (groupRange.start.isAtStart) { + const positionBefore = writer.createPositionBefore(groupRange.start.parent); + writer.move(groupRange, positionBefore); + return; + } + // The blocks are in the middle of an so we need to split the after the last block + // so we move the items there. + if (!groupRange.end.isAtEnd) { + writer.split(groupRange.end); + } + // Now we are sure that groupRange.end.isAtEnd is true, so let's move the blocks right. + const positionAfter = writer.createPositionAfter(groupRange.end.parent); + writer.move(groupRange, positionAfter); + }); + } + /** + * Applies the quote to given blocks. + */ + _applyQuote(writer, blocks) { + const quotesToMerge = []; + // Quote all groups of block. Iterate in the reverse order to not break following ranges. + getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => { + let quote = findQuote(groupRange.start); + if (!quote) { + quote = writer.createElement('blockQuote'); + writer.wrap(groupRange, quote); + } + quotesToMerge.push(quote); + }); + // Merge subsequent elements. Reverse the order again because this time we want to go through + // the elements in the source order (due to how merge works – it moves the right element's content + // to the first element and removes the right one. Since we may need to merge a couple of subsequent `` elements + // we want to keep the reference to the first (furthest left) one. + quotesToMerge.reverse().reduce((currentQuote, nextQuote) => { + if (currentQuote.nextSibling == nextQuote) { + writer.merge(writer.createPositionAfter(currentQuote)); + return currentQuote; + } + return nextQuote; + }); + } +} +function findQuote(elementOrPosition) { + return elementOrPosition.parent.name == 'blockQuote' ? elementOrPosition.parent : null; +} +/** + * Returns a minimal array of ranges containing groups of subsequent blocks. + * + * content: abcdefgh + * blocks: [ a, b, d, f, g, h ] + * output ranges: [ab]c[d]e[fgh] + */ +function getRangesOfBlockGroups(writer, blocks) { + let startPosition; + let i = 0; + const ranges = []; + while (i < blocks.length) { + const block = blocks[i]; + const nextBlock = blocks[i + 1]; + if (!startPosition) { + startPosition = writer.createPositionBefore(block); + } + if (!nextBlock || block.nextSibling != nextBlock) { + ranges.push(writer.createRange(startPosition, writer.createPositionAfter(block))); + startPosition = null; + } + i++; + } + return ranges; +} +/** + * Checks whether can wrap the block. + */ +function checkCanBeQuoted(schema, block) { + // TMP will be replaced with schema.checkWrap(). + const isBQAllowed = schema.checkChild(block.parent, 'blockQuote'); + const isBlockAllowedInBQ = schema.checkChild(['$root', 'blockQuote'], block); + return isBQAllowed && isBlockAllowedInBQ; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js new file mode 100644 index 000000000..5672b654b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js @@ -0,0 +1,118 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquoteediting + */ +import { Plugin } from 'ckeditor5/src/core'; +import { Enter } from 'ckeditor5/src/enter'; +import { Delete } from 'ckeditor5/src/typing'; +import BlockQuoteCommand from './blockquotecommand'; +/** + * The block quote editing. + * + * Introduces the `'blockQuote'` command and the `'blockQuote'` model element. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockQuoteEditing'; + } + /** + * @inheritDoc + */ + static get requires() { + return [Enter, Delete]; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const schema = editor.model.schema; + editor.commands.add('blockQuote', new BlockQuoteCommand(editor)); + schema.register('blockQuote', { + inheritAllFrom: '$container' + }); + editor.conversion.elementToElement({ model: 'blockQuote', view: 'blockquote' }); + // Postfixer which cleans incorrect model states connected with block quotes. + editor.model.document.registerPostFixer(writer => { + const changes = editor.model.document.differ.getChanges(); + for (const entry of changes) { + if (entry.type == 'insert') { + const element = entry.position.nodeAfter; + if (!element) { + // We are inside a text node. + continue; + } + if (element.is('element', 'blockQuote') && element.isEmpty) { + // Added an empty blockQuote - remove it. + writer.remove(element); + return true; + } + else if (element.is('element', 'blockQuote') && !schema.checkChild(entry.position, element)) { + // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost. + writer.unwrap(element); + return true; + } + else if (element.is('element')) { + // Just added an element. Check that all children meet the scheme rules. + const range = writer.createRangeIn(element); + for (const child of range.getItems()) { + if (child.is('element', 'blockQuote') && + !schema.checkChild(writer.createPositionBefore(child), child)) { + writer.unwrap(child); + return true; + } + } + } + } + else if (entry.type == 'remove') { + const parent = entry.position.parent; + if (parent.is('element', 'blockQuote') && parent.isEmpty) { + // Something got removed and now blockQuote is empty. Remove the blockQuote as well. + writer.remove(parent); + return true; + } + } + } + return false; + }); + const viewDocument = this.editor.editing.view.document; + const selection = editor.model.document.selection; + const blockQuoteCommand = editor.commands.get('blockQuote'); + // Overwrite default Enter key behavior. + // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote. + this.listenTo(viewDocument, 'enter', (evt, data) => { + if (!selection.isCollapsed || !blockQuoteCommand.value) { + return; + } + const positionParent = selection.getLastPosition().parent; + if (positionParent.isEmpty) { + editor.execute('blockQuote'); + editor.editing.view.scrollToTheSelection(); + data.preventDefault(); + evt.stop(); + } + }, { context: 'blockquote' }); + // Overwrite default Backspace key behavior. + // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote. + this.listenTo(viewDocument, 'delete', (evt, data) => { + if (data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand.value) { + return; + } + const positionParent = selection.getLastPosition().parent; + if (positionParent.isEmpty && !positionParent.previousSibling) { + editor.execute('blockQuote'); + editor.editing.view.scrollToTheSelection(); + data.preventDefault(); + evt.stop(); + } + }, { context: 'blockquote' }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js new file mode 100644 index 000000000..2249f26a6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquoteui + */ +import { Plugin, icons } from 'ckeditor5/src/core'; +import { ButtonView } from 'ckeditor5/src/ui'; +import '../theme/blockquote.css'; +/** + * The block quote UI plugin. + * + * It introduces the `'blockQuote'` button. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockQuoteUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + editor.ui.componentFactory.add('blockQuote', locale => { + const command = editor.commands.get('blockQuote'); + const buttonView = new ButtonView(locale); + buttonView.set({ + label: t('Block quote'), + icon: icons.quote, + tooltip: true, + isToggleable: true + }); + // Bind button model to command. + buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); + // Execute command. + this.listenTo(buttonView, 'execute', () => { + editor.execute('blockQuote'); + editor.editing.view.focus(); + }); + return buttonView; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/index.js new file mode 100644 index 000000000..a245979b2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/src/index.js @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote + */ +export { default as BlockQuote } from './blockquote'; +export { default as BlockQuoteEditing } from './blockquoteediting'; +export { default as BlockQuoteUI } from './blockquoteui'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/theme/blockquote.css b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/theme/blockquote.css new file mode 100644 index 000000000..b033ee049 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-block-quote/theme/blockquote.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content blockquote { + /* See #12 */ + overflow: hidden; + + /* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */ + padding-right: 1.5em; + padding-left: 1.5em; + + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} + +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/CHANGELOG.md new file mode 100644 index 000000000..76df68523 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/CHANGELOG.md @@ -0,0 +1,1022 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v18.0.0...v19.0.0) (2020-04-29) + +We are happy to announce the release of CKEditor 5 v19.0.0. + +Refer to the [main changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v19.0.0) to find out about all the new features, improvements and possible breaking changes. + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v19.0.0-with-table-enhancements-improved-performance-and-select-all-feature/ + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-select-all](https://www.npmjs.com/package/@ckeditor/ckeditor5-select-all): [v19.0.0](https://github.com/ckeditor/ckeditor5-select-all/releases/tag/v19.0.0) + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v19.0.0) + +Major releases (contain minor breaking changes): + +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v19.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v19.0.0) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v17.0.0...v18.0.0) (2020-03-19) + +We are happy to announce the release of CKEditor 5 v18.0.0. + +Refer to the [main changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v18.0.0) to find out about all the new features, improvements and possible breaking changes. + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v18.0.0-with-custom-table-selection-and-pasting-nested-lists-from-Word/ + +### Features + +Besides new features introduced by the dependencies, this version also introduces the following features: + +* Added the [Automatic text transformation](https://ckeditor.com/docs/ckeditor5/latest/features/text-transformation.html) feature to the build. See [ckeditor/ckeditor5#6304](https://github.com/ckeditor/ckeditor5/issues/6304). ([493a7db](https://github.com/ckeditor/ckeditor5-build-inline/commit/493a7db)) + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v18.0.0) + +Major releases (contain minor breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v18.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v18.0.0) + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v16.0.0...v17.0.0) (2020-02-19) + +We are happy to announce the release of CKEditor 5 v17.0.0. + +Refer to the [main changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v17.0.0) to find out about all the new features, improvements and possible breaking changes. + +https://ckeditor.com/blog/CKEditor-5-v17.0.0-with-table-styles-special-characters-and-performance-improvements/ + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v17.0.0) + +Major releases (contain minor breaking changes): + +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v17.0.0) + +Releases containing new features: + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v17.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v17.0.0) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v15.0.0...v16.0.0) (2019-12-04) + +We are happy to announce the release of CKEditor 5 v16.0.0. This release introduces one of the most community-requested features: [code blocks](https://ckeditor.com/docs/ckeditor5/latest/features/code-blocks.html). We included a new [restricted editing](https://ckeditor.com/docs/ckeditor5/latest/features/restricted-editing.html) plugin, too. + +We also did some changes in the default UI colors to improve accessibility. In addition to that, as always, the release contains many [more improvements and bug fixes](https://github.com/ckeditor/ckeditor5/issues?q=is%3Aissue+milestone%3A%22iteration+28%22+is%3Aclosed+-label%3Atype%3Adocs+-label%3Atype%3Atask+-label%3Apackage%3Arestricted-editing+-label%3Apackage%3Acode-block+-label%3Atype%3Afeature). + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v16.0.0-with-code-blocks-and-restricted-editing/ + +### Other changes + +* Replaced UglifyJS with Terser. See [ckeditor/ckeditor5#1353](https://github.com/ckeditor/ckeditor5/issues/1353). ([b2734ca](https://github.com/ckeditor/ckeditor5-build-inline/commit/b2734ca)) + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v16.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v16.0.0) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v12.4.0...v15.0.0) (2019-10-23) + +We are happy to announce the release of CKEditor 5 v15.0.0. This editor version introduces support for inserting [horizontal lines](https://ckeditor.com/docs/ckeditor5/latest/features/horizontal-line.html), [page breaks](https://ckeditor.com/docs/ckeditor5/latest/features/page-break.html) and [SVG images](https://ckeditor.com/docs/ckeditor5/latest/api/module_image_imageupload-ImageUploadConfig.html#member-types) into the WYSIWYG editor. It also allows you to define the [document title section](https://ckeditor.com/docs/ckeditor5/latest/features/title.html) thanks to the new title plugin. The editor toolbar is now responsive which improves the UX, especially for mobile devices. + +Regarding the build itself, we added the [list indentation](https://ckeditor.com/docs/ckeditor5/latest/features/indent.html#indenting-lists) button to the build's default setup. See [ckeditor/ckeditor5#1844](https://github.com/ckeditor/ckeditor5/issues/1844). ([3a4a1fc](https://github.com/ckeditor/ckeditor5-build-inline/commit/3a4a1fc)) + +From other news, we changed the versioning policy. Now, all packages will have the same major version, hence, we needed to release this one as v15.0.0 (we skipped versions 13.0.0 and 14.0.0). Read more about the [new versioning policy](https://ckeditor.com/docs/ckeditor5/latest/updating/versioning-policy.html). + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v15.0.0-with-horizontal-line-page-break-responsive-toolbar-and-SVG-upload-support/ + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v15.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v3.0.1 => [v15.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.4 => [v15.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.3 => [v15.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v12.0.2 => [v15.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.3.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v12.3.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v10.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.1.2 => [v15.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.4 => [v15.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.2.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.2.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v12.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v15.0.0) + + +## [12.4.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v12.3.1...v12.4.0) (2019-08-26) + +This release brings a huge set of new features: [image resizing](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/image.html#resizing-images), [to-do lists](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/todo-lists.html), [support for RTL languages](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/ui-language.html), [simple upload adapter](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/images/image-upload/simple-upload-adapter.html), [support for pasting from Google Docs](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/paste-from-office/paste-from-google-docs.html), [mathematic formulas](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/mathtype.html), and [spelling and grammar checking](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/spell-checker.html). In addition to that, as always, it contains many improvements and bug fixes. + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.2.1 => [v14.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.1.2 => [v14.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v13.0.2 => [v14.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v13.0.2 => [v14.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.1.1 => [v12.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v13.0.1 => [v14.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v14.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.2.1 => [v12.3.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.3.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v12.2.1 => [v12.3.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v12.3.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.4 => [v11.1.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.4 => [v12.1.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.4 => [v11.1.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.1.1 => [v14.2.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.2.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.1.1 => [v12.2.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.2.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.4 => [v11.1.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.3 => [v11.1.4](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.4) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.2 => [v11.1.3](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.3) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v12.0.1 => [v12.0.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v12.0.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.3 => [v11.1.4](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.4) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.5) + +### Other changes + +* Bumped style-loader to v1.0.0. Aligned the webpack config to the new loader API. See [ckeditor/ckeditor5#1945](https://github.com/ckeditor/ckeditor5/issues/1945). ([086eab1](https://github.com/ckeditor/ckeditor5-build-inline/commit/086eab1)) +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([db1aad8](https://github.com/ckeditor/ckeditor5-build-inline/commit/db1aad8)) + + +## [12.3.1](https://github.com/ckeditor/ckeditor5-build-inline/compare/v12.3.0...v12.3.1) (2019-07-10) + +We are happy to report the release of CKEditor 5 v12.3.0 (and v12.3.1 with a small fix). This release introduces several new features ([word count](https://ckeditor.com/docs/ckeditor5/latest/features/word-count.html), [automatic text transformations](https://ckeditor.com/docs/ckeditor5/latest/features/text-transformation.html), [ability to control link attributes such as `target`](https://ckeditor.com/docs/ckeditor5/latest/features/link.html#custom-link-attributes-decorators) and [block indentation](https://ckeditor.com/docs/ckeditor5/latest/features/indent.html)). It also brings improvements to existing features (e.g. the ["document colors" section](https://ckeditor.com/docs/ckeditor5/latest/features/font.html#documents-colors) in the font color picker dropdowns) and many bug fixes. + +### Dependencies + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.2 => [v11.1.3](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.3) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.2.0 => [v12.2.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.2.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v12.2.0 => [v12.2.1](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v12.2.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.2.0 => [v13.2.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.2.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.1.1 => [v13.1.2](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.1.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.3 => [v12.0.4](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.4) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.2 => [v11.1.3](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.3) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v13.0.1 => [v13.0.2](https://github.com/ckeditor/ckeditor5-table/releases/tag/v13.0.2) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.1.0 => [v14.1.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.1.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v13.0.1 => [v13.0.2](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v13.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.4) + + +## [12.3.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v12.2.0...v12.3.0) (2019-07-04) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v11.0.2 => [v12.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v12.1.1 => [v13.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v13.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.1.1 => [v12.2.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.2.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v12.1.1 => [v12.2.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v12.2.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.1.1 => [v13.2.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.2.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.0.2 => [v11.1.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.0.0 => [v14.1.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.1.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.0.2 => [v12.1.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.0.2 => [v11.1.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.1.0 => [v13.1.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.1.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.2 => [v12.0.3](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.3) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-table/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.3) + + +## [12.2.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v12.1.0...v12.2.0) (2019-06-05) + +We are happy to report the release of CKEditor 5 v12.2.0. This is a minor release with many bug fixes and a new UI feature which allows to navigating between multiple balloons. + +**Note:** The `config.table.toolbar` property that had been deprecated last year has now been completely removed. Use [`config.table.contentToolbar`](https://ckeditor.com/docs/ckeditor5/latest/api/module_table_table-TableConfig.html#member-contentToolbar) instead. + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v12.0.1 => [v13.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v13.0.1 => [v14.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v12.1.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v13.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.0.1 => [v11.1.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.0.1 => [v13.1.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.1.0 => [v13.1.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.1.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.1 => [v12.0.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.2) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.0.1 => [v12.0.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.2) + + +## [12.1.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v12.0.0...v12.1.0) (2019-04-10) + +We are happy to report the release of CKEditor 5 v12.1.0. This release introduces 3 new features ([mentions](https://ckeditor.com/docs/ckeditor5/latest/features/mentions.html), [font color and background color](https://ckeditor.com/docs/ckeditor5/latest/features/font.html) and [remove format](https://ckeditor.com/docs/ckeditor5/latest/features/remove-format.html)). + +Check out the linked guides for information how to install and configure those features in your editor. + +### Dependencies + +Minor releases: + +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.0.0 => [v13.1.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.1.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v12.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-table/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.1) + + +## [12.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v11.2.0...v12.0.0) (2019-02-28) + +We are happy to report the release of CKEditor 5 v12.0.0. This release introduces a new editor (called "[Balloon block editor](https://ckeditor.com/docs/ckeditor5/latest/examples/builds/balloon-block-editor.html)"), the [editor content placeholder](https://ckeditor.com/docs/ckeditor5/latest/features/editor-placeholder.html) and support for inline widgets (watch [this PR](https://github.com/ckeditor/ckeditor5/pull/1587) for updates). In addition to that we enabled media embeds and images in tables and resolved the issue where `editor.getData()` returned `

     

    ` for empty content (now it returns an empty string in this case). + +Besides new features, this release contains many improvements to stability, [performance](https://github.com/ckeditor/ckeditor5-utils/issues/269) and API. The last group of changes contain many breaking ones. Make sure to read the [main package's changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v12.0.0). + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.1.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v10.0.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.1.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v11.1.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v11.0.2 => [v12.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v12.0.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.3 => [v11.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.3 => [v11.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.1.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v12.0.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.3 => [v12.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v10.0.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v11.0.1 => [v12.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v12.0.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v11.0.2 => [v12.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v11.2.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v11.1.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.3.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.0) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [11.2.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v11.1.1...v11.2.0) (2018-12-05) + +We are happy to report the release of CKEditor 5 v11.2.0. This editor version brings the long-awaited [support for paste from Office](https://ckeditor.com/docs/ckeditor5/latest/features/paste-from-word.html) (e.g. from Microsoft Word), [integration with CKFinder file manager](https://ckeditor.com/docs/ckeditor5/latest/features/ckfinder.html), improved [image upload documentation](https://ckeditor.com/docs/ckeditor5/latest/features/image-upload.html), improved [editor UI on mobile devices](https://github.com/ckeditor/ckeditor5/issues/416#issuecomment-430246472), as well as many smaller features and improvements. + +Blog post is coming soon... + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): [v10.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): [v10.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v10.0.0) + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v11.0.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v11.0.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v11.1.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v12.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.3 => [v10.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v11.0.1 => [v11.1.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.4 => [v10.1.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v11.1.0 => [v11.2.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v11.2.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v11.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.2 => [v10.1.3](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.3) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.2 => [v10.1.3](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.3) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-table/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.3.0 => [v10.3.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.3.1) + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-build-inline/compare/v11.1.0...v11.1.1) (2018-10-11) + +This releases fixes the README of this package on npm. + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v11.0.1...v11.1.0) (2018-10-08) + +This is a minor release. Besides updating all used CKEditor 5 packages to their latest versions it brings two new features: the [Table](https://ckeditor.com/docs/ckeditor5/latest/features/table.html) and [Media embed](https://ckeditor.com/docs/ckeditor5/latest/features/media-embed.html) features which are now enabled in this build by default. + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v11.1.0-released/ + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v10.2.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v10.2.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v11.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.0.2 => [v10.1.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.2.0 => [v10.3.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.3.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.1 => [v10.1.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.1 => [v10.1.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v10.2.1 => [v10.2.2](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.2.2) + +### Features + +Besides new features introduced by the dependencies, this version also introduces the following features: + +* Added the table and media embed features to the build. See [ckeditor/ckeditor5#1247](https://github.com/ckeditor/ckeditor5/issues/1247). ([b9940e3](https://github.com/ckeditor/ckeditor5-build-inline/commit/b9940e3)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-build-inline/compare/v11.0.0...v11.0.1) (2018-07-18) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v10.1.0...v11.0.0) (2018-07-18) + +### Release notes + +This is a major releases that introduces many smaller features, dozens of bug fixes and a couple of infrastructure changes (an upgrade to `webpack@4`, simplified structure of the build repository). Additionally, the `InlineEditor#element` property was renamed to `InlineEditor#sourceElement` and the `InlineEditor#updateElement()` method was renamed to `InlineEditor#updateSourceElement()`. + +If you maintain a [custom build of CKEditor 5](https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/alternative-setups/custom-builds.html) or [integrate CKEditor 5 from source](https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/alternative-setups/integrating-from-source.html), we recommend reading the [migration guide](https://github.com/ckeditor/ckeditor5/issues/1136). + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v11.0.0-released/ + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v10.0.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v10.0.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v11.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v10.2.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v10.2.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.2.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.2.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.2) + +### Other changes + +* Changed the structure of the build repository. Closes [ckeditor/ckeditor5#1038](https://github.com/ckeditor/ckeditor5/issues/1038). ([8697aac](https://github.com/ckeditor/ckeditor5-build-inline/commit/8697aac)) +* Updated `webpack` to version 4 (applies to custom builds only). ([e06c13b](https://github.com/ckeditor/ckeditor5-build-inline/commit/e06c13b)) + +### BREAKING CHANGES + +If you maintain a custom build, we recommend reading the [migration guide](https://github.com/ckeditor/ckeditor5/issues/1136). Closes [ckeditor/ckeditor5#1038](https://github.com/ckeditor/ckeditor5/issues/1038). + +* CKEditor 5 environment was updated to use `webpack@4`. `webpack@4` introduced major changes in its configuration and plugin system. CKEditor 5 tools and build configuration were updated to work with `webpack@4` and will not work with `webpack@3`. +* The structure of the build repository was changed. The `build-config.js` file was removed and the build configuration is now kept only in the `src/ckeditor.js` file. + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v10.0.1...v10.1.0) (2018-06-21) + +This is a minor release that introduces many bug fixes and new features (most notable one is support for inserting soft breaks with Shift+Enter). + +You can read more in the [blog post](https://ckeditor.com/blog/CKEditor-5-v10.1.0-released/). + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v10.0.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.1) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-build-inline/compare/v10.0.0...v10.0.1) (2018-05-22) + +### Dependencies + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.1) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.0.0) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([5a2351f](https://github.com/ckeditor/ckeditor5-build-inline/commit/5a2351f)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-build-inline/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2018-04-19) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-beta.4) + + +## [1.0.0-beta.3](https://github.com/ckeditor/ckeditor5-build-inline/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2018-04-10) + +### NOTE + +This release followed `v1.0.0-beta.2` immediately to fix the issue mentioned below. Therefore, when upgrading from `v1.0.0-beta.1` make sure to also check [`v1.0.0-beta.2` release notes](https://github.com/ckeditor/ckeditor5-build-inline/releases/tag/v1.0.0-beta.2). + +### Bug fixes + +* Translations should work when CKEditor was loaded using RequireJS. See [ckeditor/ckeditor5#914](https://github.com/ckeditor/ckeditor5/issues/914). ([9246836](https://github.com/ckeditor/ckeditor5-build-inline/commit/9246836)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-build-inline/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-beta.2) + +### Bug fixes + +Besides changes in the dependencies, this version also contains the following bug fixes: + +* Removed duplicated `ImageUpload` plugin. See [ckeditor/ckeditor5#909](https://github.com/ckeditor/ckeditor5/issues/909). ([7d8acab](https://github.com/ckeditor/ckeditor5-build-inline/commit/7d8acab)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-build-inline/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-cloudservices](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloudservices): v1.0.0-alpha.1 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-cloudservices/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-beta.1) + +### Features + +Besides new features introduced by the dependencies, this version also introduces the following features: + +* Added the image upload button to the build. See [ckeditor/ckeditor5#870](https://github.com/ckeditor/ckeditor5/issues/870). ([67e0779](https://github.com/ckeditor/ckeditor5-build-inline/commit/67e0779)) + +### Other changes + +* Aligned build and `webpack.config.js` to the new Translation Service ([ckeditor/ckeditor5#624](https://github.com/ckeditor/ckeditor5/issues/624)). ([6ab5d5f](https://github.com/ckeditor/ckeditor5-build-inline/commit/6ab5d5f)) +* Changed the webpack configuration so the styles are processed using PostCSS instead of SASS (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([22c0a63](https://github.com/ckeditor/ckeditor5-build-inline/commit/22c0a63)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-build-inline.git/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-cloudservices](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloudservices): [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-cloudservices/releases/tag/v1.0.0-alpha.1) + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-alpha.2) + +### Bug fixes + +Besides changes in the dependencies, this version also contains the following bug fixes: + +* Build scripts will work on Windows. Read more https://github.com/ckeditor/ckeditor5-build-classic/issues/26. ([370d2a1](https://github.com/ckeditor/ckeditor5-build-inline/commit/370d2a1)) + +### Other changes + +* Optimized the bundle size (~10%) by enabling webpack's `ModuleConcatenationPlugin` plugin. Read more https://github.com/ckeditor/ckeditor5/issues/475. ([fa197a0](https://github.com/ckeditor/ckeditor5-build-inline/commit/fa197a0)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-build-inline/compare/v0.2.0...v1.0.0-alpha.1) (2017-10-03) + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-alpha.1) + +Major releases (possible breaking changes): + +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v0.1.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v0.7.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-editor-inline](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-inline): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-editor-inline/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v0.11.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v0.7.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v0.8.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v0.7.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-alpha.1) + +### Bug fixes + +Besides changes in the dependencies, this build also contains these bug fixes: + +* It will be possible to configure toolbar offset without overriding preconfigured toolbar items. See [ckeditor/ckeditor5#572](https://github.com/ckeditor/ckeditor5/issues/572). ([f974881](https://github.com/ckeditor/ckeditor5-build-inline/commit/f974881)) + +### Features + +Besides new features introduced in the dependencies, this build also introduces these features: + +* Added Easy Image with Cloud Services and CKFinder adapter. See [ckeditor/ckeditor5#567](https://github.com/ckeditor/ckeditor5/issues/567). ([d1526fa](https://github.com/ckeditor/ckeditor5-build-inline/commit/d1526fa)) + + +## [0.2.0](https://github.com/ckeditor/ckeditor5-build-inline/compare/v0.1.0...v0.2.0) (2017-09-07) + +### Other changes + +* The build now defines the editor as its default export. This makes requiring the build easier when using AMD, CJS or ES6 modules. See [ckeditor/ckeditor5#545](https://github.com/ckeditor/ckeditor5/issues/545). ([5f64e7d](https://github.com/ckeditor/ckeditor5-build-inline/commit/5f64e7d)) + +### BREAKING CHANGES + +* The build now defines a default export instead of named export. See [ckeditor/ckeditor5#545](https://github.com/ckeditor/ckeditor5/issues/545). + + +## 0.1.0 (2017-09-03) + +### Features + +* Introduced the inline editor build. ([caff6d9](https://github.com/ckeditor/ckeditor5-build-inline/commit/caff6d9)) diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/LICENSE.md new file mode 100644 index 000000000..fa29c40f2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/LICENSE.md @@ -0,0 +1,21 @@ +Software License Agreement +========================== + +**CKEditor 5 inline editor build** – https://github.com/ckeditor/ckeditor5-build-inline
    +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +The following libraries are included in CKEditor under the [MIT license](https://opensource.org/licenses/MIT): + +* lodash - Copyright (c) JS Foundation and other contributors https://js.foundation/. Based on Underscore.js, copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors http://underscorejs.org/. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/README.md new file mode 100644 index 000000000..fdcaafbb5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/README.md @@ -0,0 +1,71 @@ +CKEditor 5 inline editor build +============================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-build-inline.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-build-inline) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-build-inline) + +The inline editor build for CKEditor 5. Read more about the [inline editor build](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/predefined-builds.html#inline-editor) and see the [demo](https://ckeditor.com/docs/ckeditor5/latest/examples/builds/inline-editor.html). + +![CKEditor 5 inline editor build screenshot](https://c.cksource.com/a/1/img/npm/ckeditor5-build-inline.png) + +## Documentation + +See: + +* [Installation](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/quick-start.html) for how to install this package and what it contains. +* [Editor lifecycle](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/editor-lifecycle.html) for how to create an editor and interact with it. +* [Configuration](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/configuration.html) for how to configure the editor. +* [Creating custom builds](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/quick-start.html#building-the-editor-from-source) for how to customize the build (configure and rebuild the editor bundle). + +## Quick start + +First, install the build from npm: + +```bash +npm install --save @ckeditor/ckeditor5-build-inline +``` + +And use it in your website: + +```html +
    +

    This is the editor content.

    +
    + + +``` + +Or in your JavaScript application: + +```js +import InlineEditor from '@ckeditor/ckeditor5-build-inline'; + +// Or using the CommonJS version: +// const InlineEditor = require( '@ckeditor/ckeditor5-build-inline' ); + +InlineEditor + .create( document.querySelector( '#editor' ) ) + .then( editor => { + window.editor = editor; + } ) + .catch( error => { + console.error( 'There was a problem initializing the editor.', error ); + } ); +``` + +**Note:** If you are planning to integrate CKEditor 5 deep into your application, it is actually more convenient and recommended to install and import the source modules directly (like it happens in `ckeditor.js`). Read more in the [Advanced setup guide](https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/advanced-setup.html). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/build/ckeditor.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/build/ckeditor.js new file mode 100644 index 000000000..4479f70cc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-build-inline/build/ckeditor.js @@ -0,0 +1,7 @@ +!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 of %1",Aquamarine:"Aquamarine",Black:"Black","Block quote":"Block quote",Blue:"Blue",Bold:"Bold","Break text":"Break text","Bulleted List":"Bulleted List",Cancel:"Cancel","Cannot determine a category for the uploaded file.":"Cannot determine a category for the uploaded file.","Cannot upload file:":"Cannot upload file:","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Column:"Column","Could not insert image at the current position.":"Could not insert image at the current position.","Could not obtain resized image URL.":"Could not obtain resized image URL.","Decrease indent":"Decrease indent","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Downloadable:"Downloadable","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor editing area: %0":"Editor editing area: %0","Editor toolbar":"Editor toolbar","Enter image caption":"Enter image caption","Full size image":"Full size image",Green:"Green",Grey:"Grey","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6","Image toolbar":"Image toolbar","image widget":"image widget","In line":"In line","Increase indent":"Increase indent","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert image":"Insert image","Insert image or file":"Insert image or file","Insert media":"Insert media","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table","Inserting image failed":"Inserting image failed",Italic:"Italic","Left aligned image":"Left aligned image","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Link:"Link","Link URL":"Link URL","Media URL":"Media URL","media widget":"media widget","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells",Next:"Next","Numbered List":"Numbered List","Open file manager":"Open file manager","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","Open media in new tab":"Open media in new tab",Orange:"Orange",Paragraph:"Paragraph","Paste the media URL in the input.":"Paste the media URL in the input.","Press Enter to type after or press Shift + Enter to type before the widget":"Press Enter to type after or press Shift + Enter to type before the widget",Previous:"Previous",Purple:"Purple",Red:"Red",Redo:"Redo","Rich Text Editor":"Rich Text Editor","Rich Text Editor. Editing area: %0":"Rich Text Editor. Editing area: %0","Right aligned image":"Right aligned image",Row:"Row",Save:"Save","Select all":"Select all","Select column":"Select column","Select row":"Select row","Selecting resized image failed":"Selecting resized image failed","Show more items":"Show more items","Side image":"Side image","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically","Table toolbar":"Table toolbar","Text alternative":"Text alternative","The URL must not be empty.":"The URL must not be empty.","This link has no URL":"This link has no URL","This media URL is not supported.":"This media URL is not supported.","Tip: Paste the URL into the content to embed faster.":"Tip: Paste the URL into the content to embed faster.","Toggle caption off":"Toggle caption off","Toggle caption on":"Toggle caption on",Turquoise:"Turquoise",Undo:"Undo",Unlink:"Unlink","Upload failed":"Upload failed","Upload in progress":"Upload in progress",White:"White","Widget toolbar":"Widget toolbar","Wrap text":"Wrap text",Yellow:"Yellow"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */ +function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.InlineEditor=e():t.InlineEditor=e()}(self,(()=>(()=>{"use strict";var t={3062:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}","",{version:3,sources:["webpack://./../ckeditor5-block-quote/theme/blockquote.css"],names:[],mappings:"AAKA,uBAWC,0BAAsC,CADtC,iBAAkB,CAFlB,aAAc,CACd,cAAe,CAPf,eAAgB,CAIhB,kBAAmB,CADnB,mBAOD,CAEA,gCACC,aAAc,CACd,2BACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content blockquote {\n\t/* See #12 */\n\toverflow: hidden;\n\n\t/* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */\n\tpadding-right: 1.5em;\n\tpadding-left: 1.5em;\n\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-style: italic;\n\tborder-left: solid 5px hsl(0, 0%, 80%);\n}\n\n.ck-content[dir="rtl"] blockquote {\n\tborder-left: 0;\n\tborder-right: solid 5px hsl(0, 0%, 80%);\n}\n'],sourceRoot:""}]);const a=s},903:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;pointer-events:none;position:relative}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);margin-left:-1px;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{border-color:var(--ck-clipboard-drop-target-color) transparent transparent transparent;border-style:solid;border-width:calc(var(--ck-clipboard-drop-target-dot-height)) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5);content:"";display:block;height:0;left:50%;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);transform:translateX(-50%);width:0}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}',"",{version:3,sources:["webpack://./../ckeditor5-clipboard/theme/clipboard.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-clipboard/clipboard.css"],names:[],mappings:"AASC,8DACC,cAAe,CAEf,mBAAoB,CADpB,iBAOD,CAJC,mEACC,iBAAkB,CAClB,OACD,CAWA,qJACC,YACD,CCzBF,MACC,yCAA0C,CAC1C,yCAA0C,CAC1C,6DACD,CAOE,mEAIC,gDAAiD,CADjD,sDAAuD,CAFvD,2DAA8D,CAI9D,gBAAiB,CAHjB,wDAqBD,CAfC,yEAWC,sFAAuF,CAEvF,kBAAmB,CADnB,qKAA0K,CAX1K,UAAW,CAIX,aAAc,CAFd,QAAS,CAIT,QAAS,CADT,iBAAkB,CAElB,wDAA2D,CAE3D,0BAA2B,CAR3B,OAYD,CA2DF,kEACC,gGACD,CAKA,gDACC,OAAS,CACT,sBACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: inline;\n\t\tposition: relative;\n\t\tpointer-events: none;\n\n\t\t& span {\n\t\t\tposition: absolute;\n\t\t\twidth: 0;\n\t\t}\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\t& > .ck-widget__selection-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t& > .ck-widget__type-around {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-clipboard-drop-target-dot-width: 12px;\n\t--ck-clipboard-drop-target-dot-height: 8px;\n\t--ck-clipboard-drop-target-color: var(--ck-color-focus-border)\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\t& span {\n\t\t\tbottom: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tbackground: var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-left: -1px;\n\n\t\t\t/* The triangle above the marker */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 50%;\n\t\t\t\ttop: calc(var(--ck-clipboard-drop-target-dot-height) * -.5);\n\n\t\t\t\ttransform: translateX(-50%);\n\t\t\t\tborder-color: var(--ck-clipboard-drop-target-color) transparent transparent transparent;\n\t\t\t\tborder-width: calc(var(--ck-clipboard-drop-target-dot-height)) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t// Horizontal drop target (between blocks).\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\theight: 0;\n\t\tmargin: 0;\n\t\ttext-align: initial;\n\n\t\t& .ck-clipboard-drop-target__line {\n\t\t\tposition: absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 0;\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-top: -1px;\n\n\t\t\t&::before {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent transparent transparent var(--ck-clipboard-drop-target-color);\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) 0 var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: calc(-1 * var(--ck-clipboard-drop-target-dot-size));\n\t\t\t\ttop: 0;\n\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tborder-color: transparent var(--ck-clipboard-drop-target-color) transparent transparent;\n\t\t\t\tborder-width: var(--ck-clipboard-drop-target-dot-size) calc(2 * var(--ck-clipboard-drop-target-dot-size)) var(--ck-clipboard-drop-target-dot-size) 0;\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t/*\n\t * Styles of the widget that it a drop target.\n\t */\n\t& .ck-widget.ck-clipboard-drop-target-range {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important;\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\tzoom: 0.6;\n\t\toutline: none !important;\n\t}\n}\n'],sourceRoot:""}]);const a=s},4717:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck .ck-placeholder,.ck.ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{content:attr(data-placeholder);left:0;pointer-events:none;position:absolute;right:0}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-reset_all .ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{color:var(--ck-color-engine-placeholder-text);cursor:text}","",{version:3,sources:["webpack://./../ckeditor5-engine/theme/placeholder.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-engine/placeholder.css"],names:[],mappings:"AAMA,uCAEC,iBAWD,CATC,qDAIC,8BAA+B,CAF/B,MAAO,CAKP,mBAAoB,CANpB,iBAAkB,CAElB,OAKD,CAKA,wCACC,YACD,CAQD,iCACC,iBACD,CC5BC,qDAEC,6CAA8C,CAD9C,WAED",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder,\n.ck .ck-placeholder {\n\tposition: relative;\n\n\t&::before {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tcontent: attr(data-placeholder);\n\n\t\t/* See ckeditor/ckeditor5#469. */\n\t\tpointer-events: none;\n\t}\n}\n\n/* See ckeditor/ckeditor5#1987. */\n.ck.ck-read-only .ck-placeholder {\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n\n/*\n * Rules for the `ck-placeholder` are loaded before the rules for `ck-reset_all` in the base CKEditor 5 DLL build.\n * This fix overwrites the incorrectly set `position: static` from `ck-reset_all`.\n * See https://github.com/ckeditor/ckeditor5/issues/11418.\n */\n.ck.ck-reset_all .ck-placeholder {\n\tposition: relative;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder, .ck .ck-placeholder {\n\t&::before {\n\t\tcursor: text;\n\t\tcolor: var(--ck-color-engine-placeholder-text);\n\t}\n}\n"],sourceRoot:""}]);const a=s},9315:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable span[data-ck-unsafe-element]{display:none}","",{version:3,sources:["webpack://./../ckeditor5-engine/theme/renderer.css"],names:[],mappings:"AAMA,qDACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Elements marked by the Renderer as hidden should be invisible in the editor. */\n.ck.ck-editor__editable span[data-ck-unsafe-element] {\n\tdisplay: none;\n}\n"],sourceRoot:""}]);const a=s},8733:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}","",{version:3,sources:["webpack://./../ckeditor5-heading/theme/heading.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-heading/heading.css"],names:[],mappings:"AAKA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,+BACC,eACD,CCZC,2EACC,SACD,CAEA,uEACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-heading_heading1 {\n\tfont-size: 20px;\n}\n\n.ck.ck-heading_heading2 {\n\tfont-size: 17px;\n}\n\n.ck.ck-heading_heading3 {\n\tfont-size: 14px;\n}\n\n.ck[class*="ck-heading_heading"] {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Resize dropdown's button label. */\n.ck.ck-dropdown.ck-heading-dropdown {\n\t& .ck-dropdown__button .ck-button__label {\n\t\twidth: 8em;\n\t}\n\n\t& .ck-dropdown__panel .ck-list__item {\n\t\tmin-width: 18em;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3508:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck-content .image{clear:both;display:table;margin:.9em auto;min-width:50px;text-align:center}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.ck.ck-editor__editable .image-inline.ck-widget_selected,.ck.ck-editor__editable .image.ck-widget_selected{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/image.css"],names:[],mappings:"AAMC,mBAEC,UAAW,CADX,aAAc,CAOd,gBAAkB,CAGlB,cAAe,CARf,iBAuBD,CAbC,uBAEC,aAAc,CAGd,aAAc,CAGd,cAAe,CAGf,cACD,CAGD,0BAYC,sBAAuB,CANvB,mBAAoB,CAGpB,cAoBD,CAdC,kCACC,YACD,CAGA,gEAGC,WAAY,CACZ,aAAc,CAGd,cACD,CAUD,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAWA,2GACC,SAUD,CAHC,qEACC,YACD,CAOA,0FACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content {\n\t& .image {\n\t\tdisplay: table;\n\t\tclear: both;\n\t\ttext-align: center;\n\n\t\t/* Make sure there is some space between the content and the image. Center image by default. */\n\t\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\t \tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\t\tmargin: 0.9em auto;\n\n\t\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\n\t\tmin-width: 50px;\n\n\t\t& img {\n\t\t\t/* Prevent unnecessary margins caused by line-height (see #44). */\n\t\t\tdisplay: block;\n\n\t\t\t/* Center the image if its width is smaller than the content\'s width. */\n\t\t\tmargin: 0 auto;\n\n\t\t\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\n\t\t\tmax-width: 100%;\n\n\t\t\t/* Make sure the image is never smaller than the parent container (See: https://github.com/ckeditor/ckeditor5/issues/9300). */\n\t\t\tmin-width: 100%\n\t\t}\n\t}\n\n\t& .image-inline {\n\t\t/*\n\t\t * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).\n\t\t * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.\n\t\t * This strange behavior does not happen with inline-flex.\n\t\t */\n\t\tdisplay: inline-flex;\n\n\t\t/* While being resized, don\'t allow the image to exceed the width of the editing root. */\n\t\tmax-width: 100%;\n\n\t\t/* This is required by Safari to resize images in a sensible way. Without this, the browser breaks the ratio. */\n\t\talign-items: flex-start;\n\n\t\t/* When the picture is present it must act as a flex container to let the img resize properly */\n\t\t& picture {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t/* When the picture is present, it must act like a resizable img. */\n\t\t& picture,\n\t\t& img {\n\t\t\t/* This is necessary for the img to span the entire .image-inline wrapper and to resize properly. */\n\t\t\tflex-grow: 1;\n\t\t\tflex-shrink: 1;\n\n\t\t\t/* Prevents overflowing the editing root boundaries when an inline image is very wide. */\n\t\t\tmax-width: 100%;\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Inhertit the content styles padding of the
    in case the integration overrides `text-align: center`\n\t * of `.image` (e.g. to the left/right). This ensures the placeholder stays at the padding just like the native\n\t * caret does, and not at the edge of
    .\n\t */\n\t& .image > figcaption.ck-placeholder::before {\n\t\tpadding-left: inherit;\n\t\tpadding-right: inherit;\n\n\t\t/*\n\t\t * Make sure the image caption placeholder doesn\'t overflow the placeholder area.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\n\t\t */\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\n\t/*\n\t * Make sure the selected inline image always stays on top of its siblings.\n\t * See https://github.com/ckeditor/ckeditor5/issues/9108.\n\t */\n\t& .image.ck-widget_selected {\n\t\tz-index: 1;\n\t}\n\n\t& .image-inline.ck-widget_selected {\n\t\tz-index: 1;\n\n\t\t/*\n\t\t * Make sure the native browser selection style is not displayed.\n\t\t * Inline image widgets have their own styles for the selected state and\n\t\t * leaving this up to the browser is asking for a visual collision.\n\t\t */\n\t\t& ::selection {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* The inline image nested in the table should have its original size if not resized.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\n\t& td,\n\t& th {\n\t\t& .image-inline img {\n\t\t\tmax-width: none;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},2640:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{background-color:var(--ck-color-image-caption-background);caption-side:bottom;color:var(--ck-color-image-caption-text);display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;word-break:break-word}.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight .6s ease-out}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highligted-background)}to{background-color:var(--ck-color-image-caption-background)}}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imagecaption.css"],names:[],mappings:"AAKA,MACC,2CAAoD,CACpD,kCAA8C,CAC9C,mDACD,CAGA,8BAKC,yDAA0D,CAH1D,mBAAoB,CAEpB,wCAAyC,CAHzC,qBAAsB,CAMtB,eAAgB,CAChB,mBAAoB,CAFpB,YAAa,CAHb,qBAMD,CAGA,qEACC,iDACD,CAEA,sCACC,GACC,oEACD,CAEA,GACC,yDACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-caption-background: hsl(0, 0%, 97%);\n\t--ck-color-image-caption-text: hsl(0, 0%, 20%);\n\t--ck-color-image-caption-highligted-background: hsl(52deg 100% 50%);\n}\n\n/* Content styles */\n.ck-content .image > figcaption {\n\tdisplay: table-caption;\n\tcaption-side: bottom;\n\tword-break: break-word;\n\tcolor: var(--ck-color-image-caption-text);\n\tbackground-color: var(--ck-color-image-caption-background);\n\tpadding: .6em;\n\tfont-size: .75em;\n\toutline-offset: -1px;\n}\n\n/* Editing styles */\n.ck.ck-editor__editable .image > figcaption.image__caption_highlighted {\n\tanimation: ck-image-caption-highlight .6s ease-out;\n}\n\n@keyframes ck-image-caption-highlight {\n\t0% {\n\t\tbackground-color: var(--ck-color-image-caption-highligted-background);\n\t}\n\n\t100% {\n\t\tbackground-color: var(--ck-color-image-caption-background);\n\t}\n}\n"],sourceRoot:""}]);const a=s},5083:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right{margin-left:auto;margin-right:0}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-bottom:var(--ck-inline-image-style-spacing);margin-top:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imagestyle.css"],names:[],mappings:"AAKA,MACC,8BAA+B,CAC/B,qEACD,CAMC,qFAEC,oDACD,CAIA,yEAEC,UACD,CAEA,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD,CAEA,2CAEC,gBAAiB,CADjB,cAED,CAEA,0CACC,aAAc,CACd,iBACD,CAGA,6GAGC,YACD,CAGC,mGAGC,kDAAmD,CADnD,+CAED,CAEA,iDACC,iDACD,CAEA,kDACC,gDACD,CAUC,0lBAGC,qDAKD,CAHC,8nBACC,YACD,CAKD,oVAGC,2DACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-image-style-spacing: 1.5em;\n\t--ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);\n}\n\n.ck-content {\n\t/* Provides a minimal side margin for the left and right aligned images, so that the user has a visual feedback\n\tconfirming successful application of the style if image width exceeds the editor's size.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9342 */\n\t& .image-style-block-align-left,\n\t& .image-style-block-align-right {\n\t\tmax-width: calc(100% - var(--ck-image-style-spacing));\n\t}\n\n\t/* Allows displaying multiple floating images in the same line.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9183#issuecomment-804988132 */\n\t& .image-style-align-left,\n\t& .image-style-align-right {\n\t\tclear: none;\n\t}\n\n\t& .image-style-side {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t\tmax-width: 50%;\n\t}\n\n\t& .image-style-align-left {\n\t\tfloat: left;\n\t\tmargin-right: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-align-center {\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\n\t& .image-style-align-right {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-block-align-right {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t& .image-style-block-align-left {\n\t\tmargin-left: 0;\n\t\tmargin-right: auto;\n\t}\n\n\t/* Simulates margin collapsing with the preceding paragraph, which does not work for the floating elements. */\n\t& p + .image-style-align-left,\n\t& p + .image-style-align-right,\n\t& p + .image-style-side {\n\t\tmargin-top: 0;\n\t}\n\n\t& .image-inline {\n\t\t&.image-style-align-left,\n\t\t&.image-style-align-right {\n\t\t\tmargin-top: var(--ck-inline-image-style-spacing);\n\t\t\tmargin-bottom: var(--ck-inline-image-style-spacing);\n\t\t}\n\n\t\t&.image-style-align-left {\n\t\t\tmargin-right: var(--ck-inline-image-style-spacing);\n\t\t}\n\n\t\t&.image-style-align-right {\n\t\t\tmargin-left: var(--ck-inline-image-style-spacing);\n\t\t}\n\t}\n}\n\n.ck.ck-splitbutton {\n\t/* The button should display as a regular drop-down if the action button\n\tis forced to fire the same action as the arrow button. */\n\t&.ck-splitbutton_flatten {\n\t\t&:hover,\n\t\t&.ck-splitbutton_open {\n\t\t\t& > .ck-splitbutton__action:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\n\t\t\t\tbackground-color: var(--ck-color-button-on-background);\n\n\t\t\t\t&::after {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.ck-splitbutton_open:hover {\n\t\t\t& > .ck-splitbutton__action:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\n\t\t\t\tbackground-color: var(--ck-color-button-on-hover-background);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},4036:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{animation-delay:0ms,3s;animation-duration:.5s,.5s;animation-fill-mode:forwards,forwards;animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{height:0;opacity:1;width:0}33%{height:0;width:.3em}to{height:.45em;opacity:1;width:.3em}}',"",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageuploadicon.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css"],names:[],mappings:"AAKA,+BAUC,iBAAkB,CATlB,aAAc,CACd,iBAAkB,CAOlB,sCAAwC,CADxC,oCAAsC,CAGtC,SAMD,CAJC,qCACC,UAAW,CACX,iBACD,CChBD,MACC,iCAA8C,CAC9C,+CAA4D,CAG5D,8BAA+B,CAC/B,gCAAiC,CACjC,4DACD,CAEA,+BAWC,sBAA4B,CAN5B,0BAAgC,CADhC,qCAAuC,CADvC,wEAA0E,CAD1E,uDAAwD,CAMxD,oDAAuD,CAWvD,oFAAuF,CAlBvF,SAAU,CAgBV,eAAgB,CAChB,mFA0BD,CAtBC,qCAgBC,mBAAsB,CADtB,sBAAyB,CAEzB,4BAA6B,CAH7B,4CAA6C,CAF7C,sFAAuF,CADvF,oFAAqF,CASrF,qBAAsB,CAdtB,QAAS,CAJT,QAAS,CAGT,SAAU,CADV,OAAQ,CAKR,mCAAoC,CACpC,yBAA0B,CAH1B,OAcD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GAGC,QAAS,CAFT,SAAU,CACV,OAED,CACA,IAEC,QAAS,CADT,UAED,CACA,GAGC,YAAc,CAFd,SAAU,CACV,UAED,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-image-upload-complete-icon {\n\tdisplay: block;\n\tposition: absolute;\n\n\t/*\n\t * Smaller images should have the icon closer to the border.\n\t * Match the icon position with the linked image indicator brought by the link image feature.\n\t */\n\ttop: min(var(--ck-spacing-medium), 6%);\n\tright: min(var(--ck-spacing-medium), 6%);\n\tborder-radius: 50%;\n\tz-index: 1;\n\n\t&::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t}\n}\n','/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\n\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\n\n\t/* Match the icon size with the linked image indicator brought by the link image feature. */\n\t--ck-image-upload-icon-size: 20;\n\t--ck-image-upload-icon-width: 2px;\n\t--ck-image-upload-icon-is-visible: clamp(0px, 100% - 50px, 1px);\n}\n\n.ck-image-upload-complete-icon {\n\topacity: 0;\n\tbackground: var(--ck-color-image-upload-icon-background);\n\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\n\tanimation-fill-mode: forwards, forwards;\n\tanimation-duration: 500ms, 500ms;\n\n\t/* To make animation scalable. */\n\tfont-size: calc(1px * var(--ck-image-upload-icon-size));\n\n\t/* Hide completed upload icon after 3 seconds. */\n\tanimation-delay: 0ms, 3000ms;\n\n\t/*\n\t * Use CSS math to simulate container queries.\n\t * https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\n\t */\n\toverflow: hidden;\n\twidth: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\n\theight: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\n\n\t/* This is check icon element made from border-width mixed with animations. */\n\t&::after {\n\t\t/* Because of border transformation we need to "hard code" left position. */\n\t\tleft: 25%;\n\n\t\ttop: 50%;\n\t\topacity: 0;\n\t\theight: 0;\n\t\twidth: 0;\n\n\t\ttransform: scaleX(-1) rotate(135deg);\n\t\ttransform-origin: left top;\n\t\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\t\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\n\t\tanimation-name: ck-upload-complete-icon-check;\n\t\tanimation-duration: 500ms;\n\t\tanimation-delay: 500ms;\n\t\tanimation-fill-mode: forwards;\n\n\t\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\n\t\tbox-sizing: border-box;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-show {\n\tfrom {\n\t\topacity: 0;\n\t}\n\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-hide {\n\tfrom {\n\t\topacity: 1;\n\t}\n\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-check {\n\t0% {\n\t\topacity: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\t33% {\n\t\twidth: 0.3em;\n\t\theight: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t\twidth: 0.3em;\n\t\theight: 0.45em;\n\t}\n}\n'],sourceRoot:""}]);const a=s},3773:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}',"",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageuploadloader.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css"],names:[],mappings:"AAKA,kCAGC,kBAAmB,CADnB,YAAa,CAEb,sBAAuB,CAEvB,MAAO,CALP,iBAAkB,CAIlB,KAOD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCAAyC,CACzC,8CACD,CAEA,iCAGC,QAAS,CADT,UAgBD,CAbC,8CACC,sGACD,CAEA,qCAOC,4DACD,CAGD,kCAEC,WAAY,CADZ,UAWD,CARC,yCAMC,yDAA0D,CAH1D,iBAAkB,CAElB,kCAAmC,CADnC,8DAA+D,CAF/D,+CAAgD,CADhD,8CAMD,CAGD,wCACC,GACC,uBACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-upload-placeholder-loader {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttop: 0;\n\tleft: 0;\n\n\t&::before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\n\t--ck-upload-placeholder-loader-size: 32px;\n\t--ck-upload-placeholder-image-aspect-ratio: 2.8;\n}\n\n.ck .ck-image-upload-placeholder {\n\t/* We need to control the full width of the SVG gray background. */\n\twidth: 100%;\n\tmargin: 0;\n\n\t&.image-inline {\n\t\twidth: calc( 2 * var(--ck-upload-placeholder-loader-size) * var(--ck-upload-placeholder-image-aspect-ratio) );\n\t}\n\n\t& img {\n\t\t/*\n\t\t * This is an arbitrary aspect for a 1x1 px GIF to display to the user. Not too tall, not too short.\n\t\t * There's nothing special about this number except that it should make the image placeholder look like\n\t\t * a real image during this short period after the upload started and before the image was read from the\n\t\t * file system (and a rich preview was loaded).\n\t\t */\n\t\taspect-ratio: var(--ck-upload-placeholder-image-aspect-ratio);\n\t}\n}\n\n.ck .ck-upload-placeholder-loader {\n\twidth: 100%;\n\theight: 100%;\n\n\t&::before {\n\t\twidth: var(--ck-upload-placeholder-loader-size);\n\t\theight: var(--ck-upload-placeholder-loader-size);\n\t\tborder-radius: 50%;\n\t\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\n\t\tborder-right: 2px solid transparent;\n\t\tanimation: ck-upload-placeholder-loader 1s linear infinite;\n\t}\n}\n\n@keyframes ck-upload-placeholder-loader {\n\tto {\n\t\ttransform: rotate( 360deg );\n\t}\n}\n"],sourceRoot:""}]);const a=s},3689:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width .1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageuploadprogress.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css"],names:[],mappings:"AAMC,qEAEC,iBACD,CAGA,uGAIC,MAAO,CAFP,iBAAkB,CAClB,KAED,CCRC,yFACC,oBACD,CAID,uGAIC,gDAAiD,CAFjD,UAAW,CAGX,oBAAuB,CAFvB,OAGD,CAGD,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& .image,\n\t& .image-inline {\n\t\tposition: relative;\n\t}\n\n\t/* Upload progress bar. */\n\t& .image .ck-progress-bar,\n\t& .image-inline .ck-progress-bar {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& .image,\n\t& .image-inline {\n\t\t/* Showing animation. */\n\t\t&.ck-appear {\n\t\t\tanimation: fadeIn 700ms;\n\t\t}\n\t}\n\n\t/* Upload progress bar. */\n\t& .image .ck-progress-bar,\n\t& .image-inline .ck-progress-bar {\n\t\theight: 2px;\n\t\twidth: 0;\n\t\tbackground: var(--ck-color-upload-bar-background);\n\t\ttransition: width 100ms;\n\t}\n}\n\n@keyframes fadeIn {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n"],sourceRoot:""}]);const a=s},1905:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/textalternativeform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-text-alternative-form {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},9773:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{border-right:1px solid var(--ck-color-base-text);height:100%;margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/link.css"],names:[],mappings:"AAMA,sBACC,mDAMD,CAHC,wCACC,yFACD,CAOD,4BACC,8CACD,CAGA,sCAEC,gDAAiD,CADjD,WAAY,CAEZ,iBAAkB,CAClB,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Class added to span element surrounding currently selected link. */\n.ck .ck-link_selected {\n\tbackground: var(--ck-color-link-selected-background);\n\n\t/* Give linked inline images some outline to let the user know they are also part of the link. */\n\t& span.image-inline {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background);\n\t}\n}\n\n/*\n * Classes used by the "fake visual selection" displayed in the content when an input\n * in the link UI has focus (the browser does not render the native selection in this state).\n */\n.ck .ck-fake-link-selection {\n\tbackground: var(--ck-color-link-fake-selection);\n}\n\n/* A collapsed fake visual selection. */\n.ck .ck-fake-link-selection_collapsed {\n\theight: 100%;\n\tborder-right: 1px solid var(--ck-color-base-text);\n\tmargin-right: -1px;\n\toutline: solid 1px hsla(0, 0%, 100%, .5);\n}\n'],sourceRoot:""}]);const a=s},2347:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{color:var(--ck-color-link-default);cursor:pointer;max-width:var(--ck-input-width);min-width:3em;padding:0 var(--ck-spacing-medium);text-align:center;text-overflow:ellipsis}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{max-width:100%;min-width:0}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}","",{version:3,sources:["webpack://./../ckeditor5-link/theme/linkactions.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/linkactions.css"],names:[],mappings:"AAOA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,8CACC,oBAKD,CAHC,gEACC,eACD,CCXD,oCDCD,oBAcE,cAUF,CARE,8CACC,eACD,CAEA,8DACC,cACD,CCrBD,CCIA,wDACC,cAAe,CACf,eAmCD,CAjCC,0EAEC,kCAAmC,CAEnC,cAAe,CAIf,+BAAgC,CAChC,aAAc,CARd,kCAAmC,CASnC,iBAAkB,CAPlB,sBAYD,CAHC,gFACC,yBACD,CAGD,mPAIC,eACD,CAEA,+DACC,eACD,CAGC,gFACC,yBACD,CAWD,qHACC,sCACD,CDtDD,oCC0DC,wDACC,8DAMD,CAJC,0EAEC,cAAe,CADf,WAED,CAGD,gJAME,aAEF,CDzED",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-link-actions__preview {\n\t\tdisplay: inline-block;\n\n\t\t& .ck-button__label {\n\t\t\toverflow: hidden;\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-link-actions__preview {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\t& .ck-button.ck-link-actions__preview {\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\n\t\t& .ck-button__label {\n\t\t\tpadding: 0 var(--ck-spacing-medium);\n\t\t\tcolor: var(--ck-color-link-default);\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: pointer;\n\n\t\t\t/* Match the box model of the link editor form\'s input so the balloon\n\t\t\tdoes not change width when moving between actions and the form. */\n\t\t\tmax-width: var(--ck-input-width);\n\t\t\tmin-width: 3em;\n\t\t\ttext-align: center;\n\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t&,\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tbackground: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&:focus {\n\t\t\t& .ck-button__label {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-button:not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\t& .ck-button.ck-link-actions__preview {\n\t\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-standard) 0;\n\n\t\t\t& .ck-button__label {\n\t\t\t\tmin-width: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},7754:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{min-width:var(--ck-input-width);padding:0}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical>.ck-button{border-radius:0;margin:0;padding:var(--ck-spacing-standard);width:50%}.ck.ck-link-form_layout-vertical>.ck-button:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-link-form_layout-vertical>.ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}","",{version:3,sources:["webpack://./../ckeditor5-link/theme/linkform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/linkform.css"],names:[],mappings:"AAOA,iBACC,YAiBD,CAfC,2BACC,YACD,CCNA,oCDCD,iBAQE,cAUF,CARE,wCACC,eACD,CAEA,4BACC,cACD,CCfD,CDuBD,iCACC,aAYD,CALE,wHAEC,mCACD,CE/BF,iCAEC,+BAAgC,CADhC,SAgDD,CA7CC,wDACC,8EAMD,CAJC,uEACC,WAAY,CACZ,UACD,CAGD,4CAIC,eAAgB,CAFhB,QAAS,CADT,kCAAmC,CAEnC,SAkBD,CAfC,wDACC,gDACD,CARD,4GAeE,aAMF,CAJE,mEACC,kDACD,CAKF,6CACC,yDAUD,CARC,wEACC,SAAU,CACV,UAKD,CAHC,8EACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-form {\n\tdisplay: flex;\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tdisplay: block;\n\n\t/*\n\t * Whether the form is in the responsive mode or not, if there are decorator buttons\n\t * keep the top margin of action buttons medium.\n\t */\n\t& .ck-button {\n\t\t&.ck-button-save,\n\t\t&.ck-button-cancel {\n\t\t\tmargin-top: var(--ck-spacing-medium);\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tpadding: 0;\n\tmin-width: var(--ck-input-width);\n\n\t& .ck-labeled-field-view {\n\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small);\n\n\t\t& .ck-input-text {\n\t\t\tmin-width: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t& > .ck-button {\n\t\tpadding: var(--ck-spacing-standard);\n\t\tmargin: 0;\n\t\twidth: 50%;\n\t\tborder-radius: 0;\n\n\t\t&:not(:focus) {\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\t}\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: 0;\n\n\t\t\t&:last-of-type {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Using additional `.ck` class for stronger CSS specificity than `.ck.ck-link-form > :not(:first-child)`. */\n\t& .ck.ck-list {\n\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\n\n\t\t& .ck-button.ck-switchbutton {\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\n\t\t\t&:hover {\n\t\t\t\tbackground: none;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},4564:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck-content ol{list-style-type:decimal}.ck-content ol ol{list-style-type:lower-latin}.ck-content ol ol ol{list-style-type:lower-roman}.ck-content ol ol ol ol{list-style-type:upper-latin}.ck-content ol ol ol ol ol{list-style-type:upper-roman}.ck-content ul{list-style-type:disc}.ck-content ul ul{list-style-type:circle}.ck-content ul ul ul,.ck-content ul ul ul ul{list-style-type:square}","",{version:3,sources:["webpack://./../ckeditor5-list/theme/list.css"],names:[],mappings:"AAKA,eACC,uBAiBD,CAfC,kBACC,2BAaD,CAXC,qBACC,2BASD,CAPC,wBACC,2BAKD,CAHC,2BACC,2BACD,CAMJ,eACC,oBAaD,CAXC,kBACC,sBASD,CAJE,6CACC,sBACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content ol {\n\tlist-style-type: decimal;\n\n\t& ol {\n\t\tlist-style-type: lower-latin;\n\n\t\t& ol {\n\t\t\tlist-style-type: lower-roman;\n\n\t\t\t& ol {\n\t\t\t\tlist-style-type: upper-latin;\n\n\t\t\t\t& ol {\n\t\t\t\t\tlist-style-type: upper-roman;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck-content ul {\n\tlist-style-type: disc;\n\n\t& ul {\n\t\tlist-style-type: circle;\n\n\t\t& ul {\n\t\t\tlist-style-type: square;\n\n\t\t\t& ul {\n\t\t\t\tlist-style-type: square;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},4652:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck-content .media{clear:both;display:block;margin:.9em 0;min-width:15em}","",{version:3,sources:["webpack://./../ckeditor5-media-embed/theme/mediaembed.css"],names:[],mappings:"AAKA,mBAGC,UAAW,CASX,aAAc,CAJd,aAAe,CAQf,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .media {\n\t/* Don\'t allow floated content overlap the media.\n\thttps://github.com/ckeditor/ckeditor5-media-embed/issues/53 */\n\tclear: both;\n\n\t/* Make sure there is some space between the content and the media. */\n\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\tmargin: 0.9em 0;\n\n\t/* Make sure media is not overriden with Bootstrap default `flex` value.\n\tSee: https://github.com/ckeditor/ckeditor5/issues/1373. */\n\tdisplay: block;\n\n\t/* Give the media some minimal width in the content to prevent them\n\tfrom being "squashed" in tight spaces, e.g. in table cells (#44) */\n\tmin-width: 15em;\n}\n'],sourceRoot:""}]);const a=s},7442:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck-media__wrapper .ck-media__placeholder{align-items:center;display:flex;flex-direction:column}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url{max-width:100%;position:relative}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-media__placeholder__url__text{display:block;overflow:hidden}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck-media__placeholder__icon *{display:none}.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper>:not(.ck-media__placeholder),.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder{pointer-events:none}:root{--ck-media-embed-placeholder-icon-size:3em;--ck-color-media-embed-placeholder-url-text:#757575;--ck-color-media-embed-placeholder-url-text-hover:var(--ck-color-base-text)}.ck-media__wrapper{margin:0 auto}.ck-media__wrapper .ck-media__placeholder{background:var(--ck-color-base-foreground);padding:calc(var(--ck-spacing-standard)*3)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon{background-position:50%;background-size:cover;height:var(--ck-media-embed-placeholder-icon-size);margin-bottom:var(--ck-spacing-large);min-width:var(--ck-media-embed-placeholder-icon-size)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon .ck-icon{height:100%;width:100%}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text{color:var(--ck-color-media-embed-placeholder-url-text);font-style:italic;text-align:center;text-overflow:ellipsis;white-space:nowrap}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:var(--ck-color-media-embed-placeholder-url-text-hover);cursor:pointer;text-decoration:underline}.ck-media__wrapper[data-oembed-url*="open.spotify.com"]{max-height:380px;max-width:300px}.ck-media__wrapper[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Im0yMDYuNDc3IDI2MC45LTI4Ljk4NyAyOC45ODdhNS4yMTggNS4yMTggMCAwIDAgMy43OCAxLjYxaDQ5LjYyMWMxLjY5NCAwIDMuMTktLjc5OCA0LjE0Ni0yLjAzN3oiIGZpbGw9IiM1Yzg4YzUiLz48cGF0aCBkPSJNMjI2Ljc0MiAyMjIuOTg4Yy05LjI2NiAwLTE2Ljc3NyA3LjE3LTE2Ljc3NyAxNi4wMTQuMDA3IDIuNzYyLjY2MyA1LjQ3NCAyLjA5MyA3Ljg3NS40My43MDMuODMgMS40MDggMS4xOSAyLjEwNy4zMzMuNTAyLjY1IDEuMDA1Ljk1IDEuNTA4LjM0My40NzcuNjczLjk1Ny45ODggMS40NCAxLjMxIDEuNzY5IDIuNSAzLjUwMiAzLjYzNyA1LjE2OC43OTMgMS4yNzUgMS42ODMgMi42NCAyLjQ2NiAzLjk5IDIuMzYzIDQuMDk0IDQuMDA3IDguMDkyIDQuNiAxMy45MTR2LjAxMmMuMTgyLjQxMi41MTYuNjY2Ljg3OS42NjcuNDAzLS4wMDEuNzY4LS4zMTQuOTMtLjc5OS42MDMtNS43NTYgMi4yMzgtOS43MjkgNC41ODUtMTMuNzk0Ljc4Mi0xLjM1IDEuNjczLTIuNzE1IDIuNDY1LTMuOTkgMS4xMzctMS42NjYgMi4zMjgtMy40IDMuNjM4LTUuMTY5LjMxNS0uNDgyLjY0NS0uOTYyLjk4OC0xLjQzOS4zLS41MDMuNjE3LTEuMDA2Ljk1LTEuNTA4LjM1OS0uNy43Ni0xLjQwNCAxLjE5LTIuMTA3IDEuNDI2LTIuNDAyIDItNS4xMTQgMi4wMDQtNy44NzUgMC04Ljg0NC03LjUxMS0xNi4wMTQtMTYuNzc2LTE2LjAxNHoiIGZpbGw9IiNkZDRiM2UiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PGVsbGlwc2Ugcnk9IjUuNTY0IiByeD0iNS44MjgiIGN5PSIyMzkuMDAyIiBjeD0iMjI2Ljc0MiIgZmlsbD0iIzgwMmQyNyIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMTkwLjMwMSAyMzcuMjgzYy00LjY3IDAtOC40NTcgMy44NTMtOC40NTcgOC42MDZzMy43ODYgOC42MDcgOC40NTcgOC42MDdjMy4wNDMgMCA0LjgwNi0uOTU4IDYuMzM3LTIuNTE2IDEuNTMtMS41NTcgMi4wODctMy45MTMgMi4wODctNi4yOSAwLS4zNjItLjAyMy0uNzIyLS4wNjQtMS4wNzloLTguMjU3djMuMDQzaDQuODVjLS4xOTcuNzU5LS41MzEgMS40NS0xLjA1OCAxLjk4Ni0uOTQyLjk1OC0yLjAyOCAxLjU0OC0zLjkwMSAxLjU0OC0yLjg3NiAwLTUuMjA4LTIuMzcyLTUuMjA4LTUuMjk5IDAtMi45MjYgMi4zMzItNS4yOTkgNS4yMDgtNS4yOTkgMS4zOTkgMCAyLjYxOC40MDcgMy41ODQgMS4yOTNsMi4zODEtMi4zOGMwLS4wMDItLjAwMy0uMDA0LS4wMDQtLjAwNS0xLjU4OC0xLjUyNC0zLjYyLTIuMjE1LTUuOTU1LTIuMjE1em00LjQzIDUuNjYuMDAzLjAwNnYtLjAwM3oiIGZpbGw9IiNmZmYiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0ibTIxNS4xODQgMjUxLjkyOS03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVhNS4yMzMgNS4yMzMgMCAwIDAgLjQ0OS0yLjEyM3YtMzEuMTY1Yy0uNDY5LjY3NS0uOTM0IDEuMzQ5LTEuMzgyIDIuMDA1LS43OTIgMS4yNzUtMS42ODIgMi42NC0yLjQ2NSAzLjk5LTIuMzQ3IDQuMDY1LTMuOTgyIDguMDM4LTQuNTg1IDEzLjc5NC0uMTYyLjQ4NS0uNTI3Ljc5OC0uOTMuNzk5LS4zNjMtLjAwMS0uNjk3LS4yNTUtLjg3OS0uNjY3di0uMDEyYy0uNTkzLTUuODIyLTIuMjM3LTkuODItNC42LTEzLjkxNC0uNzgzLTEuMzUtMS42NzMtMi43MTUtMi40NjYtMy45OS0xLjEzNy0xLjY2Ni0yLjMyNy0zLjQtMy42MzctNS4xNjlsLS4wMDItLjAwM3oiIGZpbGw9IiNjM2MzYzMiLz48cGF0aCBkPSJtMjEyLjk4MyAyNDguNDk1LTM2Ljk1MiAzNi45NTN2LjgxMmE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOCA1LjIzOGgxLjAxNWwzNS42NjYtMzUuNjY2YTEzNi4yNzUgMTM2LjI3NSAwIDAgMC0yLjc2NC0zLjkgMzcuNTc1IDM3LjU3NSAwIDAgMC0uOTg5LTEuNDQgMzUuMTI3IDM1LjEyNyAwIDAgMC0uOTUtMS41MDhjLS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJtMjExLjk5OCAyNjEuMDgzLTYuMTUyIDYuMTUxIDI0LjI2NCAyNC4yNjRoLjc4MWE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOS01LjIzOHYtMS4wNDV6IiBmaWxsPSIjZmZmIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjwvZz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder{background:#4268b3}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NjcuNDg0IDBINTYuNTE3QzI1LjMwNCAwIDAgMjUuMzA0IDAgNTYuNTE3djkxMC45NjZDMCA5OTguNjk0IDI1LjI5NyAxMDI0IDU2LjUyMiAxMDI0SDU0N1Y2MjhINDE0VjQ3M2gxMzNWMzU5LjAyOWMwLTEzMi4yNjIgODAuNzczLTIwNC4yODIgMTk4Ljc1Ni0yMDQuMjgyIDU2LjUxMyAwIDEwNS4wODYgNC4yMDggMTE5LjI0NCA2LjA4OVYyOTlsLTgxLjYxNi4wMzdjLTYzLjk5MyAwLTc2LjM4NCAzMC40OTItNzYuMzg0IDc1LjIzNlY0NzNoMTUzLjQ4N2wtMTkuOTg2IDE1NUg3MDd2Mzk2aDI2MC40ODRjMzEuMjEzIDAgNTYuNTE2LTI1LjMwMyA1Ni41MTYtNTYuNTE2VjU2LjUxNUMxMDI0IDI1LjMwMyA5OTguNjk3IDAgOTY3LjQ4NCAwIiBmaWxsPSIjRkZGRkZFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#cdf}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder{background:linear-gradient(-135deg,#1400c7,#b800b1,#f50000)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTA0IiBoZWlnaHQ9IjUwNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIC4xNTloNTAzLjg0MVY1MDMuOTRIMHoiLz48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48cGF0aCBkPSJNMjUxLjkyMS4xNTljLTY4LjQxOCAwLTc2Ljk5Ny4yOS0xMDMuODY3IDEuNTE2LTI2LjgxNCAxLjIyMy00NS4xMjcgNS40ODItNjEuMTUxIDExLjcxLTE2LjU2NiA2LjQzNy0zMC42MTUgMTUuMDUxLTQ0LjYyMSAyOS4wNTYtMTQuMDA1IDE0LjAwNi0yMi42MTkgMjguMDU1LTI5LjA1NiA0NC42MjEtNi4yMjggMTYuMDI0LTEwLjQ4NyAzNC4zMzctMTEuNzEgNjEuMTUxQy4yOSAxNzUuMDgzIDAgMTgzLjY2MiAwIDI1Mi4wOGMwIDY4LjQxNy4yOSA3Ni45OTYgMS41MTYgMTAzLjg2NiAxLjIyMyAyNi44MTQgNS40ODIgNDUuMTI3IDExLjcxIDYxLjE1MSA2LjQzNyAxNi41NjYgMTUuMDUxIDMwLjYxNSAyOS4wNTYgNDQuNjIxIDE0LjAwNiAxNC4wMDUgMjguMDU1IDIyLjYxOSA0NC42MjEgMjkuMDU3IDE2LjAyNCA2LjIyNyAzNC4zMzcgMTAuNDg2IDYxLjE1MSAxMS43MDkgMjYuODcgMS4yMjYgMzUuNDQ5IDEuNTE2IDEwMy44NjcgMS41MTYgNjguNDE3IDAgNzYuOTk2LS4yOSAxMDMuODY2LTEuNTE2IDI2LjgxNC0xLjIyMyA0NS4xMjctNS40ODIgNjEuMTUxLTExLjcwOSAxNi41NjYtNi40MzggMzAuNjE1LTE1LjA1MiA0NC42MjEtMjkuMDU3IDE0LjAwNS0xNC4wMDYgMjIuNjE5LTI4LjA1NSAyOS4wNTctNDQuNjIxIDYuMjI3LTE2LjAyNCAxMC40ODYtMzQuMzM3IDExLjcwOS02MS4xNTEgMS4yMjYtMjYuODcgMS41MTYtMzUuNDQ5IDEuNTE2LTEwMy44NjYgMC02OC40MTgtLjI5LTc2Ljk5Ny0xLjUxNi0xMDMuODY3LTEuMjIzLTI2LjgxNC01LjQ4Mi00NS4xMjctMTEuNzA5LTYxLjE1MS02LjQzOC0xNi41NjYtMTUuMDUyLTMwLjYxNS0yOS4wNTctNDQuNjIxLTE0LjAwNi0xNC4wMDUtMjguMDU1LTIyLjYxOS00NC42MjEtMjkuMDU2LTE2LjAyNC02LjIyOC0zNC4zMzctMTAuNDg3LTYxLjE1MS0xMS43MUMzMjguOTE3LjQ0OSAzMjAuMzM4LjE1OSAyNTEuOTIxLjE1OVptMCA0NS4zOTFjNjcuMjY1IDAgNzUuMjMzLjI1NyAxMDEuNzk3IDEuNDY5IDI0LjU2MiAxLjEyIDM3LjkwMSA1LjIyNCA0Ni43NzggOC42NzQgMTEuNzU5IDQuNTcgMjAuMTUxIDEwLjAyOSAyOC45NjYgMTguODQ1IDguODE2IDguODE1IDE0LjI3NSAxNy4yMDcgMTguODQ1IDI4Ljk2NiAzLjQ1IDguODc3IDcuNTU0IDIyLjIxNiA4LjY3NCA0Ni43NzggMS4yMTIgMjYuNTY0IDEuNDY5IDM0LjUzMiAxLjQ2OSAxMDEuNzk4IDAgNjcuMjY1LS4yNTcgNzUuMjMzLTEuNDY5IDEwMS43OTctMS4xMiAyNC41NjItNS4yMjQgMzcuOTAxLTguNjc0IDQ2Ljc3OC00LjU3IDExLjc1OS0xMC4wMjkgMjAuMTUxLTE4Ljg0NSAyOC45NjYtOC44MTUgOC44MTYtMTcuMjA3IDE0LjI3NS0yOC45NjYgMTguODQ1LTguODc3IDMuNDUtMjIuMjE2IDcuNTU0LTQ2Ljc3OCA4LjY3NC0yNi41NiAxLjIxMi0zNC41MjcgMS40NjktMTAxLjc5NyAxLjQ2OS02Ny4yNzEgMC03NS4yMzctLjI1Ny0xMDEuNzk4LTEuNDY5LTI0LjU2Mi0xLjEyLTM3LjkwMS01LjIyNC00Ni43NzgtOC42NzQtMTEuNzU5LTQuNTctMjAuMTUxLTEwLjAyOS0yOC45NjYtMTguODQ1LTguODE1LTguODE1LTE0LjI3NS0xNy4yMDctMTguODQ1LTI4Ljk2Ni0zLjQ1LTguODc3LTcuNTU0LTIyLjIxNi04LjY3NC00Ni43NzgtMS4yMTItMjYuNTY0LTEuNDY5LTM0LjUzMi0xLjQ2OS0xMDEuNzk3IDAtNjcuMjY2LjI1Ny03NS4yMzQgMS40NjktMTAxLjc5OCAxLjEyLTI0LjU2MiA1LjIyNC0zNy45MDEgOC42NzQtNDYuNzc4IDQuNTctMTEuNzU5IDEwLjAyOS0yMC4xNTEgMTguODQ1LTI4Ljk2NiA4LjgxNS04LjgxNiAxNy4yMDctMTQuMjc1IDI4Ljk2Ni0xOC44NDUgOC44NzctMy40NSAyMi4yMTYtNy41NTQgNDYuNzc4LTguNjc0IDI2LjU2NC0xLjIxMiAzNC41MzItMS40NjkgMTAxLjc5OC0xLjQ2OVoiIGZpbGw9IiNGRkYiIG1hc2s9InVybCgjYikiLz48cGF0aCBkPSJNMjUxLjkyMSAzMzYuMDUzYy00Ni4zNzggMC04My45NzQtMzcuNTk2LTgzLjk3NC04My45NzMgMC00Ni4zNzggMzcuNTk2LTgzLjk3NCA4My45NzQtODMuOTc0IDQ2LjM3NyAwIDgzLjk3MyAzNy41OTYgODMuOTczIDgzLjk3NCAwIDQ2LjM3Ny0zNy41OTYgODMuOTczLTgzLjk3MyA4My45NzNabTAtMjEzLjMzOGMtNzEuNDQ3IDAtMTI5LjM2NSA1Ny45MTgtMTI5LjM2NSAxMjkuMzY1IDAgNzEuNDQ2IDU3LjkxOCAxMjkuMzY0IDEyOS4zNjUgMTI5LjM2NCA3MS40NDYgMCAxMjkuMzY0LTU3LjkxOCAxMjkuMzY0LTEyOS4zNjQgMC03MS40NDctNTcuOTE4LTEyOS4zNjUtMTI5LjM2NC0xMjkuMzY1Wk00MTYuNjI3IDExNy42MDRjMCAxNi42OTYtMTMuNTM1IDMwLjIzLTMwLjIzMSAzMC4yMy0xNi42OTUgMC0zMC4yMy0xMy41MzQtMzAuMjMtMzAuMjMgMC0xNi42OTYgMTMuNTM1LTMwLjIzMSAzMC4yMy0zMC4yMzEgMTYuNjk2IDAgMzAuMjMxIDEzLjUzNSAzMC4yMzEgMzAuMjMxIiBmaWxsPSIjRkZGIi8+PC9nPjwvc3ZnPg==)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#ffe0fe}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder{background:linear-gradient(90deg,#71c6f4,#0d70a5)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MDAgNDAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNNDAwIDIwMGMwIDExMC41LTg5LjUgMjAwLTIwMCAyMDBTMCAzMTAuNSAwIDIwMCA4OS41IDAgMjAwIDBzMjAwIDg5LjUgMjAwIDIwMHpNMTYzLjQgMzA1LjVjODguNyAwIDEzNy4yLTczLjUgMTM3LjItMTM3LjIgMC0yLjEgMC00LjItLjEtNi4yIDkuNC02LjggMTcuNi0xNS4zIDI0LjEtMjUtOC42IDMuOC0xNy45IDYuNC0yNy43IDcuNiAxMC02IDE3LjYtMTUuNCAyMS4yLTI2LjctOS4zIDUuNS0xOS42IDkuNS0zMC42IDExLjctOC44LTkuNC0yMS4zLTE1LjItMzUuMi0xNS4yLTI2LjYgMC00OC4yIDIxLjYtNDguMiA0OC4yIDAgMy44LjQgNy41IDEuMyAxMS00MC4xLTItNzUuNi0yMS4yLTk5LjQtNTAuNC00LjEgNy4xLTYuNSAxNS40LTYuNSAyNC4yIDAgMTYuNyA4LjUgMzEuNSAyMS41IDQwLjEtNy45LS4yLTE1LjMtMi40LTIxLjgtNnYuNmMwIDIzLjQgMTYuNiA0Mi44IDM4LjcgNDcuMy00IDEuMS04LjMgMS43LTEyLjcgMS43LTMuMSAwLTYuMS0uMy05LjEtLjkgNi4xIDE5LjIgMjMuOSAzMy4xIDQ1IDMzLjUtMTYuNSAxMi45LTM3LjMgMjAuNi01OS45IDIwLjYtMy45IDAtNy43LS4yLTExLjUtLjcgMjEuMSAxMy44IDQ2LjUgMjEuOCA3My43IDIxLjgiIHN0eWxlPSJmaWxsOiNmZmYiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text{color:#b8e6ff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}',"",{version:3,sources:["webpack://./../ckeditor5-media-embed/theme/mediaembedediting.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-media-embed/mediaembedediting.css"],names:[],mappings:"AAMC,0CAGC,kBAAmB,CAFnB,YAAa,CACb,qBAcD,CAXC,sEAEC,cAAe,CAEf,iBAMD,CAJC,wGAEC,aAAc,CADd,eAED,CAWD,6kBACC,YACD,CAYF,2LACC,mBACD,CC1CA,MACC,0CAA2C,CAE3C,mDAA4D,CAC5D,2EACD,CAEA,mBACC,aA+FD,CA7FC,0CAEC,0CAA2C,CAD3C,0CA6BD,CA1BC,uEAIC,uBAA2B,CAC3B,qBAAsB,CAHtB,kDAAmD,CACnD,qCAAsC,CAFtC,qDAUD,CAJC,gFAEC,WAAY,CADZ,UAED,CAGD,4EACC,sDAAuD,CAGvD,iBAAkB,CADlB,iBAAkB,CAElB,sBAAuB,CAHvB,kBAUD,CALC,kFACC,4DAA6D,CAC7D,cAAe,CACf,yBACD,CAIF,wDAEC,gBAAiB,CADjB,eAED,CAEA,4UAIC,wvGACD,CAEA,2EACC,kBAaD,CAXC,wGACC,orBACD,CAEA,6GACC,UAKD,CAHC,mHACC,UACD,CAIF,4EACC,2DAcD,CAZC,yGACC,4jHACD,CAGA,8GACC,aAKD,CAHC,oHACC,UACD,CAIF,6EAEC,iDAaD,CAXC,0GACC,wiCACD,CAEA,+GACC,aAKD,CAHC,qHACC,UACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-media__wrapper {\n\t& .ck-media__placeholder {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\n\t\t& .ck-media__placeholder__url {\n\t\t\t/* Otherwise the URL will overflow when the content is very narrow. */\n\t\t\tmax-width: 100%;\n\n\t\t\tposition: relative;\n\n\t\t\t& .ck-media__placeholder__url__text {\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="twitter.com"],\n\t&[data-oembed-url*="google.com/maps"],\n\t&[data-oembed-url*="goo.gl/maps"],\n\t&[data-oembed-url*="maps.google.com"],\n\t&[data-oembed-url*="maps.app.goo.gl"],\n\t&[data-oembed-url*="facebook.com"],\n\t&[data-oembed-url*="instagram.com"] {\n\t\t& .ck-media__placeholder__icon * {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/* Disable all mouse interaction as long as the editor is not read–only.\n https://github.com/ckeditor/ckeditor5-media-embed/issues/58 */\n.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper > *:not(.ck-media__placeholder) {\n\tpointer-events: none;\n}\n\n/* Disable all mouse interaction when the widget is not selected (e.g. to avoid opening links by accident).\n https://github.com/ckeditor/ckeditor5-media-embed/issues/18 */\n.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder {\n\tpointer-events: none;\n}\n','/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-media-embed-placeholder-icon-size: 3em;\n\n\t--ck-color-media-embed-placeholder-url-text: hsl(0, 0%, 46%);\n\t--ck-color-media-embed-placeholder-url-text-hover: var(--ck-color-base-text);\n}\n\n.ck-media__wrapper {\n\tmargin: 0 auto;\n\n\t& .ck-media__placeholder {\n\t\tpadding: calc( 3 * var(--ck-spacing-standard) );\n\t\tbackground: var(--ck-color-base-foreground);\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tmin-width: var(--ck-media-embed-placeholder-icon-size);\n\t\t\theight: var(--ck-media-embed-placeholder-icon-size);\n\t\t\tmargin-bottom: var(--ck-spacing-large);\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: cover;\n\n\t\t\t& .ck-icon {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: var(--ck-color-media-embed-placeholder-url-text);\n\t\t\twhite-space: nowrap;\n\t\t\ttext-align: center;\n\t\t\tfont-style: italic;\n\t\t\ttext-overflow: ellipsis;\n\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--ck-color-media-embed-placeholder-url-text-hover);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="open.spotify.com"] {\n\t\tmax-width: 300px;\n\t\tmax-height: 380px;\n\t}\n\n\t&[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon {\n\t\tbackground-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Ik0yMDYuNDc3IDI2MC45bC0yOC45ODcgMjguOTg3YTUuMjE4IDUuMjE4IDAgMCAwIDMuNzggMS42MWg0OS42MjFjMS42OTQgMCAzLjE5LS43OTggNC4xNDYtMi4wMzd6IiBmaWxsPSIjNWM4OGM1Ii8+PHBhdGggZD0iTTIyNi43NDIgMjIyLjk4OGMtOS4yNjYgMC0xNi43NzcgNy4xNy0xNi43NzcgMTYuMDE0LjAwNyAyLjc2Mi42NjMgNS40NzQgMi4wOTMgNy44NzUuNDMuNzAzLjgzIDEuNDA4IDEuMTkgMi4xMDcuMzMzLjUwMi42NSAxLjAwNS45NSAxLjUwOC4zNDMuNDc3LjY3My45NTcuOTg4IDEuNDQgMS4zMSAxLjc2OSAyLjUgMy41MDIgMy42MzcgNS4xNjguNzkzIDEuMjc1IDEuNjgzIDIuNjQgMi40NjYgMy45OSAyLjM2MyA0LjA5NCA0LjAwNyA4LjA5MiA0LjYgMTMuOTE0di4wMTJjLjE4Mi40MTIuNTE2LjY2Ni44NzkuNjY3LjQwMy0uMDAxLjc2OC0uMzE0LjkzLS43OTkuNjAzLTUuNzU2IDIuMjM4LTkuNzI5IDQuNTg1LTEzLjc5NC43ODItMS4zNSAxLjY3My0yLjcxNSAyLjQ2NS0zLjk5IDEuMTM3LTEuNjY2IDIuMzI4LTMuNCAzLjYzOC01LjE2OS4zMTUtLjQ4Mi42NDUtLjk2Mi45ODgtMS40MzkuMy0uNTAzLjYxNy0xLjAwNi45NS0xLjUwOC4zNTktLjcuNzYtMS40MDQgMS4xOS0yLjEwNyAxLjQyNi0yLjQwMiAyLTUuMTE0IDIuMDA0LTcuODc1IDAtOC44NDQtNy41MTEtMTYuMDE0LTE2Ljc3Ni0xNi4wMTR6IiBmaWxsPSIjZGQ0YjNlIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxlbGxpcHNlIHJ5PSI1LjU2NCIgcng9IjUuODI4IiBjeT0iMjM5LjAwMiIgY3g9IjIyNi43NDIiIGZpbGw9IiM4MDJkMjciIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0iTTE5MC4zMDEgMjM3LjI4M2MtNC42NyAwLTguNDU3IDMuODUzLTguNDU3IDguNjA2czMuNzg2IDguNjA3IDguNDU3IDguNjA3YzMuMDQzIDAgNC44MDYtLjk1OCA2LjMzNy0yLjUxNiAxLjUzLTEuNTU3IDIuMDg3LTMuOTEzIDIuMDg3LTYuMjkgMC0uMzYyLS4wMjMtLjcyMi0uMDY0LTEuMDc5aC04LjI1N3YzLjA0M2g0Ljg1Yy0uMTk3Ljc1OS0uNTMxIDEuNDUtMS4wNTggMS45ODYtLjk0Mi45NTgtMi4wMjggMS41NDgtMy45MDEgMS41NDgtMi44NzYgMC01LjIwOC0yLjM3Mi01LjIwOC01LjI5OSAwLTIuOTI2IDIuMzMyLTUuMjk5IDUuMjA4LTUuMjk5IDEuMzk5IDAgMi42MTguNDA3IDMuNTg0IDEuMjkzbDIuMzgxLTIuMzhjMC0uMDAyLS4wMDMtLjAwNC0uMDA0LS4wMDUtMS41ODgtMS41MjQtMy42Mi0yLjIxNS01Ljk1NS0yLjIxNXptNC40MyA1LjY2bC4wMDMuMDA2di0uMDAzeiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjE1LjE4NCAyNTEuOTI5bC03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVjLjI4Ny0uNjQ5LjQ0OS0xLjM2Ni40NDktMi4xMjN2LTMxLjE2NWMtLjQ2OS42NzUtLjkzNCAxLjM0OS0xLjM4MiAyLjAwNS0uNzkyIDEuMjc1LTEuNjgyIDIuNjQtMi40NjUgMy45OS0yLjM0NyA0LjA2NS0zLjk4MiA4LjAzOC00LjU4NSAxMy43OTQtLjE2Mi40ODUtLjUyNy43OTgtLjkzLjc5OS0uMzYzLS4wMDEtLjY5Ny0uMjU1LS44NzktLjY2N3YtLjAxMmMtLjU5My01LjgyMi0yLjIzNy05LjgyLTQuNi0xMy45MTQtLjc4My0xLjM1LTEuNjczLTIuNzE1LTIuNDY2LTMuOTktMS4xMzctMS42NjYtMi4zMjctMy40LTMuNjM3LTUuMTY5bC0uMDAyLS4wMDN6IiBmaWxsPSIjYzNjM2MzIi8+PHBhdGggZD0iTTIxMi45ODMgMjQ4LjQ5NWwtMzYuOTUyIDM2Ljk1M3YuODEyYTUuMjI3IDUuMjI3IDAgMCAwIDUuMjM4IDUuMjM4aDEuMDE1bDM1LjY2Ni0zNS42NjZhMTM2LjI3NSAxMzYuMjc1IDAgMCAwLTIuNzY0LTMuOSAzNy41NzUgMzcuNTc1IDAgMCAwLS45ODktMS40NGMtLjI5OS0uNTAzLS42MTYtMS4wMDYtLjk1LTEuNTA4LS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjExLjk5OCAyNjEuMDgzbC02LjE1MiA2LjE1MSAyNC4yNjQgMjQuMjY0aC43ODFhNS4yMjcgNS4yMjcgMCAwIDAgNS4yMzktNS4yMzh2LTEuMDQ1eiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48L2c+PC9zdmc+);\n\t}\n\n\t&[data-oembed-url*="facebook.com"] .ck-media__placeholder {\n\t\tbackground: hsl(220, 46%, 48%);\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMDI0cHgiIGhlaWdodD0iMTAyNHB4IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPiAgICAgICAgPHRpdGxlPkZpbGwgMTwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImZMb2dvX1doaXRlIiBmaWxsPSIjRkZGRkZFIj4gICAgICAgICAgICA8cGF0aCBkPSJNOTY3LjQ4NCwwIEw1Ni41MTcsMCBDMjUuMzA0LDAgMCwyNS4zMDQgMCw1Ni41MTcgTDAsOTY3LjQ4MyBDMCw5OTguNjk0IDI1LjI5NywxMDI0IDU2LjUyMiwxMDI0IEw1NDcsMTAyNCBMNTQ3LDYyOCBMNDE0LDYyOCBMNDE0LDQ3MyBMNTQ3LDQ3MyBMNTQ3LDM1OS4wMjkgQzU0NywyMjYuNzY3IDYyNy43NzMsMTU0Ljc0NyA3NDUuNzU2LDE1NC43NDcgQzgwMi4yNjksMTU0Ljc0NyA4NTAuODQyLDE1OC45NTUgODY1LDE2MC44MzYgTDg2NSwyOTkgTDc4My4zODQsMjk5LjAzNyBDNzE5LjM5MSwyOTkuMDM3IDcwNywzMjkuNTI5IDcwNywzNzQuMjczIEw3MDcsNDczIEw4NjAuNDg3LDQ3MyBMODQwLjUwMSw2MjggTDcwNyw2MjggTDcwNywxMDI0IEw5NjcuNDg0LDEwMjQgQzk5OC42OTcsMTAyNCAxMDI0LDk5OC42OTcgMTAyNCw5NjcuNDg0IEwxMDI0LDU2LjUxNSBDMTAyNCwyNS4zMDMgOTk4LjY5NywwIDk2Ny40ODQsMCIgaWQ9IkZpbGwtMSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(220, 100%, 90%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="instagram.com"] .ck-media__placeholder {\n\t\tbackground: linear-gradient(-135deg,hsl(246, 100%, 39%),hsl(302, 100%, 36%),hsl(0, 100%, 48%));\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MDRweCIgaGVpZ2h0PSI1MDRweCIgdmlld0JveD0iMCAwIDUwNCA1MDQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+Z2x5cGgtbG9nb19NYXkyMDE2PC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxkZWZzPiAgICAgICAgPHBvbHlnb24gaWQ9InBhdGgtMSIgcG9pbnRzPSIwIDAuMTU5IDUwMy44NDEgMC4xNTkgNTAzLjg0MSA1MDMuOTQgMCA1MDMuOTQiPjwvcG9seWdvbj4gICAgPC9kZWZzPiAgICA8ZyBpZD0iZ2x5cGgtbG9nb19NYXkyMDE2IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJHcm91cC0zIj4gICAgICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+ICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+ICAgICAgICAgICAgPC9tYXNrPiAgICAgICAgICAgIDxnIGlkPSJDbGlwLTIiPjwvZz4gICAgICAgICAgICA8cGF0aCBkPSJNMjUxLjkyMSwwLjE1OSBDMTgzLjUwMywwLjE1OSAxNzQuOTI0LDAuNDQ5IDE0OC4wNTQsMS42NzUgQzEyMS4yNCwyLjg5OCAxMDIuOTI3LDcuMTU3IDg2LjkwMywxMy4zODUgQzcwLjMzNywxOS44MjIgNTYuMjg4LDI4LjQzNiA0Mi4yODIsNDIuNDQxIEMyOC4yNzcsNTYuNDQ3IDE5LjY2Myw3MC40OTYgMTMuMjI2LDg3LjA2MiBDNi45OTgsMTAzLjA4NiAyLjczOSwxMjEuMzk5IDEuNTE2LDE0OC4yMTMgQzAuMjksMTc1LjA4MyAwLDE4My42NjIgMCwyNTIuMDggQzAsMzIwLjQ5NyAwLjI5LDMyOS4wNzYgMS41MTYsMzU1Ljk0NiBDMi43MzksMzgyLjc2IDYuOTk4LDQwMS4wNzMgMTMuMjI2LDQxNy4wOTcgQzE5LjY2Myw0MzMuNjYzIDI4LjI3Nyw0NDcuNzEyIDQyLjI4Miw0NjEuNzE4IEM1Ni4yODgsNDc1LjcyMyA3MC4zMzcsNDg0LjMzNyA4Ni45MDMsNDkwLjc3NSBDMTAyLjkyNyw0OTcuMDAyIDEyMS4yNCw1MDEuMjYxIDE0OC4wNTQsNTAyLjQ4NCBDMTc0LjkyNCw1MDMuNzEgMTgzLjUwMyw1MDQgMjUxLjkyMSw1MDQgQzMyMC4zMzgsNTA0IDMyOC45MTcsNTAzLjcxIDM1NS43ODcsNTAyLjQ4NCBDMzgyLjYwMSw1MDEuMjYxIDQwMC45MTQsNDk3LjAwMiA0MTYuOTM4LDQ5MC43NzUgQzQzMy41MDQsNDg0LjMzNyA0NDcuNTUzLDQ3NS43MjMgNDYxLjU1OSw0NjEuNzE4IEM0NzUuNTY0LDQ0Ny43MTIgNDg0LjE3OCw0MzMuNjYzIDQ5MC42MTYsNDE3LjA5NyBDNDk2Ljg0Myw0MDEuMDczIDUwMS4xMDIsMzgyLjc2IDUwMi4zMjUsMzU1Ljk0NiBDNTAzLjU1MSwzMjkuMDc2IDUwMy44NDEsMzIwLjQ5NyA1MDMuODQxLDI1Mi4wOCBDNTAzLjg0MSwxODMuNjYyIDUwMy41NTEsMTc1LjA4MyA1MDIuMzI1LDE0OC4yMTMgQzUwMS4xMDIsMTIxLjM5OSA0OTYuODQzLDEwMy4wODYgNDkwLjYxNiw4Ny4wNjIgQzQ4NC4xNzgsNzAuNDk2IDQ3NS41NjQsNTYuNDQ3IDQ2MS41NTksNDIuNDQxIEM0NDcuNTUzLDI4LjQzNiA0MzMuNTA0LDE5LjgyMiA0MTYuOTM4LDEzLjM4NSBDNDAwLjkxNCw3LjE1NyAzODIuNjAxLDIuODk4IDM1NS43ODcsMS42NzUgQzMyOC45MTcsMC40NDkgMzIwLjMzOCwwLjE1OSAyNTEuOTIxLDAuMTU5IFogTTI1MS45MjEsNDUuNTUgQzMxOS4xODYsNDUuNTUgMzI3LjE1NCw0NS44MDcgMzUzLjcxOCw0Ny4wMTkgQzM3OC4yOCw0OC4xMzkgMzkxLjYxOSw1Mi4yNDMgNDAwLjQ5Niw1NS42OTMgQzQxMi4yNTUsNjAuMjYzIDQyMC42NDcsNjUuNzIyIDQyOS40NjIsNzQuNTM4IEM0MzguMjc4LDgzLjM1MyA0NDMuNzM3LDkxLjc0NSA0NDguMzA3LDEwMy41MDQgQzQ1MS43NTcsMTEyLjM4MSA0NTUuODYxLDEyNS43MiA0NTYuOTgxLDE1MC4yODIgQzQ1OC4xOTMsMTc2Ljg0NiA0NTguNDUsMTg0LjgxNCA0NTguNDUsMjUyLjA4IEM0NTguNDUsMzE5LjM0NSA0NTguMTkzLDMyNy4zMTMgNDU2Ljk4MSwzNTMuODc3IEM0NTUuODYxLDM3OC40MzkgNDUxLjc1NywzOTEuNzc4IDQ0OC4zMDcsNDAwLjY1NSBDNDQzLjczNyw0MTIuNDE0IDQzOC4yNzgsNDIwLjgwNiA0MjkuNDYyLDQyOS42MjEgQzQyMC42NDcsNDM4LjQzNyA0MTIuMjU1LDQ0My44OTYgNDAwLjQ5Niw0NDguNDY2IEMzOTEuNjE5LDQ1MS45MTYgMzc4LjI4LDQ1Ni4wMiAzNTMuNzE4LDQ1Ny4xNCBDMzI3LjE1OCw0NTguMzUyIDMxOS4xOTEsNDU4LjYwOSAyNTEuOTIxLDQ1OC42MDkgQzE4NC42NSw0NTguNjA5IDE3Ni42ODQsNDU4LjM1MiAxNTAuMTIzLDQ1Ny4xNCBDMTI1LjU2MSw0NTYuMDIgMTEyLjIyMiw0NTEuOTE2IDEwMy4zNDUsNDQ4LjQ2NiBDOTEuNTg2LDQ0My44OTYgODMuMTk0LDQzOC40MzcgNzQuMzc5LDQyOS42MjEgQzY1LjU2NCw0MjAuODA2IDYwLjEwNCw0MTIuNDE0IDU1LjUzNCw0MDAuNjU1IEM1Mi4wODQsMzkxLjc3OCA0Ny45OCwzNzguNDM5IDQ2Ljg2LDM1My44NzcgQzQ1LjY0OCwzMjcuMzEzIDQ1LjM5MSwzMTkuMzQ1IDQ1LjM5MSwyNTIuMDggQzQ1LjM5MSwxODQuODE0IDQ1LjY0OCwxNzYuODQ2IDQ2Ljg2LDE1MC4yODIgQzQ3Ljk4LDEyNS43MiA1Mi4wODQsMTEyLjM4MSA1NS41MzQsMTAzLjUwNCBDNjAuMTA0LDkxLjc0NSA2NS41NjMsODMuMzUzIDc0LjM3OSw3NC41MzggQzgzLjE5NCw2NS43MjIgOTEuNTg2LDYwLjI2MyAxMDMuMzQ1LDU1LjY5MyBDMTEyLjIyMiw1Mi4yNDMgMTI1LjU2MSw0OC4xMzkgMTUwLjEyMyw0Ny4wMTkgQzE3Ni42ODcsNDUuODA3IDE4NC42NTUsNDUuNTUgMjUxLjkyMSw0NS41NSBaIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiBtYXNrPSJ1cmwoI21hc2stMikiPjwvcGF0aD4gICAgICAgIDwvZz4gICAgICAgIDxwYXRoIGQ9Ik0yNTEuOTIxLDMzNi4wNTMgQzIwNS41NDMsMzM2LjA1MyAxNjcuOTQ3LDI5OC40NTcgMTY3Ljk0NywyNTIuMDggQzE2Ny45NDcsMjA1LjcwMiAyMDUuNTQzLDE2OC4xMDYgMjUxLjkyMSwxNjguMTA2IEMyOTguMjk4LDE2OC4xMDYgMzM1Ljg5NCwyMDUuNzAyIDMzNS44OTQsMjUyLjA4IEMzMzUuODk0LDI5OC40NTcgMjk4LjI5OCwzMzYuMDUzIDI1MS45MjEsMzM2LjA1MyBaIE0yNTEuOTIxLDEyMi43MTUgQzE4MC40NzQsMTIyLjcxNSAxMjIuNTU2LDE4MC42MzMgMTIyLjU1NiwyNTIuMDggQzEyMi41NTYsMzIzLjUyNiAxODAuNDc0LDM4MS40NDQgMjUxLjkyMSwzODEuNDQ0IEMzMjMuMzY3LDM4MS40NDQgMzgxLjI4NSwzMjMuNTI2IDM4MS4yODUsMjUyLjA4IEMzODEuMjg1LDE4MC42MzMgMzIzLjM2NywxMjIuNzE1IDI1MS45MjEsMTIyLjcxNSBaIiBpZD0iRmlsbC00IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgICAgICA8cGF0aCBkPSJNNDE2LjYyNywxMTcuNjA0IEM0MTYuNjI3LDEzNC4zIDQwMy4wOTIsMTQ3LjgzNCAzODYuMzk2LDE0Ny44MzQgQzM2OS43MDEsMTQ3LjgzNCAzNTYuMTY2LDEzNC4zIDM1Ni4xNjYsMTE3LjYwNCBDMzU2LjE2NiwxMDAuOTA4IDM2OS43MDEsODcuMzczIDM4Ni4zOTYsODcuMzczIEM0MDMuMDkyLDg3LjM3MyA0MTYuNjI3LDEwMC45MDggNDE2LjYyNywxMTcuNjA0IiBpZD0iRmlsbC01IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgIDwvZz48L3N2Zz4=);\n\t\t}\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(302, 100%, 94%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder {\n\t\t/* Use gradient to contrast with focused widget (ckeditor/ckeditor5-media-embed#22). */\n\t\tbackground: linear-gradient( to right, hsl(201, 85%, 70%), hsl(201, 85%, 35%) );\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IldoaXRlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQwMCA0MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDB7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MDAsMjAwYzAsMTEwLjUtODkuNSwyMDAtMjAwLDIwMFMwLDMxMC41LDAsMjAwUzg5LjUsMCwyMDAsMFM0MDAsODkuNSw0MDAsMjAweiBNMTYzLjQsMzA1LjVjODguNywwLDEzNy4yLTczLjUsMTM3LjItMTM3LjJjMC0yLjEsMC00LjItMC4xLTYuMmM5LjQtNi44LDE3LjYtMTUuMywyNC4xLTI1Yy04LjYsMy44LTE3LjksNi40LTI3LjcsNy42YzEwLTYsMTcuNi0xNS40LDIxLjItMjYuN2MtOS4zLDUuNS0xOS42LDkuNS0zMC42LDExLjdjLTguOC05LjQtMjEuMy0xNS4yLTM1LjItMTUuMmMtMjYuNiwwLTQ4LjIsMjEuNi00OC4yLDQ4LjJjMCwzLjgsMC40LDcuNSwxLjMsMTFjLTQwLjEtMi03NS42LTIxLjItOTkuNC01MC40Yy00LjEsNy4xLTYuNSwxNS40LTYuNSwyNC4yYzAsMTYuNyw4LjUsMzEuNSwyMS41LDQwLjFjLTcuOS0wLjItMTUuMy0yLjQtMjEuOC02YzAsMC4yLDAsMC40LDAsMC42YzAsMjMuNCwxNi42LDQyLjgsMzguNyw0Ny4zYy00LDEuMS04LjMsMS43LTEyLjcsMS43Yy0zLjEsMC02LjEtMC4zLTkuMS0wLjljNi4xLDE5LjIsMjMuOSwzMy4xLDQ1LDMzLjVjLTE2LjUsMTIuOS0zNy4zLDIwLjYtNTkuOSwyMC42Yy0zLjksMC03LjctMC4yLTExLjUtMC43QzExMC44LDI5Ny41LDEzNi4yLDMwNS41LDE2My40LDMwNS41Ii8+PC9zdmc+);\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(201, 100%, 86%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},9292:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-media-form{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-media-form .ck-labeled-field-view{display:inline-block}.ck.ck-media-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-media-form{flex-wrap:wrap}.ck.ck-media-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-media-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./../ckeditor5-media-embed/theme/mediaform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,kBAEC,sBAAuB,CADvB,YAAa,CAEb,kBAAmB,CACnB,gBAqBD,CAnBC,yCACC,oBACD,CAEA,4BACC,YACD,CCbA,oCDCD,kBAeE,cAUF,CARE,yCACC,eACD,CAEA,6BACC,cACD,CCtBD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-media-form {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},1613:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2)}.ck .ck-insert-table-dropdown__label,.ck[dir=rtl] .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{border:1px solid var(--ck-color-base-border);border-radius:1px;margin:var(--ck-insert-table-dropdown-box-margin);min-height:var(--ck-insert-table-dropdown-box-height);min-width:var(--ck-insert-table-dropdown-box-width);outline:none;transition:none}.ck .ck-insert-table-dropdown-grid-box:focus{box-shadow:none}.ck .ck-insert-table-dropdown-grid-box.ck-on{background:var(--ck-color-focus-outer-shadow);border-color:var(--ck-color-focus-border)}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/inserttable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/inserttable.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,cACD,CCJA,MACC,uCAAwC,CACxC,0CAA2C,CAC3C,yCAA0C,CAC1C,yCACD,CAEA,oCAGC,yFAA0F,CAD1F,oJAED,CAEA,mFAEC,iBACD,CAEA,uCAIC,4CAA6C,CAC7C,iBAAkB,CAFlB,iDAAkD,CADlD,qDAAsD,CADtD,mDAAoD,CAKpD,YAAa,CACb,eAUD,CARC,6CACC,eACD,CAEA,6CAEC,6CAA8C,CAD9C,yCAED",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-insert-table-dropdown__grid {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-insert-table-dropdown-padding: 10px;\n\t--ck-insert-table-dropdown-box-height: 11px;\n\t--ck-insert-table-dropdown-box-width: 12px;\n\t--ck-insert-table-dropdown-box-margin: 1px;\n}\n\n.ck .ck-insert-table-dropdown__grid {\n\t/* The width of a container should match 10 items in a row so there will be a 10x10 grid. */\n\twidth: calc(var(--ck-insert-table-dropdown-box-width) * 10 + var(--ck-insert-table-dropdown-box-margin) * 20 + var(--ck-insert-table-dropdown-padding) * 2);\n\tpadding: var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;\n}\n\n.ck .ck-insert-table-dropdown__label,\n.ck[dir=rtl] .ck-insert-table-dropdown__label {\n\ttext-align: center;\n}\n\n.ck .ck-insert-table-dropdown-grid-box {\n\tmin-width: var(--ck-insert-table-dropdown-box-width);\n\tmin-height: var(--ck-insert-table-dropdown-box-height);\n\tmargin: var(--ck-insert-table-dropdown-box-margin);\n\tborder: 1px solid var(--ck-color-base-border);\n\tborder-radius: 1px;\n\toutline: none;\n\ttransition: none;\n\n\t&:focus {\n\t\tbox-shadow: none;\n\t}\n\n\t&.ck-on {\n\t\tborder-color: var(--ck-color-focus-border);\n\t\tbackground: var(--ck-color-focus-outer-shadow);\n\t}\n}\n\n"],sourceRoot:""}]);const a=s},6306:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck-content .table{display:table;margin:.9em auto}.ck-content .table table{border:1px double #b3b3b3;border-collapse:collapse;border-spacing:0;height:100%;width:100%}.ck-content .table table td,.ck-content .table table th{border:1px solid #bfbfbf;min-width:2em;padding:.4em}.ck-content .table table th{background:rgba(0,0,0,.05);font-weight:700}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/table.css"],names:[],mappings:"AAKA,mBAKC,aAAc,CADd,gBAiCD,CA9BC,yBAYC,yBAAkC,CAVlC,wBAAyB,CACzB,gBAAiB,CAKjB,WAAY,CADZ,UAsBD,CAfC,wDAQC,wBAAiC,CANjC,aAAc,CACd,YAMD,CAEA,4BAEC,0BAA+B,CAD/B,eAED,CAMF,+BACC,gBACD,CAEA,+BACC,eACD,CAEA,+CAKC,oBAAqB,CAMrB,UACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .table {\n\t/* Give the table widget some air and center it horizontally */\n\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\tmargin: 0.9em auto;\n\tdisplay: table;\n\n\t& table {\n\t\t/* The table cells should have slight borders */\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\n\t\t/* Table width and height are set on the parent
    . Make sure the table inside stretches\n\t\tto the full dimensions of the container (https://github.com/ckeditor/ckeditor5/issues/6186). */\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\t/* The outer border of the table should be slightly darker than the inner lines.\n\t\tAlso see https://github.com/ckeditor/ckeditor5-table/issues/50. */\n\t\tborder: 1px double hsl(0, 0%, 70%);\n\n\t\t& td,\n\t\t& th {\n\t\t\tmin-width: 2em;\n\t\t\tpadding: .4em;\n\n\t\t\t/* The border is inherited from .ck-editor__nested-editable styles, so theoretically it\'s not necessary here.\n\t\t\tHowever, the border is a content style, so it should use .ck-content (so it works outside the editor).\n\t\t\tHence, the duplication. See https://github.com/ckeditor/ckeditor5/issues/6314 */\n\t\t\tborder: 1px solid hsl(0, 0%, 75%);\n\t\t}\n\n\t\t& th {\n\t\t\tfont-weight: bold;\n\t\t\tbackground: hsla(0, 0%, 0%, 5%);\n\t\t}\n\t}\n}\n\n/* Text alignment of the table header should match the editor settings and override the native browser styling,\nwhen content is available outside the editor. See https://github.com/ckeditor/ckeditor5/issues/6638 */\n.ck-content[dir="rtl"] .table th {\n\ttext-align: right;\n}\n\n.ck-content[dir="ltr"] .table th {\n\ttext-align: left;\n}\n\n.ck-editor__editable .ck-table-bogus-paragraph {\n\t/*\n\t * Use display:inline-block to force Chrome/Safari to limit text mutations to this element.\n\t * See https://github.com/ckeditor/ckeditor5/issues/6062.\n\t */\n\tdisplay: inline-block;\n\n\t/*\n\t * Inline HTML elements nested in the span should always be dimensioned in relation to the whole cell width.\n\t * See https://github.com/ckeditor/ckeditor5/issues/9117.\n\t */\n\twidth: 100%;\n}\n'],sourceRoot:""}]);const a=s},3881:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-table-focused-cell-background:rgba(158,201,250,.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tableediting.css"],names:[],mappings:"AAKA,MACC,6DACD,CAKE,8QAGC,wDAAyD,CAKzD,iBAAkB,CAClB,8CAA+C,CAC/C,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-table-focused-cell-background: hsla(212, 90%, 80%, .3);\n}\n\n.ck-widget.table {\n\t& td,\n\t& th {\n\t\t&.ck-editor__nested-editable.ck-editor__nested-editable_focused,\n\t\t&.ck-editor__nested-editable:focus {\n\t\t\t/* A very slight background to highlight the focused cell */\n\t\t\tbackground: var(--ck-color-table-focused-cell-background);\n\n\t\t\t/* Fixes the problem where surrounding cells cover the focused cell's border.\n\t\t\tIt does not fix the problem in all places but the UX is improved.\n\t\t\tSee https://github.com/ckeditor/ckeditor5-table/issues/29. */\n\t\t\tborder-style: none;\n\t\t\toutline: 1px solid var(--ck-color-focus-border);\n\t\t\toutline-offset: -1px; /* progressive enhancement - no IE support */\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},6945:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,':root{--ck-table-selected-cell-background:rgba(158,207,250,.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{box-shadow:unset;caret-color:transparent;outline:unset;position:relative}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{background-color:var(--ck-table-selected-cell-background);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}',"",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tableselection.css"],names:[],mappings:"AAKA,MACC,wDACD,CAGC,0IAKC,gBAAiB,CAFjB,uBAAwB,CACxB,aAAc,CAFd,iBAiCD,CA3BC,sJAGC,yDAA0D,CAK1D,QAAS,CAPT,UAAW,CAKX,MAAO,CAJP,mBAAoB,CAEpB,iBAAkB,CAGlB,OAAQ,CAFR,KAID,CAEA,wTAEC,4BACD,CAMA,gKACC,aAKD,CAHC,0NACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-table-selected-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck.ck-editor__editable .table table {\n\t& td.ck-editor__editable_selected,\n\t& th.ck-editor__editable_selected {\n\t\tposition: relative;\n\t\tcaret-color: transparent;\n\t\toutline: unset;\n\t\tbox-shadow: unset;\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/6446 */\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tpointer-events: none;\n\t\t\tbackground-color: var(--ck-table-selected-cell-background);\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t& ::selection,\n\t\t&:focus {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t/*\n\t\t * To reduce the amount of noise, all widgets in the table selection have no outline and no selection handle.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9491.\n\t\t */\n\t\t& .ck-widget {\n\t\t\toutline: unset;\n\n\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},4906:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-button,a.ck.ck-button{align-items:center;display:inline-flex;justify-content:left;position:relative;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{-webkit-appearance:none;border:1px solid transparent;cursor:default;font-size:inherit;line-height:1;min-height:var(--ck-ui-component-min-height);min-width:var(--ck-ui-component-min-height);padding:var(--ck-spacing-tiny);text-align:center;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;vertical-align:middle;white-space:nowrap}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{color:inherit;cursor:inherit;font-size:inherit;font-weight:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{font-weight:700;opacity:.7}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:var(--ck-spacing-small);margin-right:calc(var(--ck-spacing-small)*-1)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{color:var(--ck-color-button-on-color)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/button/button.css","webpack://./../ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/button.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/mixins/_button.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AAOA,6BAMC,kBAAmB,CADnB,mBAAoB,CAEpB,oBAAqB,CAHrB,iBAAkB,CCFlB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBDkBD,CAdC,iEACC,YACD,CAGC,yGACC,oBACD,CAID,iFACC,sBACD,CEjBD,6BCAC,oDD4ID,CCzIE,6EACC,0DACD,CAEA,+EACC,2DACD,CAID,qDACC,6DACD,CDfD,6BEDC,eF6ID,CA5IA,wIEGE,qCFyIF,CA5IA,6BA6BC,uBAAwB,CANxB,4BAA6B,CAjB7B,cAAe,CAcf,iBAAkB,CAHlB,aAAc,CAJd,4CAA6C,CAD7C,2CAA4C,CAJ5C,8BAA+B,CAC/B,iBAAkB,CAiBlB,4DAA8D,CAnB9D,qBAAsB,CAFtB,kBAuID,CA7GC,oFGhCA,2BAA2B,CCF3B,2CAA8B,CDC9B,YHqCA,CAIC,kJAEC,aACD,CAGD,iEAIC,aAAc,CACd,cAAe,CAHf,iBAAkB,CAClB,mBAAoB,CAMpB,qBASD,CAlBA,qFAYE,eAMF,CAlBA,qFAgBE,gBAEF,CAEA,yEACC,aAYD,CAbA,6FAIE,mCASF,CAbA,6FAQE,oCAKF,CAbA,yEAWC,eAAiB,CACjB,UACD,CAIC,oIIrFD,oDJyFC,CAOA,gLKhGD,kCLkGC,CAEA,iGACC,UACD,CAGD,qEACC,yDAcD,CAXC,2HAEE,4CAA+C,CAC/C,oCAOF,CAVA,2HAQE,mCAAoC,CADpC,6CAGF,CAKA,mHACC,WACD,CAID,yCC/HA,+CDmIA,CChIC,yFACC,qDACD,CAEA,2FACC,sDACD,CAID,iEACC,wDACD,CDgHA,yCAGC,qCACD,CAEA,2DACC,iCACD,CAEA,+DACC,mCACD,CAID,2CC/IC,mDDoJD,CCjJE,2FACC,yDACD,CAEA,6FACC,0DACD,CAID,mEACC,4DACD,CDgID,2CAIC,wCACD,CAEA,uCAEC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-unselectable;\n\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: left;\n\n\t& .ck-button__label {\n\t\tdisplay: none;\n\t}\n\n\t&.ck-button_with-text {\n\t\t& .ck-button__label {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n\n\t/* Center the icon horizontally in a button without text. */\n\t&:not(.ck-button_with-text) {\n\t\tjustify-content: center;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../mixins/_button.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-button-colors --ck-color-button-default;\n\t@mixin ck-rounded-corners;\n\n\twhite-space: nowrap;\n\tcursor: default;\n\tvertical-align: middle;\n\tpadding: var(--ck-spacing-tiny);\n\ttext-align: center;\n\n\t/* A very important piece of styling. Go to variable declaration to learn more. */\n\tmin-width: var(--ck-ui-component-min-height);\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Normalize the height of the line. Removing this will break consistent height\n\tamong text and text-less buttons (with icons). */\n\tline-height: 1;\n\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t/* Avoid flickering when the foucs border shows up. */\n\tborder: 1px solid transparent;\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .2s ease-in-out, border .2s ease-in-out;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/189 */\n\t-webkit-appearance: none;\n\n\t&:active,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t/* Allow icon coloring using the text "color" property. */\n\t& .ck-button__icon {\n\t\t& use,\n\t\t& use * {\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\n\t& .ck-button__label {\n\t\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\t\tfont-size: inherit;\n\t\tfont-weight: inherit;\n\t\tcolor: inherit;\n\t\tcursor: inherit;\n\n\t\t/* Must be consistent with .ck-icon\'s vertical align. Otherwise, buttons with and\n\t\twithout labels (but with icons) have different sizes in Chrome */\n\t\tvertical-align: middle;\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& .ck-button__keystroke {\n\t\tcolor: inherit;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t}\n\n\t\tfont-weight: bold;\n\t\topacity: .7;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t&.ck-disabled {\n\t\t&:active,\n\t\t&:focus {\n\t\t\t/* The disabled button should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t\t& .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t& .ck-button__keystroke {\n\t\t\topacity: .3;\n\t\t}\n\t}\n\n\t&.ck-button_with-text {\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-standard);\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-button_with-keystroke {\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__label {\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t/* A style of the button which is currently on, e.g. its feature is active. */\n\t&.ck-on {\n\t\t@mixin ck-button-colors --ck-color-button-on;\n\n\t\tcolor: var(--ck-color-button-on-color);\n\t}\n\n\t&.ck-button-save {\n\t\tcolor: var(--ck-color-button-save);\n\t}\n\n\t&.ck-button-cancel {\n\t\tcolor: var(--ck-color-button-cancel);\n\t}\n}\n\n/* A style of the button which handles the primary action. */\n.ck.ck-button-action,\na.ck.ck-button-action {\n\t@mixin ck-button-colors --ck-color-button-action;\n\n\tcolor: var(--ck-color-button-action-text);\n}\n\n.ck.ck-button-bold,\na.ck.ck-button-bold {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements a button of given background color.\n *\n * @param {String} $background - Background color of the button.\n * @param {String} $border - Border color of the button.\n */\n@define-mixin ck-button-colors $prefix {\n\tbackground: var($(prefix)-background);\n\n\t&:not(.ck-disabled) {\n\t\t&:hover {\n\t\t\tbackground: var($(prefix)-hover-background);\n\t\t}\n\n\t\t&:active {\n\t\t\tbackground: var($(prefix)-active-background);\n\t\t}\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t&.ck-disabled {\n\t\tbackground: var($(prefix)-disabled-background);\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},5332:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:calc(1.07692em + 1px);--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - 2px);--ck-switch-button-inner-hover-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton,.ck.ck-button.ck-switchbutton.ck-on:active,.ck.ck-button.ck-switchbutton.ck-on:focus,.ck.ck-button.ck-switchbutton.ck-on:hover,.ck.ck-button.ck-switchbutton:active,.ck.ck-button.ck-switchbutton:focus,.ck.ck-button.ck-switchbutton:hover{background:transparent;color:inherit}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{background:var(--ck-color-switch-button-off-background);border:1px solid transparent;transition:background .4s ease,box-shadow .2s ease-in-out,outline .2s ease-in-out;width:var(--ck-switch-button-toggle-width)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(var(--ck-border-radius)*.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{background:var(--ck-color-switch-button-inner-background);height:var(--ck-switch-button-toggle-inner-size);transition:all .3s ease;width:var(--ck-switch-button-toggle-inner-size)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:var(--ck-switch-button-inner-hover-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton:focus{border-color:transparent;box-shadow:none;outline:none}.ck.ck-button.ck-switchbutton:focus .ck-button__toggle{box-shadow:0 0 0 1px var(--ck-color-base-background),0 0 0 5px var(--ck-color-focus-outer-shadow);outline:var(--ck-focus-ring);outline-offset:1px}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var( --ck-switch-button-translation ))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(var( --ck-switch-button-translation )*-1))}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/button/switchbutton.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/switchbutton.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AASE,4HACC,aACD,CCCF,MAEC,8CAA+C,CAE/C,0DAAgE,CAChE,2HAIC,CACD,0FACD,CAOC,0QAEC,sBAAuB,CADvB,aAED,CAEA,0DAGE,4CAOF,CAVA,0DAQE,2CAEF,CAEA,iDCpCA,eD4EA,CAxCA,yIChCC,qCDwED,CAxCA,2DAKE,gBAmCF,CAxCA,2DAUE,iBA8BF,CAxCA,iDAkBC,uDAAwD,CAFxD,4BAA6B,CAD7B,iFAAsF,CAEtF,0CAuBD,CApBC,2ECxDD,eDmEC,CAXA,6LCpDA,qCAAsC,CDsDpC,8CASF,CAXA,2EAOC,yDAA0D,CAD1D,gDAAiD,CAIjD,uBAA0B,CAL1B,+CAMD,CAEA,uDACC,6DAKD,CAHC,iFACC,qDACD,CAIF,6DEhFA,kCFkFA,CAGA,oCACC,wBAAyB,CAEzB,eAAgB,CADhB,YAQD,CALC,uDACC,iGAAmG,CAEnG,4BAA6B,CAD7B,kBAED,CAKA,uDACC,sDAkBD,CAhBC,6DACC,4DACD,CAEA,2FAKE,2DAMF,CAXA,2FASE,oEAEF",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__toggle {\n\t\tdisplay: block;\n\n\t\t& .ck-button__toggle__inner {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/* Note: To avoid rendering issues (aliasing) but to preserve the responsive nature\nof the component, floating–point numbers have been used which, for the default font size\n(see: --ck-font-size-base), will generate simple integers. */\n:root {\n\t/* 34px at 13px font-size */\n\t--ck-switch-button-toggle-width: 2.6153846154em;\n\t/* 14px at 13px font-size */\n\t--ck-switch-button-toggle-inner-size: calc(1.0769230769em + 1px);\n\t--ck-switch-button-translation: calc(\n\t\tvar(--ck-switch-button-toggle-width) -\n\t\tvar(--ck-switch-button-toggle-inner-size) -\n\t\t2px /* Border */\n\t);\n\t--ck-switch-button-inner-hover-shadow: 0 0 0 5px var(--ck-color-switch-button-inner-shadow);\n}\n\n.ck.ck-button.ck-switchbutton {\n\t/* Unlike a regular button, the switch button text color and background should never change.\n\t * Changing toggle switch (background, outline) is enough to carry the information about the\n\t * state of the entire component (https://github.com/ckeditor/ckeditor5/issues/12519)\n\t */\n\t&, &:hover, &:focus, &:active, &.ck-on:hover, &.ck-on:focus, &.ck-on:active {\n\t\tcolor: inherit;\n\t\tbackground: transparent;\n\t}\n\n\t& .ck-button__label {\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-right: calc(2 * var(--ck-spacing-large));\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-left: calc(2 * var(--ck-spacing-large));\n\t\t}\n\t}\n\n\t& .ck-button__toggle {\n\t\t@mixin ck-rounded-corners;\n\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Make sure the toggle is always to the right as far as possible. */\n\t\t\tmargin-left: auto;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Make sure the toggle is always to the left as far as possible. */\n\t\t\tmargin-right: auto;\n\t\t}\n\n\t\t/* Apply some smooth transition to the box-shadow and border. */\n\t\t/* Gently animate the background color of the toggle switch */\n\t\ttransition: background 400ms ease, box-shadow .2s ease-in-out, outline .2s ease-in-out;\n\t\tborder: 1px solid transparent;\n\t\twidth: var(--ck-switch-button-toggle-width);\n\t\tbackground: var(--ck-color-switch-button-off-background);\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: calc(.5 * var(--ck-border-radius));\n\t\t\t}\n\n\t\t\twidth: var(--ck-switch-button-toggle-inner-size);\n\t\t\theight: var(--ck-switch-button-toggle-inner-size);\n\t\t\tbackground: var(--ck-color-switch-button-inner-background);\n\n\t\t\t/* Gently animate the inner part of the toggle switch */\n\t\t\ttransition: all 300ms ease;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-off-hover-background);\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\tbox-shadow: var(--ck-switch-button-inner-hover-shadow);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-button__toggle {\n\t\t@mixin ck-disabled;\n\t}\n\n\t/* Overriding default .ck-button:focus styles + an outline around the toogle */\n\t&:focus {\n\t\tborder-color: transparent;\n\t\toutline: none;\n\t\tbox-shadow: none;\n\n\t\t& .ck-button__toggle {\n\t\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-background), 0 0 0 5px var(--ck-color-focus-outer-shadow);\n\t\t\toutline-offset: 1px;\n\t\t\toutline: var(--ck-focus-ring);\n\t\t}\n\t}\n\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-on {\n\t\t& .ck-button__toggle {\n\t\t\tbackground: var(--ck-color-switch-button-on-background);\n\n\t\t\t&:hover {\n\t\t\t\tbackground: var(--ck-color-switch-button-on-hover-background);\n\t\t\t}\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\t/*\n\t\t\t\t* Move the toggle switch to the right. It will be animated.\n\t\t\t\t*/\n\t\t\t\t@mixin ck-dir ltr {\n\t\t\t\t\ttransform: translateX( var( --ck-switch-button-translation ) );\n\t\t\t\t}\n\n\t\t\t\t@mixin ck-dir rtl {\n\t\t\t\t\ttransform: translateX( calc( -1 * var( --ck-switch-button-translation ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},6781:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#166fd4}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{border:0;height:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;width:var(--ck-color-grid-tile-size)}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-table__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{color:var(--ck-color-color-grid-check-icon);display:none}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/colorgrid/colorgrid.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorgrid/colorgrid.css"],names:[],mappings:"AAKA,kBACC,YACD,CCAA,MACC,8BAA+B,CAK/B,wCACD,CAEA,kBACC,YAAa,CACb,WACD,CAEA,wBAOC,QAAS,CALT,qCAAsC,CAEtC,yCAA0C,CAD1C,wCAAyC,CAEzC,SAAU,CACV,8BAA+B,CAL/B,oCAyCD,CAjCC,oCACC,YAAa,CACb,gBACD,CAEA,4DACC,gDACD,CAEA,oCAEC,2CAA4C,CAD5C,YAED,CAEA,8BACC,8FAKD,CAHC,0CACC,aACD,CAGD,8HAIC,QACD,CAEA,gGAEC,iGACD,CAGD,yBACC,oCACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-color-grid {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-grid-tile-size: 24px;\n\n\t/* Not using global colors here because these may change but some colors in a pallette\n\t * require special treatment. For instance, this ensures no matter what the UI text color is,\n\t * the check icon will look good on the black color tile. */\n\t--ck-color-color-grid-check-icon: hsl(212, 81%, 46%);\n}\n\n.ck.ck-color-grid {\n\tgrid-gap: 5px;\n\tpadding: 8px;\n}\n\n.ck.ck-color-grid__tile {\n\twidth: var(--ck-color-grid-tile-size);\n\theight: var(--ck-color-grid-tile-size);\n\tmin-width: var(--ck-color-grid-tile-size);\n\tmin-height: var(--ck-color-grid-tile-size);\n\tpadding: 0;\n\ttransition: .2s ease box-shadow;\n\tborder: 0;\n\n\t&.ck-disabled {\n\t\tcursor: unset;\n\t\ttransition: unset;\n\t}\n\n\t&.ck-color-table__color-tile_bordered {\n\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\tdisplay: none;\n\t\tcolor: var(--ck-color-color-grid-check-icon);\n\t}\n\n\t&.ck-on {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-base-text);\n\n\t\t& .ck.ck-icon {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t&.ck-on,\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\t/* Disable the default .ck-button\'s border ring. */\n\t\tborder: 0;\n\t}\n\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\n\t}\n}\n\n.ck.ck-color-grid__label {\n\tpadding: 0 var(--ck-spacing-standard);\n}\n'],sourceRoot:""}]);const a=s},5485:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-dropdown-max-width:75vw}.ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-dropdown__panel{display:none;max-width:var(--ck-dropdown-max-width);position:absolute;z-index:var(--ck-z-modal)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{bottom:auto;top:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-modal) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{margin-left:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{overflow:hidden;text-overflow:ellipsis;width:7em}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;box-shadow:var(--ck-drop-shadow),0 0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dropdown/dropdown.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/dropdown.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,MACC,4BACD,CAEA,gBACC,oBAAqB,CACrB,iBA2ED,CAzEC,oCACC,mBAAoB,CACpB,2BACD,CAGA,+CACC,UACD,CAEA,oCACC,YAAa,CAEb,sCAAuC,CAEvC,iBAAkB,CAHlB,yBA4DD,CAvDC,+DACC,oBACD,CAEA,mSAKC,WACD,CAEA,mSAUC,WAAY,CADZ,QAED,CAEA,oHAEC,MACD,CAEA,oHAEC,OACD,CAEA,kHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAQF,mCACC,mCACD,CCpFA,MACC,sDACD,CAEA,gBAEC,iBA2ED,CAzEC,oCACC,mCACD,CAGC,8CAIC,sCAAuC,CAHvC,gCAID,CAIA,8CACC,+BAAgC,CAGhC,oCACD,CAGD,gDC/BA,kCDiCA,CAIE,mFAEC,oCACD,CAIA,mFAEC,qCACD,CAID,iEAEC,eAAgB,CAChB,sBAAuB,CAFvB,SAGD,CAGA,6EC1DD,kCD4DC,CAGA,qDACC,2BAA4B,CAC5B,4BACD,CAEA,sGACC,UACD,CAGA,yHAEC,eAKD,CAHC,qIE7EF,2CF+EE,CAKH,uBGlFC,eH8GD,CA5BA,qFG9EE,qCH0GF,CA5BA,uBAIC,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CE1FT,oCAA8B,CF6F9B,cAmBD,CAfC,6CACC,wBACD,CAEA,6CACC,yBACD,CAEA,6CACC,2BACD,CAEA,6CACC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-dropdown-max-width: 75vw;\n}\n\n.ck.ck-dropdown {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t& .ck-dropdown__arrow {\n\t\tpointer-events: none;\n\t\tz-index: var(--ck-z-default);\n\t}\n\n\t/* Dropdown button should span horizontally, e.g. in vertical toolbars */\n\t& .ck-button.ck-dropdown__button {\n\t\twidth: 100%;\n\t}\n\n\t& .ck-dropdown__panel {\n\t\tdisplay: none;\n\t\tz-index: var(--ck-z-modal);\n\t\tmax-width: var(--ck-dropdown-max-width);\n\n\t\tposition: absolute;\n\n\t\t&.ck-dropdown__panel-visible {\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_n,\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_nme {\n\t\t\tbottom: 100%;\n\t\t}\n\n\t\t&.ck-dropdown__panel_se,\n\t\t&.ck-dropdown__panel_sw,\n\t\t&.ck-dropdown__panel_smw,\n\t\t&.ck-dropdown__panel_sme,\n\t\t&.ck-dropdown__panel_s {\n\t\t\t/*\n\t\t\t * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays.\n\t\t\t * See https://github.com/ckeditor/ckeditor5/issues/1053.\n\t\t\t */\n\t\t\ttop: 100%;\n\t\t\tbottom: auto;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_se {\n\t\t\tleft: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_sw {\n\t\t\tright: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_s,\n\t\t&.ck-dropdown__panel_n {\n\t\t\t/* Positioning panels relative to the center of the button */\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_smw {\n\t\t\t/* Positioning panels relative to the middle-west of the button */\n\t\t\tleft: 75%;\n\t\t\ttransform: translateX(-75%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nme,\n\t\t&.ck-dropdown__panel_sme {\n\t\t\t/* Positioning panels relative to the middle-east of the button */\n\t\t\tleft: 25%;\n\t\t\ttransform: translateX(-25%);\n\t\t}\n\t}\n}\n\n/*\n * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content.\n * See https://github.com/ckeditor/ckeditor5/issues/7874\n */\n.ck.ck-toolbar .ck-dropdown__panel {\n\tz-index: calc( var(--ck-z-modal) + 1 );\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-dropdown-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-dropdown {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-dropdown__arrow {\n\t\twidth: var(--ck-dropdown-arrow-size);\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-dropdown__arrow {\n\t\t\tright: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-dropdown__arrow {\n\t\t\tleft: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-dropdown__arrow {\n\t\t@mixin ck-disabled;\n\t}\n\n\t& .ck-button.ck-dropdown__button {\n\t\t@mixin ck-dir ltr {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t/* #23 */\n\t\t& .ck-button__label {\n\t\t\twidth: 7em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t\t&.ck-disabled .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/816 */\n\t\t&.ck-on {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t&.ck-dropdown__button_label-width_auto .ck-button__label {\n\t\t\twidth: auto;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/8699 */\n\t\t&.ck-off:active,\n\t\t&.ck-on:active {\n\t\t\tbox-shadow: none;\n\t\t\t\n\t\t\t&:focus {\n\t\t\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-dropdown__panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tbackground: var(--ck-color-dropdown-panel-background);\n\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\tbottom: 0;\n\n\t/* Make sure the panel is at least as wide as the drop-down\'s button. */\n\tmin-width: 100%;\n\n\t/* Disabled corner border radius to be consistent with the .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-dropdown__panel_se {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_sw {\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_ne {\n\t\tborder-bottom-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_nw {\n\t\tborder-bottom-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3949:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-dropdown .ck-dropdown__panel .ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list,.ck.ck-dropdown .ck-dropdown__panel .ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/listdropdown.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,6CCIC,eDqBD,CAzBA,iICQE,qCAAsC,CDJtC,wBAqBF,CAfE,mFCND,eDYC,CANA,6MCFA,qCAAsC,CDKpC,2BAA4B,CAC5B,4BAA6B,CAF7B,wBAIF,CAEA,kFCdD,eDmBC,CALA,2MCVA,qCAAsC,CDYpC,wBAAyB,CACzB,yBAEF",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-dropdown .ck-dropdown__panel .ck-list {\n\t/* Disabled radius of top-left border to be consistent with .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t/* Make sure the button belonging to the first/last child of the list goes well with the\n\tborder radius of the entire panel. */\n\t& .ck-list__item {\n\t\t&:first-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\n\t\t&:last-child .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},7686:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-right-radius:unset;border-top-right-radius:unset}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-left-radius:unset;border-top-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-left-radius:unset;border-top-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-right-radius:unset;border-top-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton>.ck-splitbutton__arrow:not(:focus){border-bottom-width:0;border-top-width:0}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{background-color:var(--ck-color-split-button-hover-border);content:"";height:100%;position:absolute;width:1px}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:focus:after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:focus:after{--ck-color-split-button-hover-border:var(--ck-color-focus-border)}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{left:-1px}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{right:-1px}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}',"",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dropdown/splitbutton.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/splitbutton.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,mBAEC,iBAKD,CAHC,iDACC,qCACD,CCJD,MACC,gDAAyD,CACzD,4CACD,CAMC,oIAKE,gCAAiC,CADjC,6BASF,CAbA,oIAWE,+BAAgC,CADhC,4BAGF,CAEA,0CAGC,eAiBD,CApBA,oDAQE,+BAAgC,CADhC,4BAaF,CApBA,oDAcE,gCAAiC,CADjC,6BAOF,CAHC,8CACC,mCACD,CAKD,sDAEC,qBAAwB,CADxB,kBAED,CAQC,0KACC,wDACD,CAIA,8JAKC,0DAA2D,CAJ3D,UAAW,CAGX,WAAY,CAFZ,iBAAkB,CAClB,SAGD,CAGA,sIACC,iEACD,CAGC,kLACC,SACD,CAIA,kLACC,UACD,CAMF,uCCzFA,eDmGA,CAVA,qHCrFC,qCD+FD,CARE,qKACC,2BACD,CAEA,mKACC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-splitbutton {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-splitbutton__action:focus {\n\t\tz-index: calc(var(--ck-z-default) + 1);\n\t}\n}\n\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-split-button-hover-background: hsl(0, 0%, 92%);\n\t--ck-color-split-button-hover-border: hsl(0, 0%, 70%);\n}\n\n.ck.ck-splitbutton {\n\t/*\n\t * Note: ck-rounded and ck-dir mixins don\'t go together (because they both use @nest).\n\t */\n\t&:hover > .ck-splitbutton__action,\n\t&.ck-splitbutton_open > .ck-splitbutton__action {\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the action button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the action button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\t}\n\n\t& > .ck-splitbutton__arrow {\n\t\t/* It\'s a text-less button and since the icon is positioned absolutely in such situation,\n\t\tit must get some arbitrary min-width. */\n\t\tmin-width: unset;\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the arrow button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the arrow button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t& svg {\n\t\t\twidth: var(--ck-dropdown-arrow-size);\n\t\t}\n\t}\n\n\t/* Make sure the divider stretches 100% height of the button\n\thttps://github.com/ckeditor/ckeditor5/issues/10936 */\n\t& > .ck-splitbutton__arrow:not(:focus) {\n\t\tborder-top-width: 0px;\n\t\tborder-bottom-width: 0px;\n\t}\n\n\t/* When the split button is "open" (the arrow is on) or being hovered, it should get some styling\n\tas a whole. The background of both buttons should stand out and there should be a visual\n\tseparation between both buttons. */\n\t&.ck-splitbutton_open,\n\t&:hover {\n\t\t/* When the split button hovered as a whole, not as individual buttons. */\n\t\t& > .ck-button:not(.ck-on):not(.ck-disabled):not(:hover) {\n\t\t\tbackground: var(--ck-color-split-button-hover-background);\n\t\t}\n\n\t\t/* Splitbutton separator needs to be set with the ::after pseudoselector\n\t\tto display properly the borders on focus */\n\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\tcontent: \'\';\n\t\t\tposition: absolute;\n\t\t\twidth: 1px;\n\t\t\theight: 100%;\n\t\t\tbackground-color: var(--ck-color-split-button-hover-border);\n\t\t}\n\n\t\t/* Make sure the divider between the buttons looks fine when the button is focused */\n\t\t& > .ck-splitbutton__arrow:focus::after {\n\t\t\t--ck-color-split-button-hover-border: var(--ck-color-focus-border);\n\t\t}\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\t\tleft: -1px;\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\t\tright: -1px;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Don\'t round the bottom left and right corners of the buttons when "open"\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-splitbutton_open {\n\t\t@mixin ck-rounded-corners {\n\t\t\t& > .ck-splitbutton__action {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t& > .ck-splitbutton__arrow {\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},7339:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{max-width:var(--ck-toolbar-dropdown-max-width);width:max-content}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dropdown/toolbardropdown.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/toolbardropdown.css"],names:[],mappings:"AAKA,MACC,oCACD,CAEA,4CAGC,8CAA+C,CAD/C,iBAQD,CAJE,6DACC,qCACD,CCZF,oCACC,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-dropdown-max-width: 60vw;\n}\n\n.ck.ck-toolbar-dropdown > .ck-dropdown__panel {\n\t/* https://github.com/ckeditor/ckeditor5/issues/5586 */\n\twidth: max-content;\n\tmax-width: var(--ck-toolbar-dropdown-max-width);\n\n\t& .ck-button {\n\t\t&:focus {\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-toolbar-dropdown .ck-toolbar {\n\tborder: 0;\n}\n"],sourceRoot:""}]);const a=s},9688:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable.ck-rounded-corners:not(.ck-editor__nested-editable){border-radius:var(--ck-border-radius)}.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable){border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck.ck-editor__editable_inline{border:1px solid transparent;overflow:auto;padding:0 var(--ck-spacing-standard)}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-base-foreground)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-base-foreground)}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/editorui.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAWA,MACC,0CACD,CAEA,yDCJC,eDWD,CAPA,yJCAE,qCDOF,CAJC,oEEPA,2BAA2B,CCF3B,qCAA8B,CDC9B,YFWA,CAGD,+BAGC,4BAA6B,CAF7B,aAAc,CACd,oCA6BD,CA1BC,wCACC,eACD,CAEA,wCACC,gBACD,CAGA,4CACC,kCACD,CAGA,2CAKC,qCACD,CAGA,sDACC,kDACD,CAKA,gEACC,mDACD,CAIA,gEACC,gDACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_focus.css";\n@import "../../mixins/_button.css";\n\n:root {\n\t--ck-color-editable-blur-selection: hsl(0, 0%, 85%);\n}\n\n.ck.ck-editor__editable:not(.ck-editor__nested-editable) {\n\t@mixin ck-rounded-corners;\n\n\t&.ck-focused {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\t}\n}\n\n.ck.ck-editor__editable_inline {\n\toverflow: auto;\n\tpadding: 0 var(--ck-spacing-standard);\n\tborder: 1px solid transparent;\n\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/116 */\n\t& > *:first-child {\n\t\tmargin-top: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/847 */\n\t& > *:last-child {\n\t\t/*\n\t\t * This value should match with the default margins of the block elements (like .media or .image)\n\t\t * to avoid a content jumping when the fake selection container shows up (See https://github.com/ckeditor/ckeditor5/issues/9825).\n\t\t */\n\t\tmargin-bottom: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/6517 */\n\t&.ck-blurred ::selection {\n\t\tbackground: var(--ck-color-editable-blur-selection);\n\t}\n}\n\n/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/111 */\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_n"] {\n\t&::after {\n\t\tborder-bottom-color: var(--ck-color-base-foreground);\n\t}\n}\n\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_s"] {\n\t&::after {\n\t\tborder-top-color: var(--ck-color-base-foreground);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},8847:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-form__header{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{border-bottom:1px solid var(--ck-color-base-border);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);padding:var(--ck-spacing-small) var(--ck-spacing-large)}.ck.ck-form__header .ck-form__header__label{font-weight:700}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/formheader/formheader.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/formheader/formheader.css"],names:[],mappings:"AAKA,oBAIC,kBAAmB,CAHnB,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CAEjB,6BACD,CCNA,MACC,4BACD,CAEA,oBAIC,mDAAoD,CAFpD,mCAAoC,CACpC,wCAAyC,CAFzC,uDAQD,CAHC,4CACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-form-header-height: 38px;\n}\n\n.ck.ck-form__header {\n\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\n\theight: var(--ck-form-header-height);\n\tline-height: var(--ck-form-header-height);\n\tborder-bottom: 1px solid var(--ck-color-base-border);\n\n\t& .ck-form__header__label {\n\t\tfont-weight: bold;\n\t}\n}\n"],sourceRoot:""}]);const a=s},6574:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{font-size:.8333350694em;height:var(--ck-icon-size);width:var(--ck-icon-size);will-change:transform}.ck.ck-icon,.ck.ck-icon *{cursor:inherit}.ck.ck-icon.ck-icon_inherit-color,.ck.ck-icon.ck-icon_inherit-color *{color:inherit}.ck.ck-icon.ck-icon_inherit-color :not([fill]){fill:currentColor}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/icon/icon.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/icon/icon.css"],names:[],mappings:"AAKA,YACC,qBACD,CCFA,MACC,0EACD,CAEA,YAKC,uBAAwB,CAHxB,0BAA2B,CAD3B,yBAA0B,CAU1B,qBAoBD,CAlBC,0BALA,cAQA,CAMC,sEACC,aAMD,CAJC,+CAEC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-icon {\n\tvertical-align: middle;\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-icon-size: calc(var(--ck-line-height-base) * var(--ck-font-size-normal));\n}\n\n.ck.ck-icon {\n\twidth: var(--ck-icon-size);\n\theight: var(--ck-icon-size);\n\n\t/* Multiplied by the height of the line in "px" should give SVG "viewport" dimensions */\n\tfont-size: .8333350694em;\n\n\t/* Inherit cursor style (#5). */\n\tcursor: inherit;\n\n\t/* This will prevent blurry icons on Firefox. See #340. */\n\twill-change: transform;\n\n\t& * {\n\t\t/* Inherit cursor style (#5). */\n\t\tcursor: inherit;\n\t}\n\n\t/* Allows dynamic coloring of an icon by inheriting its color from the parent. */\n\t&.ck-icon_inherit-color {\n\t\tcolor: inherit;\n\n\t\t& * {\n\t\t\tcolor: inherit;\n\n\t\t\t&:not([fill]) {\n\t\t\t\t/* Needed by FF. */\n\t\t\t\tfill: currentColor;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},4879:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-input-width:18em;--ck-input-text-width:var(--ck-input-width)}.ck.ck-input{border-radius:0}.ck-rounded-corners .ck.ck-input,.ck.ck-input.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);min-height:var(--ck-ui-component-min-height);min-width:var(--ck-input-width);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-input[readonly]{background:var(--ck-color-input-disabled-background);border:1px solid var(--ck-color-input-disabled-border);color:var(--ck-color-input-disabled-text)}.ck.ck-input[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input.ck-error{animation:ck-input-shake .3s ease both;border-color:var(--ck-color-input-error-border)}.ck.ck-input.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/input/input.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AASA,MACC,qBAAsB,CAGtB,2CACD,CAEA,aCLC,eD2CD,CAtCA,iECDE,qCDuCF,CAtCA,aAGC,2CAA4C,CAC5C,6CAA8C,CAK9C,4CAA6C,CAH7C,+BAAgC,CADhC,6DAA8D,CAO9D,4DA0BD,CAxBC,mBEnBA,2BAA2B,CCF3B,2CAA8B,CDC9B,YFuBA,CAEA,uBAEC,oDAAqD,CADrD,sDAAuD,CAEvD,yCAMD,CAJC,6BG/BD,oDHkCC,CAGD,sBAEC,sCAAuC,CADvC,+CAMD,CAHC,4BGzCD,iDH2CC,CAIF,0BACC,IACC,0BACD,CAEA,IACC,yBACD,CAEA,IACC,0BACD,CAEA,IACC,yBACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-input-width: 18em;\n\n\t/* Backward compatibility. */\n\t--ck-input-text-width: var(--ck-input-width);\n}\n\n.ck.ck-input {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-input-background);\n\tborder: 1px solid var(--ck-color-input-border);\n\tpadding: var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);\n\tmin-width: var(--ck-input-width);\n\n\t/* This is important to stay of the same height as surrounding buttons */\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .1s ease-in-out, border .1s ease-in-out;\n\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t&[readonly] {\n\t\tborder: 1px solid var(--ck-color-input-disabled-border);\n\t\tbackground: var(--ck-color-input-disabled-background);\n\t\tcolor: var(--ck-color-input-disabled-text);\n\n\t\t&:focus {\n\t\t\t/* The read-only input should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\tborder-color: var(--ck-color-input-error-border);\n\t\tanimation: ck-input-shake .3s ease both;\n\n\t\t&:focus {\n\t\t\t@mixin ck-box-shadow var(--ck-focus-error-outer-shadow);\n\t\t}\n\t}\n}\n\n@keyframes ck-input-shake {\n\t20% {\n\t\ttransform: translateX(-2px);\n\t}\n\n\t40% {\n\t\ttransform: translateX(2px);\n\t}\n\n\t60% {\n\t\ttransform: translateX(-1px);\n\t}\n\n\t80% {\n\t\ttransform: translateX(1px);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},3662:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/label/label.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/label/label.css"],names:[],mappings:"AAKA,aACC,aACD,CAEA,mBACC,YACD,CCNA,aACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tdisplay: block;\n}\n\n.ck.ck-voice-label {\n\tdisplay: none;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tfont-weight: bold;\n}\n"],sourceRoot:""}]);const a=s},2577:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-labeled-field-label-default-position-x:var(--ck-spacing-medium);--ck-labeled-field-label-default-position-y:calc(var(--ck-font-size-base)*0.6);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{background:var(--ck-color-labeled-field-label-background);font-weight:400;line-height:normal;max-width:100%;overflow:hidden;padding:0 calc(var(--ck-font-size-tiny)*.5);pointer-events:none;text-overflow:ellipsis;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);transform-origin:0 0;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-labeled-field-label-default-position-x),var(--ck-labeled-field-label-default-position-y)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-labeled-field-label-default-position-x)*-1),var(--ck-labeled-field-label-default-position-y)) scale(1)}.ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{background:transparent;max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/labeledfield/labeledfieldview.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAMC,mEACC,YAAa,CACb,iBACD,CAEA,uCACC,aAAc,CACd,iBACD,CCND,MACC,kEAAsE,CACtE,gFAAiF,CACjF,oEAAqE,CACrE,8EAAiF,CACjF,yEACD,CAEA,0BCLC,eD8GD,CAzGA,2FCDE,qCD0GF,CAtGC,mEACC,UAmCD,CAjCC,gFACC,KA+BD,CAhCA,0FAIE,MA4BF,CAhCA,0FAQE,OAwBF,CAhCA,gFAiBC,yDAA0D,CAG1D,eAAmB,CADnB,kBAAoB,CAOpB,cAAe,CAFf,eAAgB,CANhB,2CAA8C,CAP9C,mBAAoB,CAYpB,sBAAuB,CARvB,6DAA+D,CAH/D,oBAAqB,CAgBrB,+JAID,CAQA,mKACC,gCACD,CAGD,yDACC,mCAAoC,CACpC,kCAAmC,CAInC,kBAKD,CAHC,6FACC,gCACD,CAID,4OAEC,yCACD,CAIA,oUAGE,+HAYF,CAfA,oUAOE,wIAQF,CAfA,gTAaC,sBAAuB,CAFvB,iEAAkE,CAGlE,SACD,CAKA,8FACC,sBACD,CAGA,yIACC,SACD,CAGA,kMACC,8HACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-labeled-field-view {\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\tdisplay: flex;\n\t\tposition: relative;\n\t}\n\n\t& .ck.ck-label {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-labeled-field-view-transition: .1s cubic-bezier(0, 0, 0.24, 0.95);\n\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-spacing-medium);\n\t--ck-labeled-field-label-default-position-x: var(--ck-spacing-medium);\n\t--ck-labeled-field-label-default-position-y: calc(0.6 * var(--ck-font-size-base));\n\t--ck-color-labeled-field-label-background: var(--ck-color-base-background);\n}\n\n.ck.ck-labeled-field-view {\n\t@mixin ck-rounded-corners;\n\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\twidth: 100%;\n\n\t\t& > .ck.ck-label {\n\t\t\ttop: 0px;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tleft: 0px;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tright: 0px;\n\t\t\t}\n\n\t\t\tpointer-events: none;\n\t\t\ttransform-origin: 0 0;\n\n\t\t\t/* By default, display the label scaled down above the field. */\n\t\t\ttransform: translate(var(--ck-spacing-medium), -6px) scale(.75);\n\n\t\t\tbackground: var(--ck-color-labeled-field-label-background);\n\t\t\tpadding: 0 calc(.5 * var(--ck-font-size-tiny));\n\t\t\tline-height: initial;\n\t\t\tfont-weight: normal;\n\n\t\t\t/* Prevent overflow when the label is longer than the input */\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\n\t\t\tmax-width: 100%;\n\n\t\t\ttransition:\n\t\t\t\ttransform var(--ck-labeled-field-view-transition),\n\t\t\t\tpadding var(--ck-labeled-field-view-transition),\n\t\t\t\tbackground var(--ck-labeled-field-view-transition);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\t& > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\n\t\t& .ck-input:not([readonly]) + .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t& .ck-labeled-field-view__status {\n\t\tfont-size: var(--ck-font-size-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\n\t\t/* Let the info wrap to the next line to avoid stretching the layout horizontally.\n\t\tThe status could be very long. */\n\t\twhite-space: normal;\n\n\t\t&.ck-labeled-field-view__status_error {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t/* Disabled fields and fields that have no focus should fade out. */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\tcolor: var(--ck-color-input-disabled-text);\n\t}\n\n\t/* Fields that are disabled or not focused and without a placeholder should have full-sized labels. */\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-disabled.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t@mixin ck-dir ltr {\n\t\t\ttransform: translate(var(--ck-labeled-field-label-default-position-x), var(--ck-labeled-field-label-default-position-y)) scale(1);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttransform: translate(calc(-1 * var(--ck-labeled-field-label-default-position-x)), var(--ck-labeled-field-label-default-position-y)) scale(1);\n\t\t}\n\n\t\t/* Compensate for the default translate position. */\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width));\n\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t}\n\n\t/*------ DropdownView integration ----------------------------------------------------------------------------------- */\n\n\t/* Make sure dropdown\' background color in any of dropdown\'s state does not collide with labeled field. */\n\t& > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck.ck-button {\n\t\tbackground: transparent;\n\t}\n\n\t/* When the dropdown is "empty", the labeled field label replaces its label. */\n\t&.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck-button > .ck-button__label {\n\t\topacity: 0;\n\t}\n\n\t/* Make sure the label of the empty, unfocused input does not cover the dropdown arrow. */\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown + .ck-label {\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard));\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},1046:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-list{display:flex;flex-direction:column;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{background:var(--ck-color-list-background);list-style-type:none}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{border-radius:0;min-height:unset;padding:calc(var(--ck-line-height-base)*.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*.4*var(--ck-font-size-base));text-align:left;width:100%}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(var(--ck-line-height-base)*1.2*var(--ck-font-size-base))}.ck.ck-list__item .ck-button:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item .ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item .ck-button.ck-on:focus:not(.ck-switchbutton):not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item .ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item .ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item .ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck.ck-list__separator{background:var(--ck-color-base-border);height:1px;width:100%}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/list/list.css","webpack://./../ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/list/list.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,YAGC,YAAa,CACb,qBAAsB,CCFtB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBDaD,CAZC,2DAEC,aACD,CAKA,kCACC,iBAAkB,CAClB,2BACD,CEfD,YCEC,eDGD,CALA,+DCME,qCDDF,CALA,YAIC,0CAA2C,CAD3C,oBAED,CAEA,kBACC,cAAe,CACf,cA2DD,CAzDC,6BAIC,eAAgB,CAHhB,gBAAiB,CAQjB,iIAEiE,CARjE,eAAgB,CADhB,UAwCD,CA7BC,+CAEC,yEACD,CAEA,oCACC,eACD,CAEA,mCACC,oDAAqD,CACrD,yCAaD,CAXC,0CACC,eACD,CAEA,2DACC,0DACD,CAEA,iFACC,4CACD,CAGD,qDACC,uDACD,CAMA,yCACC,0CAA2C,CAC3C,aAMD,CAJC,iEACC,uDAAwD,CACxD,aACD,CAKH,uBAGC,sCAAuC,CAFvC,UAAW,CACX,UAED",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-list {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t& .ck-list__item,\n\t& .ck-list__separator {\n\t\tdisplay: block;\n\t}\n\n\t/* Make sure that whatever child of the list item gets focus, it remains on the\n\ttop. Thanks to that, styles like box-shadow, outline, etc. are not masked by\n\tadjacent list items. */\n\t& .ck-list__item > *:focus {\n\t\tposition: relative;\n\t\tz-index: var(--ck-z-default);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-list {\n\t@mixin ck-rounded-corners;\n\n\tlist-style-type: none;\n\tbackground: var(--ck-color-list-background);\n}\n\n.ck.ck-list__item {\n\tcursor: default;\n\tmin-width: 12em;\n\n\t& .ck-button {\n\t\tmin-height: unset;\n\t\twidth: 100%;\n\t\ttext-align: left;\n\t\tborder-radius: 0;\n\n\t\t/* List items should have the same height. Use absolute units to make sure it is so\n\t\t because e.g. different heading styles may have different height\n\t\t https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\tpadding:\n\t\t\tcalc(.2 * var(--ck-line-height-base) * var(--ck-font-size-base))\n\t\t\tcalc(.4 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\n\t\t& .ck-button__label {\n\t\t\t/* https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\t\tline-height: calc(1.2 * var(--ck-line-height-base) * var(--ck-font-size-base));\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-button-on-background);\n\t\t\tcolor: var(--ck-color-list-button-on-text);\n\n\t\t\t&:active {\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-on-background-focus);\n\t\t\t}\n\n\t\t\t&:focus:not(.ck-switchbutton):not(.ck-disabled) {\n\t\t\t\tborder-color: var(--ck-color-base-background);\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(.ck-disabled) {\n\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t}\n\t}\n\n\t/* It\'s unnecessary to change the background/text of a switch toggle; it has different ways\n\tof conveying its state (like the switcher) */\n\t& .ck-switchbutton {\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-background);\n\t\t\tcolor: inherit;\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-list__separator {\n\theight: 1px;\n\twidth: 100%;\n\tbackground: var(--ck-color-base-border);\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},8793:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-modal)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-border-width:1px;--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{background:var(--ck-color-panel-background);border:var(--ck-balloon-border-width) solid var(--ck-color-panel-border);box-shadow:var(--ck-drop-shadow),0 0;min-height:15px}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{border-style:solid;height:0;width:0}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-width:0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_n]:before{border-color:transparent transparent var(--ck-color-panel-border) transparent;margin-top:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_n]:after{border-color:transparent transparent var(--ck-color-panel-background) transparent;margin-top:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-width:var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-color:var(--ck-color-panel-border) transparent transparent;filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow));margin-bottom:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_s]:after{border-color:var(--ck-color-panel-background) transparent transparent transparent;margin-bottom:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_e]:after,.ck.ck-balloon-panel[class*=arrow_e]:before{border-width:var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_e]:before{border-color:transparent transparent transparent var(--ck-color-panel-border);margin-right:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_e]:after{border-color:transparent transparent transparent var(--ck-color-panel-background);margin-right:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_w]:after,.ck.ck-balloon-panel[class*=arrow_w]:before{border-width:var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0}.ck.ck-balloon-panel[class*=arrow_w]:before{border-color:transparent var(--ck-color-panel-border) transparent transparent;margin-left:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_w]:after{border-color:transparent var(--ck-color-panel-background) transparent transparent;margin-left:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);right:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%;top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:before{margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);right:calc(var(--ck-balloon-arrow-height)*-1);top:50%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:before{left:calc(var(--ck-balloon-arrow-height)*-1);margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);top:50%}',"",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/balloonpanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonpanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MAEC,8DACD,CAEA,qBACC,YAAa,CACb,iBAAkB,CAElB,yBAyCD,CAtCE,+GAEC,UAAW,CACX,iBACD,CAEA,wDACC,6CACD,CAEA,uDACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAGD,8CACC,aACD,CC9CD,MACC,6BAA8B,CAC9B,6BAA8B,CAC9B,8BAA+B,CAC/B,iCAAkC,CAClC,oEACD,CAEA,qBCLC,eDmMD,CA9LA,iFCDE,qCD+LF,CA9LA,qBAMC,2CAA4C,CAC5C,wEAAyE,CEdzE,oCAA8B,CFW9B,eA0LD,CApLE,+GAIC,kBAAmB,CADnB,QAAS,CADT,OAGD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,kDACD,CAEA,2CACC,iFAAkF,CAClF,gFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,iEAAkE,CAClE,uDAAwD,CACxD,qDACD,CAEA,2CACC,iFAAkF,CAClF,mFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,oDACD,CAEA,2CACC,iFAAkF,CAClF,kFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,mDACD,CAEA,2CACC,iFAAkF,CAClF,iFACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,2CACD,CAIA,2GAEC,+CAAkD,CAClD,2CACD,CAIA,2GAEC,gDAAmD,CACnD,2CACD,CAIA,yGAIC,8CAAiD,CAFjD,QAAS,CACT,uDAED,CAIA,2GAGC,8CAAiD,CADjD,+CAED,CAIA,2GAGC,8CAAiD,CADjD,gDAED,CAIA,6GAIC,8CAAiD,CADjD,uDAA0D,CAD1D,SAGD,CAIA,6GAIC,8CAAiD,CAFjD,QAAS,CACT,sDAED,CAIA,6GAGC,uDAA0D,CAD1D,SAAU,CAEV,2CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,2CACD,CAIA,yGAGC,sDAAyD,CADzD,6CAAgD,CAEhD,OACD,CAIA,yGAEC,4CAA+C,CAC/C,sDAAyD,CACzD,OACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Make sure the balloon arrow does not float over its children. */\n\t--ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3);\n}\n\n.ck.ck-balloon-panel {\n\tdisplay: none;\n\tposition: absolute;\n\n\tz-index: var(--ck-z-modal);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_visible {\n\t\tdisplay: block;\n\t}\n}\n','/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-border-width: 1px;\n\t--ck-balloon-arrow-offset: 2px;\n\t--ck-balloon-arrow-height: 10px;\n\t--ck-balloon-arrow-half-width: 8px;\n\t--ck-balloon-arrow-drop-shadow: 0 2px 2px var(--ck-color-shadow-drop);\n}\n\n.ck.ck-balloon-panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: var(--ck-balloon-border-width) solid var(--ck-color-panel-border);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-style: solid;\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-border) transparent;\n\t\t\tmargin-top: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-background) transparent;\n\t\t\tmargin-top: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: var(--ck-color-panel-border) transparent transparent;\n\t\t\tfilter: drop-shadow(var(--ck-balloon-arrow-drop-shadow));\n\t\t\tmargin-bottom: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: var(--ck-color-panel-background) transparent transparent transparent;\n\t\t\tmargin-bottom: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&[class*="arrow_e"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent transparent var(--ck-color-panel-border);\n\t\t\tmargin-right: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent transparent var(--ck-color-panel-background);\n\t\t\tmargin-right: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&[class*="arrow_w"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0;\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent var(--ck-color-panel-border) transparent transparent;\n\t\t\tmargin-left: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent var(--ck-color-panel-background) transparent transparent;\n\t\t\tmargin-left: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_n {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_ne {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_s {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_se {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_smw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nmw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_e {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t\tmargin-top: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: 50%;\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_w {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t\tmargin-top: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},4650:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck .ck-balloon-rotator__navigation{align-items:center;display:flex;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-bottom:var(--ck-spacing-small);margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-left:var(--ck-spacing-small);margin-right:var(--ck-spacing-standard)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/balloonrotator.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonrotator.css"],names:[],mappings:"AAKA,oCAEC,kBAAmB,CADnB,YAAa,CAEb,sBACD,CAKA,6CACC,sBACD,CCXA,oCACC,6CAA8C,CAC9C,sDAAuD,CACvD,iCAgBD,CAbC,sCAGC,qCAAsC,CAFtC,oCAAqC,CACrC,kCAED,CAGA,iEAIC,mCAAoC,CAHpC,uCAID,CAMA,2DACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Buttons inside a toolbar should be centered when rotator bar is wider.\n * See: https://github.com/ckeditor/ckeditor5-ui/issues/495\n */\n.ck .ck-balloon-rotator__content .ck-toolbar {\n\tjustify-content: center;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tbackground: var(--ck-color-toolbar-background);\n\tborder-bottom: 1px solid var(--ck-color-toolbar-border);\n\tpadding: 0 var(--ck-spacing-small);\n\n\t/* Let's keep similar appearance to `ck-toolbar`. */\n\t& > * {\n\t\tmargin-right: var(--ck-spacing-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t/* Gives counter more breath than buttons. */\n\t& .ck-balloon-rotator__counter {\n\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t/* We need to use smaller margin because of previous button's right margin. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n.ck .ck-balloon-rotator__content {\n\n\t/* Disable default annotation shadow inside rotator with fake panels. */\n\t& .ck.ck-annotation-wrapper {\n\t\tbox-shadow: none;\n\t}\n}\n"],sourceRoot:""}]);const a=s},7676:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-modal) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);box-shadow:var(--ck-drop-shadow),0 0;height:100%;min-height:15px;width:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/fakepanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/fakepanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,mBACC,iBAAkB,CAGlB,mCACD,CAEA,uBACC,iBACD,CAEA,mCACC,SACD,CAEA,oCACC,SACD,CCfA,MACC,6CAA8C,CAC9C,2CACD,CAGA,uBAKC,2CAA4C,CAC5C,6CAA8C,CAC9C,qCAAsC,CCXtC,oCAA8B,CDc9B,WAAY,CAPZ,eAAgB,CAMhB,UAED,CAEA,mCACC,0DAA2D,CAC3D,uDACD,CAEA,oCACC,kEAAqE,CACrE,+DACD,CACA,oCACC,kEAAqE,CACrE,+DACD,CAGA,yIAGC,4CACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-fake-panel {\n\tposition: absolute;\n\n\t/* Fake panels should be placed under main balloon content. */\n\tz-index: calc(var(--ck-z-modal) - 1);\n}\n\n.ck .ck-fake-panel div {\n\tposition: absolute;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tz-index: 2;\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tz-index: 1;\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-fake-panel-offset-horizontal: 6px;\n\t--ck-balloon-fake-panel-offset-vertical: 6px;\n}\n\n/* Let\'s use `.ck-balloon-panel` appearance. See: balloonpanel.css. */\n.ck .ck-fake-panel div {\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\tborder-radius: var(--ck-border-radius);\n\n\twidth: 100%;\n\theight: 100%;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tmargin-left: var(--ck-balloon-fake-panel-offset-horizontal);\n\tmargin-top: var(--ck-balloon-fake-panel-offset-vertical);\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 2);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 2);\n}\n.ck .ck-fake-panel div:nth-child( 3 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 3);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 3);\n}\n\n/* If balloon is positioned above element, we need to move fake panel to the top. */\n.ck .ck-balloon-panel_arrow_s + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_se + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_sw + .ck-fake-panel {\n\t--ck-balloon-fake-panel-offset-vertical: -6px;\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},5868:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{position:fixed;top:0;z-index:var(--ck-z-modal)}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{position:absolute;top:auto}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{border-top-left-radius:0;border-top-right-radius:0;border-width:0 1px 1px;box-shadow:var(--ck-drop-shadow),0 0}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/stickypanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/stickypanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAMC,qDAEC,cAAe,CACf,KAAM,CAFN,yBAGD,CAEA,kEAEC,iBAAkB,CADlB,QAED,CCPA,qDAIC,wBAAyB,CACzB,yBAA0B,CAF1B,sBAAuB,CCFxB,oCDKA",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\tz-index: var(--ck-z-modal); /* #315 */\n\t\tposition: fixed;\n\t\ttop: 0;\n\t}\n\n\t& .ck-sticky-panel__content_sticky_bottom-limit {\n\t\ttop: auto;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\t@mixin ck-drop-shadow;\n\n\t\tborder-width: 0 1px 1px;\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},6764:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck-vertical-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck-vertical-form .ck-button:focus:after{display:none}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck.ck-responsive-form .ck-button:focus:after{display:none}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-width)*.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border-radius:0;margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}.ck.ck-responsive-form>.ck-button:last-child:not(:focus),.ck.ck-responsive-form>.ck-button:nth-last-child(2):not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}',"",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css"],names:[],mappings:"AAQC,mCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,yCACC,YACD,CCdA,oCDoBE,wCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,8CACC,YACD,CC9BF,CCAD,qDACC,kDACD,CAEA,uBACC,+BAmED,CAjEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,oCA8CF,CA5CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAKA,0DACC,kDACD,CAGD,iGAIC,eAAgB,CADhB,kCAAmC,CADnC,kCAmBD,CAfC,yHACC,gDACD,CARD,0OAeE,aAMF,CAJE,+IACC,kDACD,CDpEH",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck-vertical-form .ck-button {\n\t&::after {\n\t\tcontent: "";\n\t\twidth: 0;\n\t\tposition: absolute;\n\t\tright: -1px;\n\t\ttop: -1px;\n\t\tbottom: -1px;\n\t\tz-index: 1;\n\t}\n\n\t&:focus::after {\n\t\tdisplay: none;\n\t}\n}\n\n.ck.ck-responsive-form {\n\t@mixin ck-media-phone {\n\t\t& .ck-button {\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: -1px;\n\t\t\t\ttop: -1px;\n\t\t\t\tbottom: -1px;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\t&:focus::after {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\n\tborder-right: 1px solid var(--ck-color-base-border);\n}\n\n.ck.ck-responsive-form {\n\tpadding: var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& > :not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& > :not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tpadding: 0;\n\t\twidth: calc(.8 * var(--ck-input-width));\n\n\t\t& .ck-labeled-field-view {\n\t\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\n\n\t\t\t& .ck-input-text {\n\t\t\t\tmin-width: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t/* Let the long error messages wrap in the narrow form. */\n\t\t\t& .ck-labeled-field-view__error {\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\t\t}\n\n\t\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\t&::after {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\n\t\t& > .ck-button:nth-last-child(1),\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\tpadding: var(--ck-spacing-standard);\n\t\t\tmargin-top: var(--ck-spacing-large);\n\t\t\tborder-radius: 0;\n\n\t\t\t&:not(:focus) {\n\t\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},9695:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/toolbar/blocktoolbar.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/blocktoolbar.css"],names:[],mappings:"AAKA,4BACC,iBAAkB,CAClB,2BACD,CCHA,MACC,oDAAqD,CACrD,yDACD,CAEA,4BACC,0CAA2C,CAC3C,sCACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-block-toolbar-button {\n\tposition: absolute;\n\tz-index: var(--ck-z-default);\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-block-toolbar-button: var(--ck-color-text);\n\t--ck-block-toolbar-button-size: var(--ck-font-size-normal);\n}\n\n.ck.ck-block-toolbar-button {\n\tcolor: var(--ck-color-block-toolbar-button);\n\tfont-size: var(--ck-block-toolbar-size);\n}\n"],sourceRoot:""}]);const a=s},5542:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-toolbar{align-items:center;display:flex;flex-flow:row nowrap;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-toolbar>.ck-toolbar__items{align-items:center;display:flex;flex-flow:row wrap;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar .ck-toolbar__line-break{flex-basis:100%}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);border:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;background:var(--ck-color-toolbar-border);margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);min-width:1px;width:1px}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{border-radius:0;margin:0;width:100%}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck.ck-toolbar .ck-toolbar__nested-toolbar-dropdown>.ck-dropdown__panel{min-width:auto}.ck.ck-toolbar .ck-toolbar__nested-toolbar-dropdown>.ck-button>.ck-button__label{max-width:7em;width:auto}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=rtl]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=ltr]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/toolbar/toolbar.css","webpack://./../ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/toolbar.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,eAKC,kBAAmB,CAFnB,YAAa,CACb,oBAAqB,CCFrB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6CD,CA3CC,kCAGC,kBAAmB,CAFnB,YAAa,CACb,kBAAmB,CAEnB,WAED,CAEA,yCACC,oBAWD,CAJC,yGAEC,YACD,CAGD,uCACC,eACD,CAEA,sDACC,gBACD,CAEA,sDACC,qBACD,CAEA,sDACC,gBACD,CAGC,yFACC,YACD,CE/CF,eCGC,eDoGD,CAvGA,qECOE,qCDgGF,CAvGA,eAGC,6CAA8C,CAE9C,+CAAgD,CADhD,iCAmGD,CAhGC,yCACC,kBAAmB,CAGnB,yCAA0C,CAO1C,qCAAsC,CADtC,kCAAmC,CAPnC,aAAc,CADd,SAUD,CAEA,uCACC,QACD,CAGC,gEAEC,oCACD,CAIA,kEACC,YACD,CAGD,gHAIC,qCAAsC,CADtC,kCAED,CAEA,mCAEC,SAaD,CAVC,0DAQC,eAAgB,CAHhB,QAAS,CAHT,UAOD,CAGD,kCAEC,SAWD,CATC,uDAEC,QAMD,CAHC,yFACC,eACD,CASD,kFACC,mCACD,CAMA,wEACC,cACD,CAEA,iFACC,aAAc,CACd,UACD,CAjGF,qCAqGE,QAEF,CAYC,+FACC,cACD,CAEA,iJAEC,mCACD,CAEA,qHACC,aACD,CAIC,6JAEC,2BAA4B,CAD5B,wBAED,CAGA,2JAEC,4BAA6B,CAD7B,yBAED,CASD,8RACC,mCACD,CAWA,qHACC,cACD,CAIC,6JAEC,4BAA6B,CAD7B,yBAED,CAGA,2JAEC,2BAA4B,CAD5B,wBAED,CASD,8RACC,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-flow: row nowrap;\n\talign-items: center;\n\n\t& > .ck-toolbar__items {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\talign-items: center;\n\t\tflex-grow: 1;\n\n\t}\n\n\t& .ck.ck-toolbar__separator {\n\t\tdisplay: inline-block;\n\n\t\t/*\n\t\t * A leading or trailing separator makes no sense (separates from nothing on one side).\n\t\t * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and\n\t\t * moved to another toolbar in the dropdown.\n\t\t */\n\t\t&:first-child,\n\t\t&:last-child {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\tflex-basis: 100%;\n\t}\n\n\t&.ck-toolbar_grouping > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.ck-toolbar_vertical > .ck-toolbar__items {\n\t\tflex-direction: column;\n\t}\n\n\t&.ck-toolbar_floating > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t& > .ck-dropdown__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-toolbar-background);\n\tpadding: 0 var(--ck-spacing-small);\n\tborder: 1px solid var(--ck-color-toolbar-border);\n\n\t& .ck.ck-toolbar__separator {\n\t\talign-self: stretch;\n\t\twidth: 1px;\n\t\tmin-width: 1px;\n\t\tbackground: var(--ck-color-toolbar-border);\n\n\t\t/*\n\t\t * These margins make the separators look better in balloon toolbars (when aligned with the "tip").\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/7493.\n\t\t */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\theight: 0;\n\t}\n\n\t& > .ck-toolbar__items {\n\t\t& > *:not(.ck-toolbar__line-break) {\n\t\t\t/* (#11) Separate toolbar items. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\n\t\t/* Don\'t display a separator after an empty items container, for instance,\n\t\twhen all items were grouped */\n\t\t&:empty + .ck.ck-toolbar__separator {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& > .ck-toolbar__items > *:not(.ck-toolbar__line-break),\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/* Make sure items wrapped to the next line have v-spacing */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t&.ck-toolbar_vertical {\n\t\t/* Items in a vertical toolbar span the entire width. */\n\t\tpadding: 0;\n\n\t\t/* Specificity matters here. See https://github.com/ckeditor/ckeditor5-theme-lark/issues/168. */\n\t\t& > .ck-toolbar__items > .ck {\n\t\t\t/* Items in a vertical toolbar should span the horizontal space. */\n\t\t\twidth: 100%;\n\n\t\t\t/* Items in a vertical toolbar should have no margin. */\n\t\t\tmargin: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so rounded corners are pointless. */\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n\n\t&.ck-toolbar_compact {\n\t\t/* No spacing around items. */\n\t\tpadding: 0;\n\n\t\t& > .ck-toolbar__items > * {\n\t\t\t/* Compact toolbar items have no spacing between them. */\n\t\t\tmargin: 0;\n\n\t\t\t/* "Middle" children should have no rounded corners. */\n\t\t\t&:not(:first-child):not(:last-child) {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/*\n\t\t * Dropdown button has asymmetric padding to fit the arrow.\n\t\t * This button has no arrow so let\'s revert that padding back to normal.\n\t\t */\n\t\t& > .ck.ck-button.ck-dropdown__button {\n\t\t\tpadding-left: var(--ck-spacing-tiny);\n\t\t}\n\t}\n\n\t/* A drop-down containing the nested toolbar with configured items. */\n\t& .ck-toolbar__nested-toolbar-dropdown {\n\t\t/* Prevent empty space in the panel when the dropdown label is visible and long but the toolbar has few items. */\n\t\t& > .ck-dropdown__panel {\n\t\t\tmin-width: auto;\n\t\t}\n\n\t\t& > .ck-button > .ck-button__label {\n\t\t\tmax-width: 7em;\n\t\t\twidth: auto;\n\t\t}\n\t}\n\n\t@nest .ck-toolbar-container & {\n\t\tborder: 0;\n\t}\n}\n\n/* stylelint-disable */\n\n/*\n * Styles for RTL toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="rtl"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="rtl"] {\n\t& > .ck-toolbar__items > .ck {\n\t\tmargin-right: 0;\n\t}\n\n\t&:not(.ck-toolbar_compact) > .ck-toolbar__items > .ck {\n\t\t/* (#11) Separate toolbar items. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-left: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n/*\n * Styles for LTR toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="ltr"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="ltr"] {\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-right: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n}\n\n/* stylelint-enable */\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3332:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck.ck-balloon-panel.ck-tooltip{--ck-balloon-border-width:0px;--ck-balloon-arrow-offset:0px;--ck-balloon-arrow-half-width:4px;--ck-balloon-arrow-height:4px;--ck-color-panel-background:var(--ck-color-tooltip-background);padding:0 var(--ck-spacing-medium);pointer-events:none;z-index:calc(var(--ck-z-modal) + 100)}.ck.ck-balloon-panel.ck-tooltip .ck-tooltip__text{color:var(--ck-color-tooltip-text);font-size:.9em;line-height:1.5}.ck.ck-balloon-panel.ck-tooltip{box-shadow:none}.ck.ck-balloon-panel.ck-tooltip:before{display:none}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/tooltip/tooltip.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/tooltip/tooltip.css"],names:[],mappings:"AAKA,gCCGC,6BAA8B,CAC9B,6BAA8B,CAC9B,iCAAkC,CAClC,6BAA8B,CAC9B,8DAA+D,CAE/D,kCAAmC,CDPnC,mBAAoB,CAEpB,qCACD,CCMC,kDAGC,kCAAmC,CAFnC,cAAe,CACf,eAED,CAbD,gCAgBC,eAMD,CAHC,uCACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-balloon-panel.ck-tooltip {\n\t/* Keep tooltips transparent for any interactions. */\n\tpointer-events: none;\n\n\tz-index: calc( var(--ck-z-modal) + 100 );\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-balloon-panel.ck-tooltip {\n\t--ck-balloon-border-width: 0px;\n\t--ck-balloon-arrow-offset: 0px;\n\t--ck-balloon-arrow-half-width: 4px;\n\t--ck-balloon-arrow-height: 4px;\n\t--ck-color-panel-background: var(--ck-color-tooltip-background);\n\n\tpadding: 0 var(--ck-spacing-medium);\n\n\t& .ck-tooltip__text {\n\t\tfont-size: .9em;\n\t\tline-height: 1.5;\n\t\tcolor: var(--ck-color-tooltip-text);\n\t}\n\n\t/* Reset balloon panel styles */\n\tbox-shadow: none;\n\n\t/* Hide the default shadow of the .ck-balloon-panel tip */\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n'],sourceRoot:""}]);const a=s},4793:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck-hidden{display:none!important}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{box-sizing:border-box;height:auto;position:static;width:auto}:root{--ck-z-default:1;--ck-z-modal:calc(var(--ck-z-default) + 999)}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#ccced1;--ck-color-base-action:#53a336;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#2977ff;--ck-color-base-active-focus:#0d65ff;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:218,81.8%,56.9%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#cae1fc;--ck-color-focus-disabled-shadow:rgba(119,186,248,.3);--ck-color-focus-error-shadow:rgba(255,64,31,.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,.15);--ck-color-shadow-drop-active:rgba(0,0,0,.2);--ck-color-shadow-inner:rgba(0,0,0,.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#f0f0f0;--ck-color-button-default-active-background:#f0f0f0;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#f0f7ff;--ck-color-button-on-hover-background:#dbecff;--ck-color-button-on-active-background:#dbecff;--ck-color-button-on-disabled-background:#f0f2f4;--ck-color-button-on-color:#2977ff;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#4d9d30;--ck-color-button-action-active-background:#4d9d30;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#939393;--ck-color-switch-button-off-hover-background:#7d7d7d;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#4d9d30;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:var(--ck-color-base-border);--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:var(--ck-color-base-border);--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-button-on-color);--ck-color-list-button-on-background-focus:var(--ck-color-button-on-color);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-background);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,176,255,.1);--ck-color-link-fake-selection:rgba(31,176,255,.3);--ck-color-highlight-background:#ff0;--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{word-wrap:break-word;background:transparent;border:0;margin:0;padding:0;text-decoration:none;transition:none;vertical-align:middle}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset_all{border-collapse:collapse;color:var(--ck-color-text);cursor:auto;float:none;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);text-align:left;white-space:nowrap}.ck-reset_all .ck-rtl :not(.ck-reset_all-excluded *){text-align:right}.ck-reset_all iframe:not(.ck-reset_all-excluded *){vertical-align:inherit}.ck-reset_all textarea:not(.ck-reset_all-excluded *){white-space:pre-wrap}.ck-reset_all input[type=password]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text]:not(.ck-reset_all-excluded *),.ck-reset_all textarea:not(.ck-reset_all-excluded *){cursor:text}.ck-reset_all input[type=password][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all textarea[disabled]:not(.ck-reset_all-excluded *){cursor:default}.ck-reset_all fieldset:not(.ck-reset_all-excluded *){border:2px groove #dfdee3;padding:10px}.ck-reset_all button:not(.ck-reset_all-excluded *)::-moz-focus-inner{border:0;padding:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/globals/_hidden.css","webpack://./../ckeditor5-ui/theme/globals/_reset.css","webpack://./../ckeditor5-ui/theme/globals/_zindex.css","webpack://./../ckeditor5-ui/theme/globals/_transition.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_colors.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_disabled.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_focus.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_fonts.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_reset.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_shadow.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_spacing.css"],names:[],mappings:"AAQA,WAGC,sBACD,CCPA,2EAGC,qBAAsB,CAEtB,WAAY,CACZ,eAAgB,CAFhB,UAGD,CCPA,MACC,gBAAiB,CACjB,4CACD,CCAA,oDAEC,yBACD,CCNA,MACC,kCAAmD,CACnD,+BAAoD,CACpD,8BAAkD,CAClD,8BAAuD,CACvD,6BAAmD,CACnD,yBAA+C,CAC/C,8BAAsD,CACtD,oCAA4D,CAC5D,6BAAkD,CAIlD,mDAA4D,CAC5D,qEAA+E,CAC/E,qCAA4D,CAC5D,qDAA8D,CAC9D,gDAAyD,CACzD,yCAAqD,CACrD,sCAAsD,CACtD,4CAA0D,CAC1D,sCAAsD,CAItD,gDAAuD,CACvD,kDAAiE,CACjE,mDAAkE,CAClE,yDAA8D,CAE9D,uCAA6D,CAC7D,6CAAoE,CACpE,8CAAoE,CACpE,gDAAiE,CACjE,kCAAyD,CAGzD,+DAAsE,CACtE,iDAAsE,CACtE,kDAAsE,CACtE,oDAAoE,CACpE,6DAAsE,CAEtE,8BAAoD,CACpD,gCAAqD,CAErD,+CAA8D,CAC9D,qDAAiE,CACjE,+EAAqF,CACrF,oDAAuE,CACvE,yEAA8E,CAC9E,oDAAgE,CAIhE,oEAA2E,CAC3E,4DAAoE,CAIpE,2DAAoE,CACpE,mDAA6D,CAC7D,wDAAgE,CAChE,+CAA0D,CAC1D,4CAA2D,CAC3D,4DAAoE,CACpE,sCAAsD,CAItD,0DAAmE,CACnE,uFAA6F,CAC7F,oEAA2E,CAC3E,0EAA+E,CAC/E,8DAAsE,CAItE,2DAAoE,CACpE,mDAA6D,CAI7D,6DAAsE,CACtE,qDAA+D,CAI/D,uDAAgE,CAChE,uDAAiE,CAIjE,0CAAyD,CAIzD,wCAA2D,CAI3D,+BAAoD,CACpD,uDAAmE,CACnE,kDAAgE,CAIhE,oCAAwD,CCvGxD,wBAAyB,CCAzB,0CAA2C,CAK3C,gGAAiG,CAKjG,4GAA6G,CAK7G,sGAAuG,CAKvG,sDAAuD,CCvBvD,wBAAyB,CACzB,6BAA8B,CAC9B,wDAA6D,CAE7D,yBAA0B,CAC1B,2BAA4B,CAC5B,yBAA0B,CAC1B,wBAAyB,CACzB,0BAA2B,CCJ3B,kCJuGD,CIjGA,2EAaC,oBAAqB,CANrB,sBAAuB,CADvB,QAAS,CAFT,QAAS,CACT,SAAU,CAGV,oBAAqB,CAErB,eAAgB,CADhB,qBAKD,CAKA,8DAGC,wBAAyB,CAEzB,0BAA2B,CAG3B,WAAY,CACZ,UAAW,CALX,iGAAkG,CAElG,eAAgB,CAChB,kBAGD,CAGC,qDACC,gBACD,CAEA,mDAEC,sBACD,CAEA,qDACC,oBACD,CAEA,mLAGC,WACD,CAEA,iNAGC,cACD,CAEA,qDAEC,yBAAoC,CADpC,YAED,CAEA,qEAGC,QAAQ,CADR,SAED,CAMD,8BAEC,gBACD,CCnFA,MACC,sBAAuB,CCAvB,gEAAiE,CAKjE,0DAA2D,CAK3D,wEAAyE,CCbzE,uBAA8B,CAC9B,mDAA2D,CAC3D,4CAAkD,CAClD,oDAA4D,CAC5D,mDAA2D,CAC3D,kDAA2D,CAC3D,yDFFD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which hides an element in DOM.\n */\n.ck-hidden {\n\t/* Override selector specificity. Otherwise, all elements with some display\n\tstyle defined will override this one, which is not a desired result. */\n\tdisplay: none !important;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\tbox-sizing: border-box;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-z-default: 1;\n\t--ck-z-modal: calc( var(--ck-z-default) + 999 );\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class that disables all transitions of the element and its children.\n */\n.ck-transitions-disabled,\n.ck-transitions-disabled * {\n\ttransition: none !important;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-base-foreground: \t\t\t\t\t\t\t\thsl(0, 0%, 98%);\n\t--ck-color-base-background: \t\t\t\t\t\t\t\thsl(0, 0%, 100%);\n\t--ck-color-base-border: \t\t\t\t\t\t\t\t\thsl(220, 6%, 81%);\n\t--ck-color-base-action: \t\t\t\t\t\t\t\t\thsl(104, 50.2%, 42.5%);\n\t--ck-color-base-focus: \t\t\t\t\t\t\t\t\t\thsl(209, 92%, 70%);\n\t--ck-color-base-text: \t\t\t\t\t\t\t\t\t\thsl(0, 0%, 20%);\n\t--ck-color-base-active: \t\t\t\t\t\t\t\t\thsl(218.1, 100%, 58%);\n\t--ck-color-base-active-focus:\t\t\t\t\t\t\t\thsl(218.2, 100%, 52.5%);\n\t--ck-color-base-error:\t\t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t/* -- Generic colors ------------------------------------------------------------------------ */\n\n\t--ck-color-focus-border-coordinates: \t\t\t\t\t\t218, 81.8%, 56.9%;\n\t--ck-color-focus-border: \t\t\t\t\t\t\t\t\thsl(var(--ck-color-focus-border-coordinates));\n\t--ck-color-focus-outer-shadow:\t\t\t\t\t\t\t\thsl(212.4, 89.3%, 89%);\n\t--ck-color-focus-disabled-shadow:\t\t\t\t\t\t\thsla(209, 90%, 72%,.3);\n\t--ck-color-focus-error-shadow:\t\t\t\t\t\t\t\thsla(9,100%,56%,.3);\n\t--ck-color-text: \t\t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-shadow-drop: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.15);\n\t--ck-color-shadow-drop-active:\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.2);\n\t--ck-color-shadow-inner: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Buttons ------------------------------------------------------------------------------- */\n\n\t--ck-color-button-default-background: \t\t\t\t\t\ttransparent;\n\t--ck-color-button-default-hover-background: \t\t\t\thsl(0, 0%, 94.1%);\n\t--ck-color-button-default-active-background: \t\t\t\thsl(0, 0%, 94.1%);\n\t--ck-color-button-default-disabled-background: \t\t\t\ttransparent;\n\n\t--ck-color-button-on-background: \t\t\t\t\t\t\thsl(212, 100%, 97.1%);\n\t--ck-color-button-on-hover-background: \t\t\t\t\t\thsl(211.7, 100%, 92.9%);\n\t--ck-color-button-on-active-background: \t\t\t\t\thsl(211.7, 100%, 92.9%);\n\t--ck-color-button-on-disabled-background: \t\t\t\t\thsl(211, 15%, 95%);\n\t--ck-color-button-on-color:\t\t\t\t\t\t\t\t\thsl(218.1, 100%, 58%);\n\n\n\t--ck-color-button-action-background: \t\t\t\t\t\tvar(--ck-color-base-action);\n\t--ck-color-button-action-hover-background: \t\t\t\t\thsl(104, 53.2%, 40.2%);\n\t--ck-color-button-action-active-background: \t\t\t\thsl(104, 53.2%, 40.2%);\n\t--ck-color-button-action-disabled-background: \t\t\t\thsl(104, 44%, 58%);\n\t--ck-color-button-action-text: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t--ck-color-button-save: \t\t\t\t\t\t\t\t\thsl(120, 100%, 27%);\n\t--ck-color-button-cancel: \t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t--ck-color-switch-button-off-background:\t\t\t\t\thsl(0, 0%, 57.6%);\n\t--ck-color-switch-button-off-hover-background:\t\t\t\thsl(0, 0%, 49%);\n\t--ck-color-switch-button-on-background:\t\t\t\t\t\tvar(--ck-color-button-action-background);\n\t--ck-color-switch-button-on-hover-background:\t\t\t\thsl(104, 53.2%, 40.2%);\n\t--ck-color-switch-button-inner-background:\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-switch-button-inner-shadow:\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Dropdown ------------------------------------------------------------------------------ */\n\n\t--ck-color-dropdown-panel-background: \t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-dropdown-panel-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Input --------------------------------------------------------------------------------- */\n\n\t--ck-color-input-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-input-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\t--ck-color-input-error-border:\t\t\t\t\t\t\t\tvar(--ck-color-base-error);\n\t--ck-color-input-text: \t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-input-disabled-background: \t\t\t\t\t\thsl(0, 0%, 95%);\n\t--ck-color-input-disabled-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\t--ck-color-input-disabled-text: \t\t\t\t\t\t\thsl(0, 0%, 46%);\n\n\t/* -- List ---------------------------------------------------------------------------------- */\n\n\t--ck-color-list-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-list-button-hover-background: \t\t\t\t\tvar(--ck-color-button-default-hover-background);\n\t--ck-color-list-button-on-background: \t\t\t\t\t\tvar(--ck-color-button-on-color);\n\t--ck-color-list-button-on-background-focus: \t\t\t\tvar(--ck-color-button-on-color);\n\t--ck-color-list-button-on-text:\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Panel --------------------------------------------------------------------------------- */\n\n\t--ck-color-panel-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-panel-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Toolbar ------------------------------------------------------------------------------- */\n\n\t--ck-color-toolbar-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-toolbar-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Tooltip ------------------------------------------------------------------------------- */\n\n\t--ck-color-tooltip-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-tooltip-text: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Engine -------------------------------------------------------------------------------- */\n\n\t--ck-color-engine-placeholder-text: \t\t\t\t\t\thsl(0, 0%, 44%);\n\n\t/* -- Upload -------------------------------------------------------------------------------- */\n\n\t--ck-color-upload-bar-background:\t\t \t\t\t\t\thsl(209, 92%, 70%);\n\n\t/* -- Link -------------------------------------------------------------------------------- */\n\n\t--ck-color-link-default:\t\t\t\t\t\t\t\t\thsl(240, 100%, 47%);\n\t--ck-color-link-selected-background:\t\t\t\t\t\thsla(201, 100%, 56%, 0.1);\n\t--ck-color-link-fake-selection:\t\t\t\t\t\t\t\thsla(201, 100%, 56%, 0.3);\n\n\t/* -- Search result highlight ---------------------------------------------------------------- */\n\n\t--ck-color-highlight-background:\t\t\t\t\t\t\thsl(60, 100%, 50%)\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * An opacity value of disabled UI item.\n\t */\n\t--ck-disabled-opacity: .5;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * The geometry of the of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow-geometry: 0 0 0 3px;\n\n\t/**\n\t * A visual style of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when disabled).\n\t */\n\t--ck-focus-disabled-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when has errors).\n\t */\n\t--ck-focus-error-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);\n\n\t/**\n\t * A visual style of focused element's border or outline.\n\t */\n\t--ck-focus-ring: 1px solid var(--ck-color-focus-border);\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-font-size-base: 13px;\n\t--ck-line-height-base: 1.84615;\n\t--ck-font-face: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\n\n\t--ck-font-size-tiny: 0.7em;\n\t--ck-font-size-small: 0.75em;\n\t--ck-font-size-normal: 1em;\n\t--ck-font-size-big: 1.4em;\n\t--ck-font-size-large: 1.8em;\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* This is super-important. This is **manually** adjusted so a button without an icon\n\tis never smaller than a button with icon, additionally making sure that text-less buttons\n\tare perfect squares. The value is also shared by other components which should stay "in-line"\n\twith buttons. */\n\t--ck-ui-component-min-height: 2.3em;\n}\n\n/**\n * Resets an element, ignoring its children.\n */\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\t/* Do not include inheritable rules here. */\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\ttext-decoration: none;\n\tvertical-align: middle;\n\ttransition: none;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/105 */\n\tword-wrap: break-word;\n}\n\n/**\n * Resets an element AND its children.\n */\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\t/* These are rule inherited by all children elements. */\n\tborder-collapse: collapse;\n\tfont: normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);\n\tcolor: var(--ck-color-text);\n\ttext-align: left;\n\twhite-space: nowrap;\n\tcursor: auto;\n\tfloat: none;\n}\n\n.ck-reset_all {\n\t& .ck-rtl *:not(.ck-reset_all-excluded *) {\n\t\ttext-align: right;\n\t}\n\n\t& iframe:not(.ck-reset_all-excluded *) {\n\t\t/* For IE */\n\t\tvertical-align: inherit;\n\t}\n\n\t& textarea:not(.ck-reset_all-excluded *) {\n\t\twhite-space: pre-wrap;\n\t}\n\n\t& textarea:not(.ck-reset_all-excluded *),\n\t& input[type="text"]:not(.ck-reset_all-excluded *),\n\t& input[type="password"]:not(.ck-reset_all-excluded *) {\n\t\tcursor: text;\n\t}\n\n\t& textarea[disabled]:not(.ck-reset_all-excluded *),\n\t& input[type="text"][disabled]:not(.ck-reset_all-excluded *),\n\t& input[type="password"][disabled]:not(.ck-reset_all-excluded *) {\n\t\tcursor: default;\n\t}\n\n\t& fieldset:not(.ck-reset_all-excluded *) {\n\t\tpadding: 10px;\n\t\tborder: 2px groove hsl(255, 7%, 88%);\n\t}\n\n\t& button:not(.ck-reset_all-excluded *)::-moz-focus-inner {\n\t\t/* See http://stackoverflow.com/questions/5517744/remove-extra-button-spacing-padding-in-firefox */\n\t\tpadding: 0;\n\t\tborder: 0\n\t}\n}\n\n/**\n * Default UI rules for RTL languages.\n */\n.ck[dir="rtl"],\n.ck[dir="rtl"] .ck {\n\ttext-align: right;\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Default border-radius value.\n */\n:root{\n\t--ck-border-radius: 2px;\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * A visual style of element's inner shadow (i.e. input).\n\t */\n\t--ck-inner-shadow: 2px 2px 3px var(--ck-color-shadow-inner) inset;\n\n\t/**\n\t * A visual style of element's drop shadow (i.e. panel).\n\t */\n\t--ck-drop-shadow: 0 1px 2px 1px var(--ck-color-shadow-drop);\n\n\t/**\n\t * A visual style of element's active shadow (i.e. comment or suggestion).\n\t */\n\t--ck-drop-shadow-active: 0 3px 6px 1px var(--ck-color-shadow-drop-active);\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-spacing-unit: \t\t\t\t\t\t0.6em;\n\t--ck-spacing-large: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 1.5);\n\t--ck-spacing-standard: \t\t\t\t\tvar(--ck-spacing-unit);\n\t--ck-spacing-medium: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.8);\n\t--ck-spacing-small: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.5);\n\t--ck-spacing-tiny: \t\t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.3);\n\t--ck-spacing-extra-tiny: \t\t\t\tcalc(var(--ck-spacing-unit) * 0.16);\n}\n"],sourceRoot:""}]);const a=s},3488:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px;--ck-resizer-tooltip-height:calc(var(--ck-spacing-small)*2 + 10px)}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);color:var(--ck-color-resizer-tooltip-text);display:block;font-size:var(--ck-font-size-tiny);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height);padding:0 var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-above-center,.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{left:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{right:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-above-center{left:50%;top:calc(var(--ck-resizer-tooltip-height)*-1);transform:translate(-50%)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-color:transparent;outline-style:solid;outline-width:var(--ck-widget-outline-thickness);transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{background-color:var(--ck-color-widget-editable-focus-background);border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{background-color:transparent;border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;box-sizing:border-box;left:calc(0px - var(--ck-widget-outline-thickness));opacity:0;padding:4px;top:0;transform:translateY(-100%);transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{color:var(--ck-color-widget-drag-handler-icon-color);height:var(--ck-widget-handler-icon-size);width:var(--ck-widget-handler-icon-size)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{background-color:var(--ck-color-widget-hover-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{background-color:var(--ck-color-focus-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}","",{version:3,sources:["webpack://./../ckeditor5-widget/theme/widget.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-widget/widget.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MACC,+CAAgD,CAChD,6CAAsD,CACtD,uCAAgD,CAEhD,kDAAmD,CACnD,gCAAiC,CACjC,kEACD,CAOA,8DAEC,iBAqBD,CAnBC,4EACC,iBAOD,CALC,qFAGC,aACD,CASD,iLACC,kBACD,CAGD,kBACC,qDAAsD,CAEtD,qDAAsD,CACtD,6CAA8C,CAF9C,0CAA2C,CAI3C,aAAc,CADd,kCAAmC,CAGnC,uCAAwC,CACxC,4CAA6C,CAF7C,iCAsCD,CAlCC,8NAKC,iBACD,CAEA,0CAEC,qCAAsC,CADtC,oCAED,CAEA,2CAEC,sCAAuC,CADvC,oCAED,CAEA,8CACC,uCAAwC,CACxC,sCACD,CAEA,6CACC,uCAAwC,CACxC,qCACD,CAGA,8CAEC,QAAS,CADT,6CAAgD,CAEhD,yBACD,CCjFD,MACC,iCAAkC,CAClC,kCAAmC,CACnC,4CAA6C,CAC7C,wCAAyC,CAEzC,wCAAiD,CACjD,sCAAkD,CAClD,2EAA4E,CAC5E,yEACD,CAEA,eAGC,yBAA0B,CAD1B,mBAAoB,CADpB,gDAAiD,CAGjD,6GAUD,CARC,0EAEC,6EACD,CAEA,qBACC,iDACD,CAGD,gCACC,4BAWD,CAPC,yGAKC,iEAAkE,CCnCnE,2BAA2B,CCF3B,qCAA8B,CDC9B,YDqCA,CAIA,4EAKC,4BAA6B,CAa7B,iEAAkE,CAhBlE,qBAAsB,CAoBtB,mDAAoD,CAhBpD,SAAU,CALV,WAAY,CAsBZ,KAAM,CAFN,2BAA4B,CAT5B,6SAgCD,CAnBC,qFAIC,oDAAqD,CADrD,yCAA0C,CAD1C,wCAWD,CANC,kHACC,SAAU,CAGV,+DACD,CAID,wHACC,SACD,CAID,kFAEC,oDAAqD,CADrD,SAED,CAKC,oMAEC,6CAA8C,CAD9C,SAOD,CAHC,gRACC,SACD,CAOH,qFACC,SAAU,CACV,oDACD,CAGA,gDAEC,eAkBD,CAhBC,yEAOC,iCACD,CAGC,gOAEC,gDACD,CAOD,wIAEC,mDAQD,CALE,ghBAEC,gDACD,CAKH,yKAOC,yDACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-resizer: var(--ck-color-focus-border);\n\t--ck-color-resizer-tooltip-background: hsl(0, 0%, 15%);\n\t--ck-color-resizer-tooltip-text: hsl(0, 0%, 95%);\n\n\t--ck-resizer-border-radius: var(--ck-border-radius);\n\t--ck-resizer-tooltip-offset: 10px;\n\t--ck-resizer-tooltip-height: calc(var(--ck-spacing-small) * 2 + 10px);\n}\n\n.ck .ck-widget {\n\t/* This is neccessary for type around UI to be positioned properly. */\n\tposition: relative;\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n\n\t& .ck-widget__selection-handle {\n\t\tposition: absolute;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the icon in not a subject to font-size or line-height to avoid\n\t\t\tunnecessary spacing around it. */\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t/* Show the selection handle on mouse hover over the widget, but not for nested widgets. */\n\t&:hover > .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n\n\t/* Show the selection handle when the widget is selected, but not for nested widgets. */\n\t&.ck-widget_selected > .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n}\n\n.ck .ck-size-view {\n\tbackground: var(--ck-color-resizer-tooltip-background);\n\tcolor: var(--ck-color-resizer-tooltip-text);\n\tborder: 1px solid var(--ck-color-resizer-tooltip-text);\n\tborder-radius: var(--ck-resizer-border-radius);\n\tfont-size: var(--ck-font-size-tiny);\n\tdisplay: block;\n\tpadding: 0 var(--ck-spacing-small);\n\theight: var(--ck-resizer-tooltip-height);\n\tline-height: var(--ck-resizer-tooltip-height);\n\n\t&.ck-orientation-top-left,\n\t&.ck-orientation-top-right,\n\t&.ck-orientation-bottom-right,\n\t&.ck-orientation-bottom-left,\n\t&.ck-orientation-above-center {\n\t\tposition: absolute;\n\t}\n\n\t&.ck-orientation-top-left {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-top-right {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-right {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-left {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t/* Class applied if the widget is too small to contain the size label */\n\t&.ck-orientation-above-center {\n\t\ttop: calc(var(--ck-resizer-tooltip-height) * -1);\n\t\tleft: 50%;\n\t\ttransform: translate(-50%);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n\n:root {\n\t--ck-widget-outline-thickness: 3px;\n\t--ck-widget-handler-icon-size: 16px;\n\t--ck-widget-handler-animation-duration: 200ms;\n\t--ck-widget-handler-animation-curve: ease;\n\n\t--ck-color-widget-blurred-border: hsl(0, 0%, 87%);\n\t--ck-color-widget-hover-border: hsl(43, 100%, 62%);\n\t--ck-color-widget-editable-focus-background: var(--ck-color-base-background);\n\t--ck-color-widget-drag-handler-icon-color: var(--ck-color-base-background);\n}\n\n.ck .ck-widget {\n\toutline-width: var(--ck-widget-outline-thickness);\n\toutline-style: solid;\n\toutline-color: transparent;\n\ttransition: outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border);\n\t}\n\n\t&:hover {\n\t\toutline-color: var(--ck-color-widget-hover-border);\n\t}\n}\n\n.ck .ck-editor__nested-editable {\n\tborder: 1px solid transparent;\n\n\t/* The :focus style is applied before .ck-editor__nested-editable_focused class is rendered in the view.\n\tThese styles show a different border for a blink of an eye, so `:focus` need to have same styles applied. */\n\t&.ck-editor__nested-editable_focused,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\n\t\tbackground-color: var(--ck-color-widget-editable-focus-background);\n\t}\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t& .ck-widget__selection-handle {\n\t\tpadding: 4px;\n\t\tbox-sizing: border-box;\n\n\t\t/* Background and opacity will be animated as the handler shows up or the widget gets selected. */\n\t\tbackground-color: transparent;\n\t\topacity: 0;\n\n\t\t/* Transition:\n\t\t * background-color for the .ck-widget_selected state change,\n\t\t * visibility for hiding the handler,\n\t\t * opacity for the proper look of the icon when the handler disappears. */\n\t\ttransition:\n\t\t\tbackground-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\tvisibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\topacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t/* Make only top corners round. */\n\t\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\n\n\t\t/* Place the drag handler outside the widget wrapper. */\n\t\ttransform: translateY(-100%);\n\t\tleft: calc(0px - var(--ck-widget-outline-thickness));\n\t\ttop: 0;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the dimensions of the icon are independent of the fon-size of the content. */\n\t\t\twidth: var(--ck-widget-handler-icon-size);\n\t\t\theight: var(--ck-widget-handler-icon-size);\n\t\t\tcolor: var(--ck-color-widget-drag-handler-icon-color);\n\n\t\t\t/* The "selected" part of the icon is invisible by default */\n\t\t\t& .ck-icon__selected-indicator {\n\t\t\t\topacity: 0;\n\n\t\t\t\t/* Note: The animation is longer on purpose. Simply feels better. */\n\t\t\t\ttransition: opacity 300ms var(--ck-widget-handler-animation-curve);\n\t\t\t}\n\t\t}\n\n\t\t/* Advertise using the look of the icon that once clicked the handler, the widget will be selected. */\n\t\t&:hover .ck-icon .ck-icon__selected-indicator {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* Show the selection handler on mouse hover over the widget, but not for nested widgets. */\n\t&:hover > .ck-widget__selection-handle {\n\t\topacity: 1;\n\t\tbackground-color: var(--ck-color-widget-hover-border);\n\t}\n\n\t/* Show the selection handler when the widget is selected, but not for nested widgets. */\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\t& > .ck-widget__selection-handle {\n\t\t\topacity: 1;\n\t\t\tbackground-color: var(--ck-color-focus-border);\n\n\t\t\t/* When the widget is selected, notify the user using the proper look of the icon. */\n\t\t\t& .ck-icon .ck-icon__selected-indicator {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* In a RTL environment, align the selection handler to the right side of the widget */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle {\n\tleft: auto;\n\tright: calc(0px - var(--ck-widget-outline-thickness));\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/6415 */\n.ck.ck-editor__editable.ck-read-only .ck-widget {\n\t/* Prevent the :hover outline from showing up because of the used outline-color transition. */\n\ttransition: none;\n\n\t&:not(.ck-widget_selected) {\n\t\t/* Disable visual effects of hover/active widget when CKEditor is in readOnly mode.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/1261\n\t\t *\n\t\t * Leave the unit because this custom property is used in calc() by other features.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/6775\n\t\t */\n\t\t--ck-widget-outline-thickness: 0px;\n\t}\n\n\t&.ck-widget_with-selection-handle {\n\t\t& .ck-widget__selection-handle,\n\t\t& .ck-widget__selection-handle:hover {\n\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t}\n\t}\n}\n\n/* Style the widget when it\'s selected but the editable it belongs to lost focus. */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck.ck-editor__editable.ck-blurred .ck-widget {\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline-color: var(--ck-color-widget-blurred-border);\n\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t& > .ck-widget__selection-handle,\n\t\t\t& > .ck-widget__selection-handle:hover {\n\t\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable > .ck-widget.ck-widget_with-selection-handle:first-child,\n.ck.ck-editor__editable blockquote > .ck-widget.ck-widget_with-selection-handle:first-child {\n\t/* Do not crop selection handler if a widget is a first-child in the blockquote or in the root editable.\n\tIn fact, anything with overflow: hidden.\n\thttps://github.com/ckeditor/ckeditor5-block-quote/issues/28\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/44\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/66 */\n\tmargin-top: calc(1em + var(--ck-widget-handler-icon-size));\n}\n',"/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},8506:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;left:0;pointer-events:none;position:absolute;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{pointer-events:all;position:absolute}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius);height:var(--ck-resizer-size);width:var(--ck-resizer-size)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{left:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{right:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}","",{version:3,sources:["webpack://./../ckeditor5-widget/theme/widgetresize.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-widget/widgetresize.css"],names:[],mappings:"AAKA,4BAEC,iBACD,CAEA,wBACC,YAAa,CAMb,MAAO,CAFP,mBAAoB,CAHpB,iBAAkB,CAMlB,KACD,CAGC,2EACC,aACD,CAGD,gCAIC,kBAAmB,CAHnB,iBAcD,CATC,4IAEC,kBACD,CAEA,4IAEC,kBACD,CCpCD,MACC,sBAAuB,CAGvB,yDAAiE,CACjE,6BACD,CAEA,wBACC,yCACD,CAEA,gCAGC,uCAAwC,CACxC,gDAA6D,CAC7D,6CAA8C,CAH9C,6BAA8B,CAD9B,4BAyBD,CAnBC,oEAEC,6BAA8B,CAD9B,4BAED,CAEA,qEAEC,8BAA+B,CAD/B,4BAED,CAEA,wEACC,+BAAgC,CAChC,8BACD,CAEA,uEACC,+BAAgC,CAChC,6BACD",sourcesContent:["/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget_with-resizer {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n}\n\n.ck .ck-widget__resizer {\n\tdisplay: none;\n\tposition: absolute;\n\n\t/* The wrapper itself should not interfere with the pointer device, only the handles should. */\n\tpointer-events: none;\n\n\tleft: 0;\n\ttop: 0;\n}\n\n.ck-focused .ck-widget_with-resizer.ck-widget_selected {\n\t& > .ck-widget__resizer {\n\t\tdisplay: block;\n\t}\n}\n\n.ck .ck-widget__resizer__handle {\n\tposition: absolute;\n\n\t/* Resizers are the only UI elements that should interfere with a pointer device. */\n\tpointer-events: all;\n\n\t&.ck-widget__resizer__handle-top-left,\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tcursor: nwse-resize;\n\t}\n\n\t&.ck-widget__resizer__handle-top-right,\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tcursor: nesw-resize;\n\t}\n}\n","/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-resizer-size: 10px;\n\n\t/* Set the resizer with a 50% offset. */\n\t--ck-resizer-offset: calc( ( var(--ck-resizer-size) / -2 ) - 2px);\n\t--ck-resizer-border-width: 1px;\n}\n\n.ck .ck-widget__resizer {\n\toutline: 1px solid var(--ck-color-resizer);\n}\n\n.ck .ck-widget__resizer__handle {\n\twidth: var(--ck-resizer-size);\n\theight: var(--ck-resizer-size);\n\tbackground: var(--ck-color-focus-border);\n\tborder: var(--ck-resizer-border-width) solid hsl(0, 0%, 100%);\n\tborder-radius: var(--ck-resizer-border-radius);\n\n\t&.ck-widget__resizer__handle-top-left {\n\t\ttop: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-top-right {\n\t\ttop: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n}\n"],sourceRoot:""}]);const a=s},4921:(t,e,n)=>{n.d(e,{Z:()=>a});var o=n(1799),i=n.n(o),r=n(2609),s=n.n(r)()(i());s.push([t.id,'.ck .ck-widget .ck-widget__type-around__button{display:block;overflow:hidden;position:absolute;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{left:50%;position:absolute;top:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{left:min(10%,30px);top:calc(var(--ck-widget-outline-thickness)*-.5);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;left:1px;position:absolute;top:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;left:0;position:absolute;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:block;top:calc(var(--ck-widget-outline-thickness)*-1 - 1px)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button);border-radius:100px;height:var(--ck-widget-type-around-button-size);opacity:0;pointer-events:none;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);width:var(--ck-widget-type-around-button-size)}.ck .ck-widget .ck-widget__type-around__button svg{height:8px;margin-top:1px;transform:translate(-50%,-50%);transition:transform .5s ease;width:10px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3));border-radius:100px;height:calc(var(--ck-widget-type-around-button-size) - 2px);width:calc(var(--ck-widget-type-around-button-size) - 2px)}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;background:var(--ck-color-base-text);height:1px;outline:1px solid hsla(0,0%,100%,.5);pointer-events:none}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./../ckeditor5-widget/theme/widgettypearound.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css"],names:[],mappings:"AASC,+CACC,aAAc,CAEd,eAAgB,CADhB,iBAAkB,CAElB,2BAwBD,CAtBC,mDAGC,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAEA,qFAGC,kBAAoB,CADpB,gDAAoD,CAGpD,0BACD,CAEA,oFAEC,mDAAuD,CACvD,mBAAqB,CAErB,yBACD,CAUA,mLACC,UAAW,CACX,aAAc,CAGd,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAMD,2EACC,YAAa,CAEb,MAAO,CADP,iBAAkB,CAElB,OACD,CAOA,iFACC,gDAAqD,CACrD,iDACD,CAKA,wHAEC,aAAc,CADd,qDAED,CAKA,uHACC,wDAA6D,CAC7D,aACD,CAoBD,mOACC,YACD,CC3GA,MACC,wCAAyC,CACzC,wEAAyE,CACzE,8EAA+E,CAC/E,2FAA4F,CAC5F,wDAAyD,CACzD,uDAAwD,CACxD,yEACD,CAgBC,+CAGC,oDAAqD,CACrD,mBAAoB,CAFpB,+CAAgD,CAVjD,SAAU,CACV,mBAAoB,CAYnB,uMAAyM,CAJzM,8CAkDD,CA1CC,mDAEC,UAAW,CAGX,cAAe,CAFf,8BAA+B,CAC/B,6BAA8B,CAH9B,UAoBD,CAdC,qDACC,mBAAoB,CACpB,mBAAoB,CAEpB,SAAU,CACV,qDAAsD,CACtD,kBAAmB,CACnB,oBAAqB,CACrB,qBACD,CAEA,wDACC,kBACD,CAGD,qDAIC,6DAcD,CARE,kEACC,oDACD,CAEA,8DACC,wDACD,CAUF,uKAvED,SAAU,CACV,mBAwEC,CAOD,gGACC,0DACD,CAOA,uKAEC,2DAQD,CANC,mLAIC,uEAAkF,CADlF,mBAAoB,CADpB,2DAA4D,CAD5D,0DAID,CAOD,8GACC,gBACD,CAKA,mDAGC,mFAAoF,CAOpF,oCAAqC,CARrC,UAAW,CAOX,oCAAwC,CARxC,mBAUD,CAOC,6JAEC,yBACD,CAUA,yKACC,iDACD,CAMA,uOAlJD,SAAU,CACV,mBAmJC,CAoBA,6yBACC,SACD,CASF,uHACC,aAAc,CACd,iBACD,CAYG,iRAlMF,SAAU,CACV,mBAmME,CAQH,kIACC,qEAKD,CAHC,wIACC,WACD,CAGD,4CACC,GACC,oBACD,CACA,OACC,mBACD,CACD,CAEA,gDACC,OACC,mBACD,CACA,OACC,mBACD,CACD,CAEA,8CACC,GACC,6HACD,CACA,IACC,6HACD,CACA,GACC,+HACD,CACD,CAEA,kDACC,GACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\toverflow: hidden;\n\t\tz-index: var(--ck-z-default);\n\n\t\t& svg {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tz-index: calc(var(--ck-z-default) + 2);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_before {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\ttop: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tleft: min(10%, 30px);\n\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_after {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\tbottom: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tright: min(10%, 30px);\n\n\t\t\ttransform: translateY(50%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 1px;\n\t\t\tleft: 1px;\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t}\n\n\t/*\n\t * When the widget is hovered the "fake caret" would normally be narrower than the\n\t * extra outline displayed around the widget. Let\'s extend the "fake caret" to match\n\t * the full width of the widget.\n\t */\n\t&:hover > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tleft: calc( -1 * var(--ck-widget-outline-thickness) );\n\t\tright: calc( -1 * var(--ck-widget-outline-thickness) );\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed before the widget (backward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_before > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\ttop: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed after the widget (forward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_after > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tbottom: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n}\n\n/*\n * Integration with the read-only mode of the editor.\n */\n.ck.ck-editor__editable.ck-read-only .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the restricted editing mode (feature) of the editor.\n */\n.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the #isEnabled property of the WidgetTypeAround plugin.\n */\n.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around {\n\tdisplay: none;\n}\n','/*\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-widget-type-around-button-size: 20px;\n\t--ck-color-widget-type-around-button-active: var(--ck-color-focus-border);\n\t--ck-color-widget-type-around-button-hover: var(--ck-color-widget-hover-border);\n\t--ck-color-widget-type-around-button-blurred-editable: var(--ck-color-widget-blurred-border);\n\t--ck-color-widget-type-around-button-radar-start-alpha: 0;\n\t--ck-color-widget-type-around-button-radar-end-alpha: .3;\n\t--ck-color-widget-type-around-button-icon: var(--ck-color-base-background);\n}\n\n@define-mixin ck-widget-type-around-button-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n@define-mixin ck-widget-type-around-button-hidden {\n\topacity: 0;\n\tpointer-events: none;\n}\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\twidth: var(--ck-widget-type-around-button-size);\n\t\theight: var(--ck-widget-type-around-button-size);\n\t\tbackground: var(--ck-color-widget-type-around-button);\n\t\tborder-radius: 100px;\n\t\ttransition: opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t@mixin ck-widget-type-around-button-hidden;\n\n\t\t& svg {\n\t\t\twidth: 10px;\n\t\t\theight: 8px;\n\t\t\ttransform: translate(-50%,-50%);\n\t\t\ttransition: transform .5s ease;\n\t\t\tmargin-top: 1px;\n\n\t\t\t& * {\n\t\t\t\tstroke-dasharray: 10;\n\t\t\t\tstroke-dashoffset: 0;\n\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--ck-color-widget-type-around-button-icon);\n\t\t\t\tstroke-width: 1.5px;\n\t\t\t\tstroke-linecap: round;\n\t\t\t\tstroke-linejoin: round;\n\t\t\t}\n\n\t\t\t& line {\n\t\t\t\tstroke-dasharray: 7;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\t/*\n\t\t\t * Display the "sonar" around the button when hovered.\n\t\t\t */\n\t\t\tanimation: ck-widget-type-around-button-sonar 1s ease infinite;\n\n\t\t\t/*\n\t\t\t * Animate active button\'s icon.\n\t\t\t */\n\t\t\t& svg {\n\t\t\t\t& polyline {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-dash 2s linear;\n\t\t\t\t}\n\n\t\t\t\t& line {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-tip-dash 2s linear;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Show type around buttons when the widget gets selected or being hovered.\n\t */\n\t&.ck-widget_selected,\n\t&:hover {\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-visible;\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when the widget is NOT selected (but the buttons are visible\n\t * and still can be hovered).\n\t */\n\t&:not(.ck-widget_selected) > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\tbackground: var(--ck-color-widget-type-around-button-hover);\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\tbackground: var(--ck-color-widget-type-around-button-active);\n\n\t\t&::after {\n\t\t\twidth: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\theight: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\tborder-radius: 100px;\n\t\t\tbackground: linear-gradient(135deg, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,.3) 100%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the "before" button when the widget has a selection handle. Because some space\n\t * is consumed by the handle, the button must be moved slightly to the right to let it breathe.\n\t */\n\t&.ck-widget_with-selection-handle > .ck-widget__type-around > .ck-widget__type-around__button_before {\n\t\tmargin-left: 20px;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& .ck-widget__type-around__fake-caret {\n\t\tpointer-events: none;\n\t\theight: 1px;\n\t\tanimation: ck-widget-type-around-fake-caret-pulse linear 1s infinite normal forwards;\n\n\t\t/*\n\t\t * The semi-transparent-outline+background combo improves the contrast\n\t\t * when the background underneath the fake caret is dark.\n\t\t */\n\t\toutline: solid 1px hsla(0, 0%, 100%, .5);\n\t\tbackground: var(--ck-color-base-text);\n\t}\n\n\t/*\n\t * Styles of the widget when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t * Despite the widget being physically selected in the model, its outline should disappear.\n\t */\n\t&.ck-widget_selected {\n\t\t&.ck-widget_type-around_show-fake-caret_before,\n\t\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t\toutline-color: transparent;\n\t\t}\n\t}\n\n\t&.ck-widget_type-around_show-fake-caret_before,\n\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t/*\n\t\t * When the "fake caret" is visible we simulate that the widget is not selected\n\t\t * (despite being physically selected), so the outline color should be for the\n\t\t * unselected widget.\n\t\t */\n\t\t&.ck-widget_selected:hover {\n\t\t\toutline-color: var(--ck-color-widget-hover-border);\n\t\t}\n\n\t\t/*\n\t\t * Styles of the type around buttons when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t\t * In this state, the type around buttons would collide with the fake carets so they should disappear.\n\t\t */\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the selection handle. When the caret is visible, simply\n\t\t * hide the handle because it intersects with the caret (and does not make much sense anyway).\n\t\t */\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t&.ck-widget_selected,\n\t\t\t&.ck-widget_selected:hover {\n\t\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\t\topacity: 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the resize UI. When the caret is visible, simply\n\t\t * hide the resize UI because it creates too much noise. It can be visible when the user\n\t\t * hovers the widget, though.\n\t\t */\n\t\t&.ck-widget_selected.ck-widget_with-resizer > .ck-widget__resizer {\n\t\t\topacity: 0\n\t\t}\n\t}\n}\n\n/*\n * Styles for the "before" button when the widget has a selection handle in an RTL environment.\n * The selection handler is aligned to the right side of the widget so there is no need to create\n * additional space for it next to the "before" button.\n */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around > .ck-widget__type-around__button_before {\n\tmargin-left: 0;\n\tmargin-right: 20px;\n}\n\n/*\n * Hide type around buttons when the widget is selected as a child of a selected\n * nested editable (e.g. mulit-cell table selection).\n *\n * See https://github.com/ckeditor/ckeditor5/issues/7263.\n */\n.ck-editor__nested-editable.ck-editor__editable_selected {\n\t& .ck-widget {\n\t\t&.ck-widget_selected,\n\t\t&:hover {\n\t\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n * Styles for the buttons when the widget is selected but the user clicked outside of the editor (blurred the editor).\n */\n.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button:not(:hover) {\n\tbackground: var(--ck-color-widget-type-around-button-blurred-editable);\n\n\t& svg * {\n\t\tstroke: hsl(0,0%,60%);\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-dash {\n\t0% {\n\t\tstroke-dashoffset: 10;\n\t}\n\t20%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-tip-dash {\n\t0%, 20% {\n\t\tstroke-dashoffset: 7;\n\t}\n\t40%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-button-sonar {\n\t0% {\n\t\tbox-shadow: 0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n\t50% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha));\n\t}\n\t100% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n}\n\n@keyframes ck-widget-type-around-fake-caret-pulse {\n\t0% {\n\t\topacity: 1;\n\t}\n\t49% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0;\n\t}\n\t99% {\n\t\topacity: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t}\n}\n'],sourceRoot:""}]);const a=s},2609:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=t(e);return e[2]?"@media ".concat(e[2]," {").concat(n,"}"):n})).join("")},e.i=function(t,n,o){"string"==typeof t&&(t=[[null,t,""]]);var i={};if(o)for(var r=0;r{function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=t&&("undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"]);if(null==n)return;var o,i,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(o=n.next()).done)&&(r.push(o.value),!e||r.length!==e);s=!0);}catch(t){a=!0,i=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw i}}return r}(t,e)||function(t,e){if(!t)return;if("string"==typeof t)return n(t,e);var o=Object.prototype.toString.call(t).slice(8,-1);"Object"===o&&t.constructor&&(o=t.constructor.name);if("Map"===o||"Set"===o)return Array.from(t);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return n(t,e)}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n{var o,i=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},r=function(){var t={};return function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(t){n=null}t[e]=n}return t[e]}}(),s=[];function a(t){for(var e=-1,n=0;n{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},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),n.nc=void 0;var o={};return(()=>{n.d(o,{default:()=>jv});const t=function(){try{return navigator.userAgent.toLowerCase()}catch(t){return""}}(),e={isMac:r(t),isWindows:function(t){return t.indexOf("windows")>-1}(t),isGecko:function(t){return!!t.match(/gecko\/\d+/)}(t),isSafari:function(t){return t.indexOf(" applewebkit/")>-1&&-1===t.indexOf("chrome")}(t),isiOS:function(t){return!!t.match(/iphone|ipad/i)||r(t)&&navigator.maxTouchPoints>0}(t),isAndroid:function(t){return t.indexOf("android")>-1}(t),isBlink:function(t){return t.indexOf("chrome/")>-1&&t.indexOf("edge/")<0}(t),features:{isRegExpUnicodePropertySupported:function(){let t=!1;try{t=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(t){}return t}()}},i=e;function r(t){return t.indexOf("macintosh")>-1}function s(t,e,n,o){n=n||function(t,e){return t===e};const i=Array.isArray(t)?t:Array.prototype.slice.call(t),r=Array.isArray(e)?e:Array.prototype.slice.call(e),s=function(t,e,n){const o=a(t,e,n);if(-1===o)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const i=c(t,o),r=c(e,o),s=a(i,r,n),l=t.length-s,d=e.length-s;return{firstIndex:o,lastIndexOld:l,lastIndexNew:d}}(i,r,n),l=o?function(t,e){const{firstIndex:n,lastIndexOld:o,lastIndexNew:i}=t;if(-1===n)return Array(e).fill("equal");let r=[];n>0&&(r=r.concat(Array(n).fill("equal")));i-n>0&&(r=r.concat(Array(i-n).fill("insert")));o-n>0&&(r=r.concat(Array(o-n).fill("delete")));i0&&n.push({index:o,type:"insert",values:t.slice(o,r)});i-o>0&&n.push({index:o+(r-o),type:"delete",howMany:i-o});return n}(r,s);return l}function a(t,e,n){for(let o=0;o200||i>200||o+i>300)return l.fastDiff(t,e,n,!0);let r,s;if(il?-1:1;h[o+d]&&(h[o]=h[o+d].slice(0)),h[o]||(h[o]=[]),h[o].push(i>l?r:s);let g=Math.max(i,l),m=g-o;for(;md;m--)u[m]=g(m);u[d]=g(d),p++}while(u[d]!==c);return h[d].slice(1)}function d(t,...e){e.forEach((e=>{const n=Object.getOwnPropertyNames(e),o=Object.getOwnPropertySymbols(e);n.concat(o).forEach((n=>{if(n in t.prototype)return;if("function"==typeof e&&("length"==n||"name"==n||"prototype"==n))return;const o=Object.getOwnPropertyDescriptor(e,n);o.enumerable=!1,Object.defineProperty(t.prototype,n,o)}))}))}l.fastDiff=s;const h=function(){return function t(){t.called=!0}};class u{constructor(t,e){this.source=t,this.name=e,this.path=[],this.stop=h(),this.off=h()}}const g=new Array(256).fill("").map(((t,e)=>("0"+e.toString(16)).slice(-2)));function m(){const t=4294967296*Math.random()>>>0,e=4294967296*Math.random()>>>0,n=4294967296*Math.random()>>>0,o=4294967296*Math.random()>>>0;return"e"+g[t>>0&255]+g[t>>8&255]+g[t>>16&255]+g[t>>24&255]+g[e>>0&255]+g[e>>8&255]+g[e>>16&255]+g[e>>24&255]+g[n>>0&255]+g[n>>8&255]+g[n>>16&255]+g[n>>24&255]+g[o>>0&255]+g[o>>8&255]+g[o>>16&255]+g[o>>24&255]}const p={get(t="normal"){return"number"!=typeof t?this[t]||this.normal:t},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};function f(t,e){const n=p.get(e.priority);for(let o=0;o{if("object"==typeof e&&null!==e){if(n.has(e))return`[object ${e.constructor.name}]`;n.add(e)}return e},i=e?` ${JSON.stringify(e,o)}`:"",r=A(t);return t+i+r}(t,n)),this.name="CKEditorError",this.context=e,this.data=n}is(t){return"CKEditorError"===t}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError"))throw t;const n=new b(t.message,e);throw n.stack=t.stack,n}}function w(t,e){console.warn(...C(t,e))}function _(t,e){console.error(...C(t,e))}function A(t){return`\nRead more: ${k}#error-${t}`}function C(t,e){const n=A(t);return e?[t,e,n]:[t,n]}const v="36.0.1",y="object"==typeof window?window:n.g;if(y.CKEDITOR_VERSION)throw new b("ckeditor-duplicated-modules",null);y.CKEDITOR_VERSION=v;const x=Symbol("listeningTo"),E=Symbol("emitterId"),D=Symbol("delegations"),I=T(Object);function T(t){if(!t)return I;return class extends t{on(t,e,n){this.listenTo(this,t,e,n)}once(t,e,n){let o=!1;this.listenTo(this,t,((t,...n)=>{o||(o=!0,t.off(),e.call(this,t,...n))}),n)}off(t,e){this.stopListening(this,t,e)}listenTo(t,e,n,o={}){let i,r;this[x]||(this[x]={});const s=this[x];S(t)||M(t);const a=S(t);(i=s[a])||(i=s[a]={emitter:t,callbacks:{}}),(r=i.callbacks[e])||(r=i.callbacks[e]=[]),r.push(n),function(t,e,n,o,i){e._addEventListener?e._addEventListener(n,o,i):t._addEventListener.call(e,n,o,i)}(this,t,e,n,o)}stopListening(t,e,n){const o=this[x];let i=t&&S(t);const r=o&&i?o[i]:void 0,s=r&&e?r.callbacks[e]:void 0;if(!(!o||t&&!r||e&&!s))if(n){L(this,t,e,n);-1!==s.indexOf(n)&&(1===s.length?delete r.callbacks[e]:L(this,t,e,n))}else if(s){for(;n=s.pop();)L(this,t,e,n);delete r.callbacks[e]}else if(r){for(e in r.callbacks)this.stopListening(t,e);delete o[i]}else{for(i in o)this.stopListening(o[i].emitter);delete this[x]}}fire(t,...e){try{const n=t instanceof u?t:new u(this,t),o=n.name;let i=P(this,o);if(n.path.push(this),i){const t=[n,...e];i=Array.from(i);for(let e=0;e{this[D]||(this[D]=new Map),t.forEach((t=>{const o=this[D].get(t);o?o.set(e,n):this[D].set(t,new Map([[e,n]]))}))}}}stopDelegating(t,e){if(this[D])if(t)if(e){const n=this[D].get(t);n&&n.delete(e)}else this[D].delete(t);else this[D].clear()}_addEventListener(t,e,n){!function(t,e){const n=N(t);if(n[e])return;let o=e,i=null;const r=[];for(;""!==o&&!n[o];)n[o]={callbacks:[],childEvents:[]},r.push(n[o]),i&&n[o].childEvents.push(i),i=o,o=o.substr(0,o.lastIndexOf(":"));if(""!==o){for(const t of r)t.callbacks=n[o].callbacks.slice();n[o].childEvents.push(i)}}(this,t);const o=B(this,t),i={callback:e,priority:p.get(n.priority)};for(const t of o)f(t,i)}_removeEventListener(t,e){const n=B(this,t);for(const t of n)for(let n=0;n-1?P(t,e.substr(0,e.lastIndexOf(":"))):null}function z(t,e,n){for(let[o,i]of t){i?"function"==typeof i&&(i=i(e.name)):i=e.name;const t=new u(e.source,i);t.path=[...e.path],o.fire(t,...n)}}function L(t,e,n,o){e._removeEventListener?e._removeEventListener(n,o):t._removeEventListener.call(e,n,o)}["on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{T[t]=I.prototype[t]}));const O=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)},R=Symbol("observableProperties"),j=Symbol("boundObservables"),F=Symbol("boundProperties"),V=Symbol("decoratedMethods"),H=Symbol("decoratedOriginal"),U=W(T());function W(t){if(!t)return U;return class extends t{set(t,e){if(O(t))return void Object.keys(t).forEach((e=>{this.set(e,t[e])}),this);q(this);const n=this[R];if(t in this&&!n.has(t))throw new b("observable-set-cannot-override",this);Object.defineProperty(this,t,{enumerable:!0,configurable:!0,get:()=>n.get(t),set(e){const o=n.get(t);let i=this.fire(`set:${t}`,t,e,o);void 0===i&&(i=e),o===i&&n.has(t)||(n.set(t,i),this.fire(`change:${t}`,t,i,o))}}),this[t]=e}bind(...t){if(!t.length||!Y(t))throw new b("observable-bind-wrong-properties",this);if(new Set(t).size!==t.length)throw new b("observable-bind-duplicate-properties",this);q(this);const e=this[F];t.forEach((t=>{if(e.has(t))throw new b("observable-bind-rebind",this)}));const n=new Map;return t.forEach((t=>{const o={property:t,to:[]};e.set(t,o),n.set(t,o)})),{to:G,toMany:$,_observable:this,_bindProperties:t,_to:[],_bindings:n}}unbind(...t){if(!this[R])return;const e=this[F],n=this[j];if(t.length){if(!Y(t))throw new b("observable-unbind-wrong-properties",this);t.forEach((t=>{const o=e.get(t);o&&(o.to.forEach((([t,e])=>{const i=n.get(t),r=i[e];r.delete(o),r.size||delete i[e],Object.keys(i).length||(n.delete(t),this.stopListening(t,"change"))})),e.delete(t))}))}else n.forEach(((t,e)=>{this.stopListening(e,"change")})),n.clear(),e.clear()}decorate(t){q(this);const e=this[t];if(!e)throw new b("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:t});this.on(t,((t,n)=>{t.return=e.apply(this,n)})),this[t]=function(...e){return this.fire(t,e)},this[t][H]=e,this[V]||(this[V]=[]),this[V].push(t)}stopListening(t,e,n){if(!t&&this[V]){for(const t of this[V])this[t]=this[t][H];delete this[V]}super.stopListening(t,e,n)}}}function q(t){t[R]||(Object.defineProperty(t,R,{value:new Map}),Object.defineProperty(t,j,{value:new Map}),Object.defineProperty(t,F,{value:new Map}))}function G(...t){const e=function(...t){if(!t.length)throw new b("observable-bind-to-parse-error",null);const e={to:[]};let n;"function"==typeof t[t.length-1]&&(e.callback=t.pop());return t.forEach((t=>{if("string"==typeof t)n.properties.push(t);else{if("object"!=typeof t)throw new b("observable-bind-to-parse-error",null);n={observable:t,properties:[]},e.to.push(n)}})),e}(...t),n=Array.from(this._bindings.keys()),o=n.length;if(!e.callback&&e.to.length>1)throw new b("observable-bind-to-no-callback",this);if(o>1&&e.callback)throw new b("observable-bind-to-extra-callback",this);var i;e.to.forEach((t=>{if(t.properties.length&&t.properties.length!==o)throw new b("observable-bind-to-properties-length",this);t.properties.length||(t.properties=this._bindProperties)})),this._to=e.to,e.callback&&(this._bindings.get(n[0]).callback=e.callback),i=this._observable,this._to.forEach((t=>{const e=i[j];let n;e.get(t.observable)||i.listenTo(t.observable,"change",((o,r)=>{n=e.get(t.observable)[r],n&&n.forEach((t=>{K(i,t.property)}))}))})),function(t){let e;t._bindings.forEach(((n,o)=>{t._to.forEach((i=>{e=i.properties[n.callback?0:t._bindProperties.indexOf(o)],n.to.push([i.observable,e]),function(t,e,n,o){const i=t[j],r=i.get(n),s=r||{};s[o]||(s[o]=new Set);s[o].add(e),r||i.set(n,s)}(t._observable,n,i.observable,e)}))}))}(this),this._bindProperties.forEach((t=>{K(this._observable,t)}))}function $(t,e,n){if(this._bindings.size>1)throw new b("observable-bind-to-many-not-one-binding",this);this.to(...function(t,e){const n=t.map((t=>[t,e]));return Array.prototype.concat.apply([],n)}(t,e),n)}function Y(t){return t.every((t=>"string"==typeof t))}function K(t,e){const n=t[F].get(e);let o;n.callback?o=n.callback.apply(t,n.to.map((t=>t[0][t[1]]))):(o=n.to[0],o=o[0][o[1]]),Object.prototype.hasOwnProperty.call(t,e)?t[e]=o:t.set(e,o)}function Q(t){let e=0;for(const n of t)e++;return e}function Z(t,e){const n=Math.min(t.length,e.length);for(let o=0;o{W[t]=U.prototype[t]}));const X="object"==typeof global&&global&&global.Object===Object&&global;var tt="object"==typeof self&&self&&self.Object===Object&&self;const et=X||tt||Function("return this")();const nt=et.Symbol;var ot=Object.prototype,it=ot.hasOwnProperty,rt=ot.toString,st=nt?nt.toStringTag:void 0;const at=function(t){var e=it.call(t,st),n=t[st];try{t[st]=void 0;var o=!0}catch(t){}var i=rt.call(t);return o&&(e?t[st]=n:delete t[st]),i};var ct=Object.prototype.toString;const lt=function(t){return ct.call(t)};var dt="[object Null]",ht="[object Undefined]",ut=nt?nt.toStringTag:void 0;const gt=function(t){return null==t?void 0===t?ht:dt:ut&&ut in Object(t)?at(t):lt(t)};const mt=Array.isArray;const pt=function(t){return null!=t&&"object"==typeof t};var ft="[object String]";const kt=function(t){return"string"==typeof t||!mt(t)&&pt(t)&>(t)==ft};function bt(t,e,n={},o=[]){const i=n&&n.xmlns,r=i?t.createElementNS(i,e):t.createElement(e);for(const t in n)r.setAttribute(t,n[t]);!kt(o)&&J(o)||(o=[o]);for(let e of o)kt(e)&&(e=t.createTextNode(e)),r.appendChild(e);return r}const wt=function(t,e){return function(n){return t(e(n))}};const _t=wt(Object.getPrototypeOf,Object);var At="[object Object]",Ct=Function.prototype,vt=Object.prototype,yt=Ct.toString,xt=vt.hasOwnProperty,Et=yt.call(Object);const Dt=function(t){if(!pt(t)||gt(t)!=At)return!1;var e=_t(t);if(null===e)return!0;var n=xt.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&yt.call(n)==Et};const It=function(){this.__data__=[],this.size=0};const Tt=function(t,e){return t===e||t!=t&&e!=e};const Mt=function(t,e){for(var n=t.length;n--;)if(Tt(t[n][0],e))return n;return-1};var St=Array.prototype.splice;const Nt=function(t){var e=this.__data__,n=Mt(e,t);return!(n<0)&&(n==e.length-1?e.pop():St.call(e,n,1),--this.size,!0)};const Bt=function(t){var e=this.__data__,n=Mt(e,t);return n<0?void 0:e[n][1]};const Pt=function(t){return Mt(this.__data__,t)>-1};const zt=function(t,e){var n=this.__data__,o=Mt(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this};function Lt(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t-1&&t%1==0&&t<=tn};var nn={};nn["[object Float32Array]"]=nn["[object Float64Array]"]=nn["[object Int8Array]"]=nn["[object Int16Array]"]=nn["[object Int32Array]"]=nn["[object Uint8Array]"]=nn["[object Uint8ClampedArray]"]=nn["[object Uint16Array]"]=nn["[object Uint32Array]"]=!0,nn["[object Arguments]"]=nn["[object Array]"]=nn["[object ArrayBuffer]"]=nn["[object Boolean]"]=nn["[object DataView]"]=nn["[object Date]"]=nn["[object Error]"]=nn["[object Function]"]=nn["[object Map]"]=nn["[object Number]"]=nn["[object Object]"]=nn["[object RegExp]"]=nn["[object Set]"]=nn["[object String]"]=nn["[object WeakMap]"]=!1;const on=function(t){return pt(t)&&en(t.length)&&!!nn[gt(t)]};const rn=function(t){return function(e){return t(e)}};var sn="object"==typeof exports&&exports&&!exports.nodeType&&exports,an=sn&&"object"==typeof module&&module&&!module.nodeType&&module,cn=an&&an.exports===sn&&X.process;const ln=function(){try{var t=an&&an.require&&an.require("util").types;return t||cn&&cn.binding&&cn.binding("util")}catch(t){}}();var dn=ln&&ln.isTypedArray;const hn=dn?rn(dn):on;var un=Object.prototype.hasOwnProperty;const gn=function(t,e){var n=mt(t),o=!n&&qe(t),i=!n&&!o&&Qe(t),r=!n&&!o&&!i&&hn(t),s=n||o||i||r,a=s?je(t.length,String):[],c=a.length;for(var l in t)!e&&!un.call(t,l)||s&&("length"==l||i&&("offset"==l||"parent"==l)||r&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||Xe(l,c))||a.push(l);return a};var mn=Object.prototype;const pn=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||mn)};const fn=wt(Object.keys,Object);var kn=Object.prototype.hasOwnProperty;const bn=function(t){if(!pn(t))return fn(t);var e=[];for(var n in Object(t))kn.call(t,n)&&"constructor"!=n&&e.push(n);return e};const wn=function(t){return null!=t&&en(t.length)&&!Gt(t)};const _n=function(t){return wn(t)?gn(t):bn(t)};const An=function(t,e){return t&&Re(e,_n(e),t)};const Cn=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var vn=Object.prototype.hasOwnProperty;const yn=function(t){if(!O(t))return Cn(t);var e=pn(t),n=[];for(var o in t)("constructor"!=o||!e&&vn.call(t,o))&&n.push(o);return n};const xn=function(t){return wn(t)?gn(t,!0):yn(t)};const En=function(t,e){return t&&Re(e,xn(e),t)};var Dn="object"==typeof exports&&exports&&!exports.nodeType&&exports,In=Dn&&"object"==typeof module&&module&&!module.nodeType&&module,Tn=In&&In.exports===Dn?et.Buffer:void 0,Mn=Tn?Tn.allocUnsafe:void 0;const Sn=function(t,e){if(e)return t.slice();var n=t.length,o=Mn?Mn(n):new t.constructor(n);return t.copy(o),o};const Nn=function(t,e){var n=-1,o=t.length;for(e||(e=Array(o));++n{this._setToTarget(t,o,e[o],n)}))}}function di(t){return ai(t,hi)}function hi(t){return ci(t)?t:void 0}function ui(t){if(t){if(t.defaultView)return t instanceof t.defaultView.Document;if(t.ownerDocument&&t.ownerDocument.defaultView)return t instanceof t.ownerDocument.defaultView.Node}return!1}function gi(t){const e=Object.prototype.toString.apply(t);return"[object Window]"==e||"[object global]"==e}const mi=pi(T());function pi(t){if(!t)return mi;return class extends t{listenTo(t,e,n,o={}){if(ui(t)||gi(t)){const i={capture:!!o.useCapture,passive:!!o.usePassive},r=this._getProxyEmitter(t,i)||new fi(t,i);this.listenTo(r,e,n,o)}else super.listenTo(t,e,n,o)}stopListening(t,e,n){if(ui(t)||gi(t)){const o=this._getAllProxyEmitters(t);for(const t of o)this.stopListening(t,e,n)}else super.stopListening(t,e,n)}_getProxyEmitter(t,e){return function(t,e){const n=t[x];return n&&n[e]?n[e].emitter:null}(this,ki(t,e))}_getAllProxyEmitters(t){return[{capture:!1,passive:!1},{capture:!1,passive:!0},{capture:!0,passive:!1},{capture:!0,passive:!0}].map((e=>this._getProxyEmitter(t,e))).filter((t=>!!t))}}}["_getProxyEmitter","_getAllProxyEmitters","on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{pi[t]=mi.prototype[t]}));class fi extends(T()){constructor(t,e){super(),M(this,ki(t,e)),this._domNode=t,this._options=e}attach(t){if(this._domListeners&&this._domListeners[t])return;const e=this._createDomListener(t);this._domNode.addEventListener(t,e,this._options),this._domListeners||(this._domListeners={}),this._domListeners[t]=e}detach(t){let e;!this._domListeners[t]||(e=this._events[t])&&e.callbacks.length||this._domListeners[t].removeListener()}_addEventListener(t,e,n){this.attach(t),T().prototype._addEventListener.call(this,t,e,n)}_removeEventListener(t,e){T().prototype._removeEventListener.call(this,t,e),this.detach(t)}_createDomListener(t){const e=e=>{this.fire(t,e)};return e.removeListener=()=>{this._domNode.removeEventListener(t,e,this._options),delete this._domListeners[t]},e}}function ki(t,e){let n=function(t){return t["data-ck-expando"]||(t["data-ck-expando"]=m())}(t);for(const t of Object.keys(e).sort())e[t]&&(n+="-"+t);return n}let bi;try{bi={window,document}}catch(t){bi={window:{},document:{}}}const wi=bi;function _i(t){const e=[];let n=t;for(;n&&n.nodeType!=Node.DOCUMENT_NODE;)e.unshift(n),n=n.parentNode;return e}function Ai(t){return"[object Text]"==Object.prototype.toString.call(t)}function Ci(t){return"[object Range]"==Object.prototype.toString.apply(t)}function vi(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}const yi=["top","right","bottom","left","width","height"];class xi{constructor(t){const e=Ci(t);if(Object.defineProperty(this,"_source",{value:t._source||t,writable:!0,enumerable:!1}),Ii(t)||e)if(e){const e=xi.getDomRangeRects(t);Ei(this,xi.getBoundingRect(e))}else Ei(this,t.getBoundingClientRect());else if(gi(t)){const{innerWidth:e,innerHeight:n}=t;Ei(this,{top:0,right:e,bottom:n,left:0,width:e,height:n})}else Ei(this,t)}clone(){return new xi(this)}moveTo(t,e){return this.top=e,this.right=t+this.width,this.bottom=e+this.height,this.left=t,this}moveBy(t,e){return this.top+=e,this.right+=t,this.left+=t,this.bottom+=e,this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left),width:0,height:0};return e.width=e.right-e.left,e.height=e.bottom-e.top,e.width<0||e.height<0?null:new xi(e)}getIntersectionArea(t){const e=this.getIntersection(t);return e?e.getArea():0}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(!Di(t)){let n=t.parentNode||t.commonAncestorContainer;for(;n&&!Di(n);){const t=new xi(n),o=e.getIntersection(t);if(!o)return null;o.getArea(){for(const e of t){const t=Ti._getElementCallbacks(e.target);if(t)for(const n of t)n(e)}}))}}function Mi(t,e){t instanceof HTMLTextAreaElement&&(t.value=e),t.innerHTML=e}function Si(t){return e=>e+t}function Ni(t){let e=0;for(;t.previousSibling;)t=t.previousSibling,e++;return e}function Bi(t,e,n){t.insertBefore(n,t.childNodes[e]||null)}function Pi(t){return t&&t.nodeType===Node.COMMENT_NODE}function zi(t){return!!(t&&t.getClientRects&&t.getClientRects().length)}function Li({element:t,target:e,positions:n,limiter:o,fitInViewport:i,viewportOffsetConfig:r}){Gt(e)&&(e=e()),Gt(o)&&(o=o());const s=function(t){return t&&t.parentNode?t.offsetParent===wi.document.body?null:t.offsetParent:null}(t),a=new xi(t),c=new xi(e);let l;const d=i&&function(t){t=Object.assign({top:0,bottom:0,left:0,right:0},t);const e=new xi(wi.window);return e.top+=t.top,e.height-=t.top,e.bottom-=t.bottom,e.height-=t.bottom,e}(r)||null,h={targetRect:c,elementRect:a,positionedElementAncestor:s,viewportRect:d};if(o||i){const t=o&&new xi(o).getVisible();Object.assign(h,{limiterRect:t,viewportRect:d}),l=function(t,e){const{elementRect:n}=e,o=n.getArea(),i=t.map((t=>new Ri(t,e))).filter((t=>!!t.name));let r=0,s=null;for(const t of i){const{limiterIntersectionArea:e,viewportIntersectionArea:n}=t;if(e===o)return t;const i=n**2+e**2;i>r&&(r=i,s=t)}return s}(n,h)||new Ri(n[0],h)}else l=new Ri(n[0],h);return l}function Oi(t){const{scrollX:e,scrollY:n}=wi.window;return t.clone().moveBy(e,n)}Ti._observerInstance=null,Ti._elementCallbacks=null;class Ri{constructor(t,e){const n=t(e.targetRect,e.elementRect,e.viewportRect);if(!n)return;const{left:o,top:i,name:r,config:s}=n;this.name=r,this.config=s,this._positioningFunctionCorrdinates={left:o,top:i},this._options=e}get left(){return this._absoluteRect.left}get top(){return this._absoluteRect.top}get limiterIntersectionArea(){const t=this._options.limiterRect;if(t){const e=this._options.viewportRect;if(!e)return t.getIntersectionArea(this._rect);{const n=t.getIntersection(e);if(n)return n.getIntersectionArea(this._rect)}}return 0}get viewportIntersectionArea(){const t=this._options.viewportRect;return t?t.getIntersectionArea(this._rect):0}get _rect(){return this._cachedRect||(this._cachedRect=this._options.elementRect.clone().moveTo(this._positioningFunctionCorrdinates.left,this._positioningFunctionCorrdinates.top)),this._cachedRect}get _absoluteRect(){return this._cachedAbsoluteRect||(this._cachedAbsoluteRect=Oi(this._rect),this._options.positionedElementAncestor&&function(t,e){const n=Oi(new xi(e)),o=vi(e);let i=0,r=0;i-=n.left,r-=n.top,i+=e.scrollLeft,r+=e.scrollTop,i-=o.left,r-=o.top,t.moveBy(i,r)}(this._cachedAbsoluteRect,this._options.positionedElementAncestor)),this._cachedAbsoluteRect}}function ji(t){const e=t.parentNode;e&&e.removeChild(t)}function Fi(t,e,n){const o=e.clone().moveBy(0,n),i=e.clone().moveBy(0,-n),r=new xi(t).excludeScrollbarsAndBorders();if(![i,o].every((t=>r.contains(t)))){let{scrollX:s,scrollY:a}=t;Ui(i,r)?a-=r.top-e.top+n:Hi(o,r)&&(a+=e.bottom-r.bottom+n),Wi(e,r)?s-=r.left-e.left+n:qi(e,r)&&(s+=e.right-r.right+n),t.scrollTo(s,a)}}function Vi(t,e){const n=Gi(t);let o,i;for(;t!=n.document.body;)i=e(),o=new xi(t).excludeScrollbarsAndBorders(),o.contains(i)||(Ui(i,o)?t.scrollTop-=o.top-i.top:Hi(i,o)&&(t.scrollTop+=i.bottom-o.bottom),Wi(i,o)?t.scrollLeft-=o.left-i.left:qi(i,o)&&(t.scrollLeft+=i.right-o.right)),t=t.parentNode}function Hi(t,e){return t.bottom>e.bottom}function Ui(t,e){return t.tope.right}function Gi(t){return Ci(t)?t.startContainer.ownerDocument.defaultView:t.ownerDocument.defaultView}function $i(t){if(Ci(t)){let e=t.commonAncestorContainer;return Ai(e)&&(e=e.parentNode),e}return t.parentNode}function Yi(t,e){const n=Gi(t),o=new xi(t);if(n===e)return o;{let t=n;for(;t!=e;){const e=t.frameElement,n=new xi(e).excludeScrollbarsAndBorders();o.moveBy(n.left,n.top),t=t.parent}}return o}const Ki={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"},Qi={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"},Zi=function(){const t={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let e=65;e<=90;e++){t[String.fromCharCode(e).toLowerCase()]=e}for(let e=48;e<=57;e++)t[e-48]=e;for(let e=112;e<=123;e++)t["f"+(e-111)]=e;for(const e of"`-=[];',./\\")t[e]=e.charCodeAt(0);return t}(),Ji=Object.fromEntries(Object.entries(Zi).map((([t,e])=>[e,t.charAt(0).toUpperCase()+t.slice(1)])));function Xi(t){let e;if("string"==typeof t){if(e=Zi[t.toLowerCase()],!e)throw new b("keyboard-unknown-key",null,{key:t})}else e=t.keyCode+(t.altKey?Zi.alt:0)+(t.ctrlKey?Zi.ctrl:0)+(t.shiftKey?Zi.shift:0)+(t.metaKey?Zi.cmd:0);return e}function tr(t){return"string"==typeof t&&(t=function(t){return t.split("+").map((t=>t.trim()))}(t)),t.map((t=>"string"==typeof t?function(t){if(t.endsWith("!"))return Xi(t.slice(0,-1));const e=Xi(t);return i.isMac&&e==Zi.ctrl?Zi.cmd:e}(t):t)).reduce(((t,e)=>e+t),0)}function er(t){let e=tr(t);return Object.entries(i.isMac?Ki:Qi).reduce(((t,[n,o])=>(0!=(e&Zi[n])&&(e&=~Zi[n],t+=o),t)),"")+(e?Ji[e]:"")}function nr(t,e){const n="ltr"===e;switch(t){case Zi.arrowleft:return n?"left":"right";case Zi.arrowright:return n?"right":"left";case Zi.arrowup:return"up";case Zi.arrowdown:return"down"}}function or(t){return Array.isArray(t)?t:[t]}function ir(t,e,n=1){if("number"!=typeof n)throw new b("translation-service-quantity-not-a-number",null,{quantity:n});const o=Object.keys(wi.window.CKEDITOR_TRANSLATIONS).length;1===o&&(t=Object.keys(wi.window.CKEDITOR_TRANSLATIONS)[0]);const i=e.id||e.string;if(0===o||!function(t,e){return!!wi.window.CKEDITOR_TRANSLATIONS[t]&&!!wi.window.CKEDITOR_TRANSLATIONS[t].dictionary[e]}(t,i))return 1!==n?e.plural:e.string;const r=wi.window.CKEDITOR_TRANSLATIONS[t].dictionary,s=wi.window.CKEDITOR_TRANSLATIONS[t].getPluralForm||(t=>1===t?0:1),a=r[i];if("string"==typeof a)return a;return a[Number(s(n))]}wi.window.CKEDITOR_TRANSLATIONS||(wi.window.CKEDITOR_TRANSLATIONS={});const rr=["ar","ara","fa","per","fas","he","heb","ku","kur","ug","uig"];function sr(t){return rr.includes(t)?"rtl":"ltr"}class ar{constructor({uiLanguage:t="en",contentLanguage:e}={}){this.uiLanguage=t,this.contentLanguage=e||this.uiLanguage,this.uiLanguageDirection=sr(this.uiLanguage),this.contentLanguageDirection=sr(this.contentLanguage),this.t=(t,e)=>this._t(t,e)}get language(){return console.warn("locale-deprecated-language-property: The Locale#language property has been deprecated and will be removed in the near future. Please use #uiLanguage and #contentLanguage properties instead."),this.uiLanguage}_t(t,e=[]){e=or(e),"string"==typeof t&&(t={string:t});const n=!!t.plural?e[0]:1;return function(t,e){return t.replace(/%(\d+)/g,((t,n)=>nthis._items.length||e<0)throw new b("collection-add-item-invalid-index",this);let n=0;for(const o of t){const t=this._getItemIdBeforeAdding(o),i=e+n;this._items.splice(i,0,o),this._itemMap.set(t,o),this.fire("add",o,i),n++}return this.fire("change",{added:t,removed:[],index:e}),this}get(t){let e;if("string"==typeof t)e=this._itemMap.get(t);else{if("number"!=typeof t)throw new b("collection-get-invalid-arg",this);e=this._items[t]}return e||null}has(t){if("string"==typeof t)return this._itemMap.has(t);{const e=t[this._idProperty];return e&&this._itemMap.has(e)}}getIndex(t){let e;return e="string"==typeof t?this._itemMap.get(t):t,e?this._items.indexOf(e):-1}remove(t){const[e,n]=this._remove(t);return this.fire("change",{added:[],removed:[e],index:n}),e}map(t,e){return this._items.map(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);const t=Array.from(this._items);for(;this.length;)this._remove(0);this.fire("change",{added:[],removed:t,index:0})}bindTo(t){if(this._bindToCollection)throw new b("collection-bind-to-rebind",this);return this._bindToCollection=t,{as:t=>{this._setUpBindToBinding((e=>new t(e)))},using:t=>{"function"==typeof t?this._setUpBindToBinding(t):this._setUpBindToBinding((e=>e[t]))}}}_setUpBindToBinding(t){const e=this._bindToCollection,n=(n,o,i)=>{const r=e._bindToCollection==this,s=e._bindToInternalToExternalMap.get(o);if(r&&s)this._bindToExternalToInternalMap.set(o,s),this._bindToInternalToExternalMap.set(s,o);else{const n=t(o);if(!n)return void this._skippedIndexesFromExternal.push(i);let r=i;for(const t of this._skippedIndexesFromExternal)i>t&&r--;for(const t of e._skippedIndexesFromExternal)r>=t&&r++;this._bindToExternalToInternalMap.set(o,n),this._bindToInternalToExternalMap.set(n,o),this.add(n,r);for(let t=0;t{const o=this._bindToExternalToInternalMap.get(e);o&&this.remove(o),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce(((t,e)=>(ne&&t.push(e),t)),[])}))}_getItemIdBeforeAdding(t){const e=this._idProperty;let n;if(e in t){if(n=t[e],"string"!=typeof n)throw new b("collection-add-invalid-id",this);if(this.get(n))throw new b("collection-add-item-already-exists",this)}else t[e]=n=m();return n}_remove(t){let e,n,o,i=!1;const r=this._idProperty;if("string"==typeof t?(n=t,o=this._itemMap.get(n),i=!o,o&&(e=this._items.indexOf(o))):"number"==typeof t?(e=t,o=this._items[e],i=!o,o&&(n=o[r])):(o=t,n=o[r],e=this._items.indexOf(o),i=-1==e||!this._itemMap.get(n)),i)throw new b("collection-remove-404",this);this._items.splice(e,1),this._itemMap.delete(n);const s=this._bindToInternalToExternalMap.get(o);return this._bindToInternalToExternalMap.delete(o),this._bindToExternalToInternalMap.delete(s),this.fire("remove",o,e),[o,e]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}function lr(t){const e=t.next();return e.done?null:e.value}class dr extends(pi(W())){constructor(){super(),this._elements=new Set,this._nextEventLoopTimeout=null,this.set("isFocused",!1),this.set("focusedElement",null)}add(t){if(this._elements.has(t))throw new b("focustracker-add-element-already-exist",this);this.listenTo(t,"focus",(()=>this._focus(t)),{useCapture:!0}),this.listenTo(t,"blur",(()=>this._blur()),{useCapture:!0}),this._elements.add(t)}remove(t){t===this.focusedElement&&this._blur(),this._elements.has(t)&&(this.stopListening(t),this._elements.delete(t))}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=t,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout((()=>{this.focusedElement=null,this.isFocused=!1}),0)}}class hr{constructor(){this._listener=new(pi())}listenTo(t){this._listener.listenTo(t,"keydown",((t,e)=>{this._listener.fire("_keydown:"+Xi(e),e)}))}set(t,e,n={}){const o=tr(t),i=n.priority;this._listener.listenTo(this._listener,"_keydown:"+o,((t,n)=>{e(n,(()=>{n.preventDefault(),n.stopPropagation(),t.stop()})),t.return=!0}),{priority:i})}press(t){return!!this._listener.fire("_keydown:"+Xi(t),t)}destroy(){this._listener.stopListening()}}function ur(t){return J(t)?new Map(t):function(t){const e=new Map;for(const n in t)e.set(n,t[n]);return e}(t)}const gr=1e4;function mr(t,e){return!!(n=t.charAt(e-1))&&1==n.length&&/[\ud800-\udbff]/.test(n)&&function(t){return!!t&&1==t.length&&/[\udc00-\udfff]/.test(t)}(t.charAt(e));var n}function pr(t,e){return!!(n=t.charAt(e))&&1==n.length&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(n);var n}const fr=function(){const t=/\p{Regional_Indicator}{2}/u.source,e="(?:"+[/\p{Emoji}[\u{E0020}-\u{E007E}]+\u{E007F}/u,/\p{Emoji}\u{FE0F}?\u{20E3}/u,/\p{Emoji}\u{FE0F}/u,/(?=\p{General_Category=Other_Symbol})\p{Emoji}\p{Emoji_Modifier}*/u].map((t=>t.source)).join("|")+")";return new RegExp(`${t}|${e}(?:‍${e})*`,"ug")}();function kr(t,e){const n=String(t).matchAll(fr);return Array.from(n).some((t=>t.index{this.refresh()})),this.on("execute",(t=>{this.isEnabled||t.stop()}),{priority:"high"}),this.listenTo(t,"change:isReadOnly",((t,e,n)=>{n&&this.affectsData?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")}))}get affectsData(){return this._affectsData}set affectsData(t){this._affectsData=t}refresh(){this.isEnabled=!0}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",Ar,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",Ar),this.refresh())}execute(...t){}destroy(){this.stopListening()}}function Ar(t){t.return=!1,t.stop()}class Cr extends _r{constructor(t){super(t),this._childCommandsDefinitions=[]}refresh(){}execute(...t){const e=this._getFirstEnabledCommand();return!!e&&e.execute(t)}registerChildCommand(t,e={}){f(this._childCommandsDefinitions,{command:t,priority:e.priority||"normal"}),t.on("change:isEnabled",(()=>this._checkEnabled())),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){const t=this._childCommandsDefinitions.find((({command:t})=>t.isEnabled));return t&&t.command}}class vr extends(T()){constructor(t,e=[],n=[]){super(),this._context=t,this._plugins=new Map,this._availablePlugins=new Map;for(const t of e)t.pluginName&&this._availablePlugins.set(t.pluginName,t);this._contextPlugins=new Map;for(const[t,e]of n)this._contextPlugins.set(t,e),this._contextPlugins.set(e,t),t.pluginName&&this._availablePlugins.set(t.pluginName,t)}*[Symbol.iterator](){for(const t of this._plugins)"function"==typeof t[0]&&(yield t)}get(t){const e=this._plugins.get(t);if(!e){let e=t;throw"function"==typeof t&&(e=t.pluginName||t.name),new b("plugincollection-plugin-not-loaded",this._context,{plugin:e})}return e}has(t){return this._plugins.has(t)}init(t,e=[],n=[]){const o=this,i=this._context;!function t(e,n=new Set){e.forEach((e=>{a(e)&&(n.has(e)||(n.add(e),e.pluginName&&!o._availablePlugins.has(e.pluginName)&&o._availablePlugins.set(e.pluginName,e),e.requires&&t(e.requires,n)))}))}(t),h(t);const r=[...function t(e,n=new Set){return e.map((t=>a(t)?t:o._availablePlugins.get(t))).reduce(((e,o)=>n.has(o)?e:(n.add(o),o.requires&&(h(o.requires,o),t(o.requires,n).forEach((t=>e.add(t)))),e.add(o))),new Set)}(t.filter((t=>!l(t,e))))];!function(t,e){for(const n of e){if("function"!=typeof n)throw new b("plugincollection-replace-plugin-invalid-type",null,{pluginItem:n});const e=n.pluginName;if(!e)throw new b("plugincollection-replace-plugin-missing-name",null,{pluginItem:n});if(n.requires&&n.requires.length)throw new b("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:e});const i=o._availablePlugins.get(e);if(!i)throw new b("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:e});const r=t.indexOf(i);if(-1===r){if(o._contextPlugins.has(i))return;throw new b("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:e})}if(i.requires&&i.requires.length)throw new b("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:e});t.splice(r,1,n),o._availablePlugins.set(e,n)}}(r,n);const s=function(t){return t.map((t=>{let e=o._contextPlugins.get(t);return e=e||new t(i),o._add(t,e),e}))}(r);return u(s,"init").then((()=>u(s,"afterInit"))).then((()=>s));function a(t){return"function"==typeof t}function c(t){return a(t)&&t.isContextPlugin}function l(t,e){return e.some((e=>e===t||(d(t)===e||d(e)===t)))}function d(t){return a(t)?t.pluginName||t.name:t}function h(t,n=null){t.map((t=>a(t)?t:o._availablePlugins.get(t)||t)).forEach((t=>{!function(t,e){if(a(t))return;if(e)throw new b("plugincollection-soft-required",i,{missingPlugin:t,requiredBy:d(e)});throw new b("plugincollection-plugin-not-found",i,{plugin:t})}(t,n),function(t,e){if(!c(e))return;if(c(t))return;throw new b("plugincollection-context-required",i,{plugin:d(t),requiredBy:d(e)})}(t,n),function(t,n){if(!n)return;if(!l(t,e))return;throw new b("plugincollection-required",i,{plugin:d(t),requiredBy:d(n)})}(t,n)}))}function u(t,e){return t.reduce(((t,n)=>n[e]?o._contextPlugins.has(n)?t:t.then(n[e].bind(n)):t),Promise.resolve())}}destroy(){const t=[];for(const[,e]of this)"function"!=typeof e.destroy||this._contextPlugins.has(e)||t.push(e.destroy());return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const n=t.pluginName;if(n){if(this._plugins.has(n))throw new b("plugincollection-plugin-name-conflict",null,{pluginName:n,plugin1:this._plugins.get(n).constructor,plugin2:t});this._plugins.set(n,e)}}}class yr{constructor(t){this.config=new li(t,this.constructor.defaultConfig);const e=this.constructor.builtinPlugins;this.config.define("plugins",e),this.plugins=new vr(this,e);const n=this.config.get("language")||{};this.locale=new ar({uiLanguage:"string"==typeof n?n:n.ui,contentLanguage:this.config.get("language.content")}),this.t=this.locale.t,this.editors=new cr,this._contextOwner=null}initPlugins(){const t=this.config.get("plugins")||[],e=this.config.get("substitutePlugins")||[];for(const n of t.concat(e)){if("function"!=typeof n)throw new b("context-initplugins-constructor-only",null,{Plugin:n});if(!0!==n.isContextPlugin)throw new b("context-initplugins-invalid-plugin",null,{Plugin:n})}return this.plugins.init(t,[],e)}destroy(){return Promise.all(Array.from(this.editors,(t=>t.destroy()))).then((()=>this.plugins.destroy()))}_addEditor(t,e){if(this._contextOwner)throw new b("context-addeditor-private-context");this.editors.add(t),e&&(this._contextOwner=t)}_removeEditor(t){return this.editors.has(t)&&this.editors.remove(t),this._contextOwner===t?this.destroy():Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names())["plugins","removePlugins","extraPlugins"].includes(e)||(t[e]=this.config.get(e));return t}static create(t){return new Promise((e=>{const n=new this(t);e(n.initPlugins().then((()=>n)))}))}}class xr extends(W()){constructor(t){super(),this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}var Er=n(6062),Dr=n.n(Er),Ir=n(4717),Tr={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Ir.Z,Tr);Ir.Z.locals;const Mr=new WeakMap;function Sr(t){const{view:e,element:n,text:o,isDirectHost:i=!0,keepOnFocus:r=!1}=t,s=e.document;Mr.has(s)||(Mr.set(s,new Map),s.registerPostFixer((t=>Br(s,t))),s.on("change:isComposing",(()=>{e.change((t=>Br(s,t)))}),{priority:"high"})),Mr.get(s).set(n,{text:o,isDirectHost:i,keepOnFocus:r,hostElement:i?n:null}),e.change((t=>Br(s,t)))}function Nr(t,e){return!!e.hasClass("ck-placeholder")&&(t.removeClass("ck-placeholder",e),!0)}function Br(t,e){const n=Mr.get(t),o=[];let i=!1;for(const[t,r]of n)r.isDirectHost&&(o.push(t),Pr(e,t,r)&&(i=!0));for(const[t,r]of n){if(r.isDirectHost)continue;const n=zr(t);n&&(o.includes(n)||(r.hostElement=n,Pr(e,t,r)&&(i=!0)))}return i}function Pr(t,e,n){const{text:o,isDirectHost:i,hostElement:r}=n;let s=!1;r.getAttribute("data-placeholder")!==o&&(t.setAttribute("data-placeholder",o,r),s=!0);return(i||1==e.childCount)&&function(t,e){if(!t.isAttached())return!1;const n=Array.from(t.getChildren()).some((t=>!t.is("uiElement")));if(n)return!1;const o=t.document,i=o.selection.anchor;return!(o.isComposing&&i&&i.parent===t||!e&&o.isFocused&&(!i||i.parent===t))}(r,n.keepOnFocus)?function(t,e){return!e.hasClass("ck-placeholder")&&(t.addClass("ck-placeholder",e),!0)}(t,r)&&(s=!0):Nr(t,r)&&(s=!0),s}function zr(t){if(t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement")&&!e.is("attributeElement"))return e}return null}class Lr{is(){throw new Error("is() method is abstract")}}var Or=4;const Rr=function(t){return ii(t,Or)};class jr extends(T(Lr)){constructor(t){super(),this.document=t,this.parent=null}get index(){let t;if(!this.parent)return null;if(-1==(t=this.parent.getChildIndex(this)))throw new b("view-node-not-found-in-parent",this);return t}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.index),e=e.parent;return t}getAncestors(t={}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e),o=t.getAncestors(e);let i=0;for(;n[i]==o[i]&&n[i];)i++;return 0===i?null:n[i-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),n=t.getPath(),o=Z(e,n);switch(o){case"prefix":return!0;case"extension":return!1;default:return e[o]t.data.length)throw new b("view-textproxy-wrong-offsetintext",this);if(n<0||e+n>t.data.length)throw new b("view-textproxy-wrong-length",this);this.data=t.data.substring(e,e+n),this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}getAncestors(t={}){const e=[];let n=t.includeSelf?this.textNode:this.parent;for(;null!==n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}}Vr.prototype.is=function(t){return"$textProxy"===t||"view:$textProxy"===t||"textProxy"===t||"view:textProxy"===t};class Hr{constructor(...t){this._patterns=[],this.add(...t)}add(...t){for(let e of t)("string"==typeof e||e instanceof RegExp)&&(e={name:e}),this._patterns.push(e)}match(...t){for(const e of t)for(const t of this._patterns){const n=Ur(e,t);if(n)return{element:e,pattern:t,match:n}}return null}matchAll(...t){const e=[];for(const n of t)for(const t of this._patterns){const o=Ur(n,t);o&&e.push({element:n,pattern:t,match:o})}return e.length>0?e:null}getElementName(){if(1!==this._patterns.length)return null;const t=this._patterns[0],e=t.name;return"function"==typeof t||!e||e instanceof RegExp?null:e}}function Ur(t,e){if("function"==typeof e)return e(t);const n={};return e.name&&(n.name=function(t,e){if(t instanceof RegExp)return!!e.match(t);return t===e}(e.name,t.name),!n.name)||e.attributes&&(n.attributes=function(t,e){const n=new Set(e.getAttributeKeys());Dt(t)?(void 0!==t.style&&w("matcher-pattern-deprecated-attributes-style-key",t),void 0!==t.class&&w("matcher-pattern-deprecated-attributes-class-key",t)):(n.delete("style"),n.delete("class"));return Wr(t,n,(t=>e.getAttribute(t)))}(e.attributes,t),!n.attributes)||e.classes&&(n.classes=function(t,e){return Wr(t,e.getClassNames(),(()=>{}))}(e.classes,t),!n.classes)||e.styles&&(n.styles=function(t,e){return Wr(t,e.getStyleNames(!0),(t=>e.getStyle(t)))}(e.styles,t),!n.styles)?null:n}function Wr(t,e,n){const o=function(t){if(Array.isArray(t))return t.map((t=>Dt(t)?(void 0!==t.key&&void 0!==t.value||w("matcher-pattern-missing-key-or-value",t),[t.key,t.value]):[t,!0]));if(Dt(t))return Object.entries(t);return[[t,!0]]}(t),i=Array.from(e),r=[];if(o.forEach((([t,e])=>{i.forEach((o=>{(function(t,e){return!0===t||t===e||t instanceof RegExp&&e.match(t)})(t,o)&&function(t,e,n){if(!0===t)return!0;const o=n(e);return t===o||t instanceof RegExp&&!!String(o).match(t)}(e,o,n)&&r.push(o)}))})),o.length&&!(r.lengthi?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var r=Array(i);++o0){if(++e>=Bs)return arguments[0]}else e=0;return t.apply(void 0,arguments)}};const Os=Ls(Ns);const Rs=function(t,e){return Os(Ms(t,e,Ds),t+"")};const js=function(t,e,n){if(!O(n))return!1;var o=typeof e;return!!("number"==o?wn(n)&&Xe(e,n.length):"string"==o&&e in n)&&Tt(n[e],t)};const Fs=function(t){return Rs((function(e,n){var o=-1,i=n.length,r=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(r=t.length>3&&"function"==typeof r?(i--,r):void 0,s&&js(n[0],n[1],s)&&(r=i<3?void 0:r,i=1),e=Object(e);++oe===t));return Array.isArray(e)}set(t,e){if(O(t))for(const[e,n]of Object.entries(t))this._styleProcessor.toNormalizedForm(e,n,this._styles);else this._styleProcessor.toNormalizedForm(t,e,this._styles)}remove(t){const e=Gs(t);bs(this._styles,e),delete this._styles[t],this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){return this.isEmpty?"":this._getStylesEntries().map((t=>t.join(":"))).sort().join(";")+";"}getAsString(t){if(this.isEmpty)return;if(this._styles[t]&&!O(this._styles[t]))return this._styles[t];const e=this._styleProcessor.getReducedForm(t,this._styles).find((([e])=>e===t));return Array.isArray(e)?e[1]:void 0}getStyleNames(t=!1){if(this.isEmpty)return[];if(t)return this._styleProcessor.getStyleNames(this._styles);return this._getStylesEntries().map((([t])=>t))}clear(){this._styles={}}_getStylesEntries(){const t=[],e=Object.keys(this._styles);for(const n of e)t.push(...this._styleProcessor.getReducedForm(n,this._styles));return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");if(!(e.length>1))return;const n=e.splice(0,e.length-1).join("."),o=ws(this._styles,n);if(!o)return;!Array.from(Object.keys(o)).length&&this.remove(n)}}class qs{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(t,e,n){if(O(e))$s(n,Gs(t),e);else if(this._normalizers.has(t)){const o=this._normalizers.get(t),{path:i,value:r}=o(e);$s(n,i,r)}else $s(n,t,e)}getNormalized(t,e){if(!t)return Vs({},e);if(void 0!==e[t])return e[t];if(this._extractors.has(t)){const n=this._extractors.get(t);if("string"==typeof n)return ws(e,n);const o=n(t,e);if(o)return o}return ws(e,Gs(t))}getReducedForm(t,e){const n=this.getNormalized(t,e);if(void 0===n)return[];if(this._reducers.has(t)){return this._reducers.get(t)(n)}return[[t,n]]}getStyleNames(t){const e=Array.from(this._consumables.keys()).filter((e=>{const n=this.getNormalized(e,t);return n&&"object"==typeof n?Object.keys(n).length:n})),n=new Set([...e,...Object.keys(t)]);return Array.from(n.values())}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const n of e)this._mapStyleNames(n,[t])}_mapStyleNames(t,e){this._consumables.has(t)||this._consumables.set(t,[]),this._consumables.get(t).push(...e)}}function Gs(t){return t.replace("-",".")}function $s(t,e,n){let o=n;O(n)&&(o=Vs({},ws(t,e),n)),Us(t,e,o)}class Ys extends jr{constructor(t,e,n,o){if(super(t),this.name=e,this._attrs=function(t){const e=ur(t);for(const[t,n]of e)null===n?e.delete(t):"string"!=typeof n&&e.set(t,String(n));return e}(n),this._children=[],o&&this._insertChild(0,o),this._classes=new Set,this._attrs.has("class")){const t=this._attrs.get("class");Ks(this._classes,t),this._attrs.delete("class")}this._styles=new Ws(this.document.stylesProcessor),this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style")),this._customProperties=new Map,this._unsafeAttributesToRender=[]}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){this._classes.size>0&&(yield"class"),this._styles.isEmpty||(yield"style"),yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries(),this._classes.size>0&&(yield["class",this.getAttribute("class")]),this._styles.isEmpty||(yield["style",this.getAttribute("style")])}getAttribute(t){if("class"==t)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==t){const t=this._styles.toString();return""==t?void 0:t}return this._attrs.get(t)}hasAttribute(t){return"class"==t?this._classes.size>0:"style"==t?!this._styles.isEmpty:this._attrs.has(t)}isSimilar(t){if(!(t instanceof Ys))return!1;if(this===t)return!0;if(this.name!=t.name)return!1;if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size)return!1;for(const[e,n]of this._attrs)if(!t._attrs.has(e)||t._attrs.get(e)!==n)return!1;for(const e of this._classes)if(!t._classes.has(e))return!1;for(const e of this._styles.getStyleNames())if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e))return!1;return!0}hasClass(...t){for(const e of t)if(!this._classes.has(e))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(t){return this._styles.getStyleNames(t)}hasStyle(...t){for(const e of t)if(!this._styles.has(e))return!1;return!0}findAncestor(...t){const e=new Hr(...t);let n=this.parent;for(;n&&!n.is("documentFragment");){if(e.match(n))return n;n=n.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(","),e=this._styles.toString(),n=Array.from(this._attrs).map((t=>`${t[0]}="${t[1]}"`)).sort().join(" ");return this.name+(""==t?"":` class="${t}"`)+(e?` style="${e}"`:"")+(""==n?"":` ${n}`)}shouldRenderUnsafeAttribute(t){return this._unsafeAttributesToRender.includes(t)}_clone(t=!1){const e=[];if(t)for(const n of this.getChildren())e.push(n._clone(t));const n=new this.constructor(this.document,this.name,this._attrs,e);return n._classes=new Set(this._classes),n._styles.set(this._styles.getNormalized()),n._customProperties=new Map(this._customProperties),n.getFillerOffset=this.getFillerOffset,n._unsafeAttributesToRender=this._unsafeAttributesToRender,n}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=function(t,e){if("string"==typeof e)return[new Fr(t,e)];J(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Fr(t,e):e instanceof Vr?new Fr(t,e.data):e))}(this.document,e);for(const e of o)null!==e.parent&&e._remove(),e.parent=this,e.document=this.document,this._children.splice(t,0,e),t++,n++;return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n0&&(this._classes.clear(),!0):"style"==t?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this);for(const e of or(t))this._classes.add(e)}_removeClass(t){this._fireChange("attributes",this);for(const e of or(t))this._classes.delete(e)}_setStyle(t,e){this._fireChange("attributes",this),Dt(t)?this._styles.set(t):this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this);for(const e of or(t))this._styles.remove(e)}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function Ks(t,e){const n=e.split(/\s+/);t.clear(),n.forEach((e=>t.add(e)))}Ys.prototype.is=function(t,e){return e?e===this.name&&("element"===t||"view:element"===t):"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Qs extends Ys{constructor(...t){super(...t),this.getFillerOffset=Zs}}function Zs(){const t=[...this.getChildren()],e=t[this.childCount-1];if(e&&e.is("element","br"))return this.childCount;for(const e of t)if(!e.is("uiElement"))return null;return this.childCount}Qs.prototype.is=function(t,e){return e?e===this.name&&("containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Js extends(W(Qs)){constructor(...t){super(...t);const e=t[0];this.set("isReadOnly",!1),this.set("isFocused",!1),this.bind("isReadOnly").to(e),this.bind("isFocused").to(e,"isFocused",(t=>t&&e.selection.editableElement==this)),this.listenTo(e.selection,"change",(()=>{this.isFocused=e.isFocused&&e.selection.editableElement==this}))}destroy(){this.stopListening()}}Js.prototype.is=function(t,e){return e?e===this.name&&("editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};const Xs=Symbol("rootName");class ta extends Js{constructor(t,e){super(t,e),this.rootName="main"}get rootName(){return this.getCustomProperty(Xs)}set rootName(t){this._setCustomProperty(Xs,t)}set _name(t){this.name=t}}ta.prototype.is=function(t,e){return e?e===this.name&&("rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class ea{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new b("view-tree-walker-no-start-position",null);if(t.direction&&"forward"!=t.direction&&"backward"!=t.direction)throw new b("view-tree-walker-unknown-direction",t.startPosition,{direction:t.direction});this.boundaries=t.boundaries||null,t.startPosition?this.position=na._createAt(t.startPosition):this.position=na._createAt(t.boundaries["backward"==t.direction?"end":"start"]),this.direction=t.direction||"forward",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(t){let e,n,o;do{o=this.position,({done:e,value:n}=this.next())}while(!e&&t(n));e||(this.position=o)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let t=this.position.clone();const e=this.position,n=t.parent;if(null===n.parent&&t.offset===n.childCount)return{done:!0,value:void 0};if(n===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0,value:void 0};let o;if(n instanceof Fr){if(t.isAtEnd)return this.position=na._createAfter(n),this._next();o=n.data[t.offset]}else o=n.getChild(t.offset);if(o instanceof Ys)return this.shallow?t.offset++:t=new na(o,0),this.position=t,this._formatReturnValue("elementStart",o,e,t,1);if(o instanceof Fr){if(this.singleCharacters)return t=new na(o,0),this.position=t,this._next();{let n,i=o.data.length;return o==this._boundaryEndParent?(i=this.boundaries.end.offset,n=new Vr(o,0,i),t=na._createAfter(n)):(n=new Vr(o,0,o.data.length),t.offset++),this.position=t,this._formatReturnValue("text",n,e,t,i)}}if("string"==typeof o){let o;if(this.singleCharacters)o=1;else{o=(n===this._boundaryEndParent?this.boundaries.end.offset:n.data.length)-t.offset}const i=new Vr(n,t.offset,o);return t.offset+=o,this.position=t,this._formatReturnValue("text",i,e,t,o)}return t=na._createAfter(n),this.position=t,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",n,e,t)}_previous(){let t=this.position.clone();const e=this.position,n=t.parent;if(null===n.parent&&0===t.offset)return{done:!0,value:void 0};if(n==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0,value:void 0};let o;if(n instanceof Fr){if(t.isAtStart)return this.position=na._createBefore(n),this._previous();o=n.data[t.offset-1]}else o=n.getChild(t.offset-1);if(o instanceof Ys)return this.shallow?(t.offset--,this.position=t,this._formatReturnValue("elementStart",o,e,t,1)):(t=new na(o,o.childCount),this.position=t,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",o,e,t));if(o instanceof Fr){if(this.singleCharacters)return t=new na(o,o.data.length),this.position=t,this._previous();{let n,i=o.data.length;if(o==this._boundaryStartParent){const e=this.boundaries.start.offset;n=new Vr(o,e,o.data.length-e),i=n.data.length,t=na._createBefore(n)}else n=new Vr(o,0,o.data.length),t.offset--;return this.position=t,this._formatReturnValue("text",n,e,t,i)}}if("string"==typeof o){let o;if(this.singleCharacters)o=1;else{const e=n===this._boundaryStartParent?this.boundaries.start.offset:0;o=t.offset-e}t.offset-=o;const i=new Vr(n,t.offset,o);return this.position=t,this._formatReturnValue("text",i,e,t,o)}return t=na._createBefore(n),this.position=t,this._formatReturnValue("elementStart",n,e,t,1)}_formatReturnValue(t,e,n,o,i){return e instanceof Vr&&(e.offsetInText+e.data.length==e.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?n=na._createAfter(e.textNode):(o=na._createAfter(e.textNode),this.position=o)),0===e.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?n=na._createBefore(e.textNode):(o=na._createBefore(e.textNode),this.position=o))),{done:!1,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}}class na extends Lr{constructor(t,e){super(),this.parent=t,this.offset=e}get nodeAfter(){return this.parent.is("$text")?null:this.parent.getChild(this.offset)||null}get nodeBefore(){return this.parent.is("$text")?null:this.parent.getChild(this.offset-1)||null}get isAtStart(){return 0===this.offset}get isAtEnd(){const t=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;for(;!(t instanceof Js);){if(!t.parent)return null;t=t.parent}return t}getShiftedBy(t){const e=na._createAt(this),n=e.offset+t;return e.offset=n<0?0:n,e}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new ea(e);return n.skip(t),n.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(t){const e=this.getAncestors(),n=t.getAncestors();let o=0;for(;e[o]==n[o]&&e[o];)o++;return 0===o?null:e[o-1]}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return"before"==this.compareWith(t)}isAfter(t){return"after"==this.compareWith(t)}compareWith(t){if(this.root!==t.root)return"different";if(this.isEqual(t))return"same";const e=this.parent.is("node")?this.parent.getPath():[],n=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset),n.push(t.offset);const o=Z(e,n);switch(o){case"prefix":return"before";case"extension":return"after";default:return e[o]0?new this(n,o):new this(o,n)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("$textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(na._createBefore(t),e)}}function ia(t){return!(!t.item.is("attributeElement")&&!t.item.is("uiElement"))}oa.prototype.is=function(t){return"range"===t||"view:range"===t};class ra extends(T(Lr)){constructor(...t){super(),this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",t.length&&this.setTo(...t)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.end:t.start).clone()}get focus(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.start:t.end).clone()}get isCollapsed(){return 1===this.rangeCount&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){return this.anchor?this.anchor.editableElement:null}*getRanges(){for(const t of this._ranges)yield t.clone()}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel)return!1;if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let n=!1;for(const o of t._ranges)if(e.isEqual(o)){n=!0;break}if(!n)return!1}return!0}isSimilar(t){if(this.isBackward!=t.isBackward)return!1;const e=Q(this.getRanges());if(e!=Q(t.getRanges()))return!1;if(0==e)return!0;for(let e of this.getRanges()){e=e.getTrimmed();let n=!1;for(let o of t.getRanges())if(o=o.getTrimmed(),e.start.isEqual(o.start)&&e.end.isEqual(o.end)){n=!0;break}if(!n)return!1}return!0}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}setTo(...t){let[e,n,o]=t;if("object"==typeof n&&(o=n,n=void 0),null===e)this._setRanges([]),this._setFakeOptions(o);else if(e instanceof ra||e instanceof sa)this._setRanges(e.getRanges(),e.isBackward),this._setFakeOptions({fake:e.isFake,label:e.fakeSelectionLabel});else if(e instanceof oa)this._setRanges([e],o&&o.backward),this._setFakeOptions(o);else if(e instanceof na)this._setRanges([new oa(e)]),this._setFakeOptions(o);else if(e instanceof jr){const t=!!o&&!!o.backward;let i;if(void 0===n)throw new b("view-selection-setto-required-second-parameter",this);i="in"==n?oa._createIn(e):"on"==n?oa._createOn(e):new oa(na._createAt(e,n)),this._setRanges([i],t),this._setFakeOptions(o)}else{if(!J(e))throw new b("view-selection-setto-not-selectable",this);this._setRanges(e,o&&o.backward),this._setFakeOptions(o)}this.fire("change")}setFocus(t,e){if(null===this.anchor)throw new b("view-selection-setfocus-no-ranges",this);const n=na._createAt(t,e);if("same"==n.compareWith(this.focus))return;const o=this.anchor;this._ranges.pop(),"before"==n.compareWith(o)?this._addRange(new oa(n,o),!0):this._addRange(new oa(o,n)),this.fire("change")}_setRanges(t,e=!1){t=Array.from(t),this._ranges=[];for(const e of t)this._addRange(e);this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake,this._fakeSelectionLabel=t.fake&&t.label||""}_addRange(t,e=!1){if(!(t instanceof oa))throw new b("view-selection-add-range-not-range",this);this._pushRange(t),this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges)if(t.isIntersecting(e))throw new b("view-selection-range-intersects",this,{addedRange:t,intersectingRange:e});this._ranges.push(new oa(t.start,t.end))}}ra.prototype.is=function(t){return"selection"===t||"view:selection"===t};class sa extends(T(Lr)){constructor(...t){super(),this._selection=new ra,this._selection.delegate("change").to(this),t.length&&this._selection.setTo(...t)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}_setTo(...t){this._selection.setTo(...t)}_setFocus(t,e){this._selection.setFocus(t,e)}}sa.prototype.is=function(t){return"selection"===t||"documentSelection"==t||"view:selection"==t||"view:documentSelection"==t};class aa extends u{constructor(t,e,n){super(t,e),this.startRange=n,this._eventPhase="none",this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}const ca=Symbol("bubbling contexts");function la(t){return class extends t{fire(t,...e){try{const n=t instanceof u?t:new u(this,t),o=ga(this);if(!o.size)return;if(da(n,"capturing",this),ha(o,"$capture",n,...e))return n.return;const i=n.startRange||this.selection.getFirstRange(),r=i?i.getContainedElement():null,s=!!r&&Boolean(ua(o,r));let a=r||function(t){if(!t)return null;const e=t.start.parent,n=t.end.parent,o=e.getPath(),i=n.getPath();return o.length>i.length?e:n}(i);if(da(n,"atTarget",a),!s){if(ha(o,"$text",n,...e))return n.return;da(n,"bubbling",a)}for(;a;){if(a.is("rootElement")){if(ha(o,"$root",n,...e))return n.return}else if(a.is("element")&&ha(o,a.name,n,...e))return n.return;if(ha(o,a,n,...e))return n.return;a=a.parent,da(n,"bubbling",a)}return da(n,"bubbling",this),ha(o,"$document",n,...e),n.return}catch(t){b.rethrowUnexpectedError(t,this)}}_addEventListener(t,e,n){const o=or(n.context||"$document"),i=ga(this);for(const r of o){let o=i.get(r);o||(o=new(T()),i.set(r,o)),this.listenTo(o,t,e,n)}}_removeEventListener(t,e){const n=ga(this);for(const o of n.values())this.stopListening(o,t,e)}}}{const t=la(Object);["fire","_addEventListener","_removeEventListener"].forEach((e=>{la[e]=t.prototype[e]}))}function da(t,e,n){t instanceof aa&&(t._eventPhase=e,t._currentTarget=n)}function ha(t,e,n,...o){const i="string"==typeof e?t.get(e):ua(t,e);return!!i&&(i.fire(n,...o),n.stop.called)}function ua(t,e){for(const[n,o]of t)if("function"==typeof n&&n(e))return o;return null}function ga(t){return t[ca]||(t[ca]=new Map),t[ca]}class ma extends(la(W())){constructor(t){super(),this.selection=new sa,this.roots=new cr({idProperty:"rootName"}),this.stylesProcessor=t,this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isSelecting",!1),this.set("isComposing",!1),this._postFixers=new Set}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.map((t=>t.destroy())),this.stopListening()}_callPostFixers(t){let e=!1;do{for(const n of this._postFixers)if(e=n(t),e)break}while(e)}}class pa extends Ys{constructor(...t){super(...t),this.getFillerOffset=fa,this._priority=10,this._id=null,this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(null===this.id)throw new b("attribute-element-get-elements-with-same-id-no-id",this);return new Set(this._clonesGroup)}isSimilar(t){return null!==this.id||null!==t.id?this.id===t.id:super.isSimilar(t)&&this.priority==t.priority}_clone(t=!1){const e=super._clone(t);return e._priority=this._priority,e._id=this._id,e}}function fa(){if(ka(this))return null;let t=this.parent;for(;t&&t.is("attributeElement");){if(ka(t)>1)return null;t=t.parent}return!t||ka(t)>1?null:this.childCount}function ka(t){return Array.from(t.getChildren()).filter((t=>!t.is("uiElement"))).length}pa.DEFAULT_PRIORITY=10,pa.prototype.is=function(t,e){return e?e===this.name&&("attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t):"attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class ba extends Ys{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=wa}_insertChild(t,e){if(e&&(e instanceof jr||Array.from(e).length>0))throw new b("view-emptyelement-cannot-add",[this,e]);return 0}}function wa(){return null}ba.prototype.is=function(t,e){return e?e===this.name&&("emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t):"emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class _a extends Ys{constructor(...t){super(...t),this.getFillerOffset=Ca}_insertChild(t,e){if(e&&(e instanceof jr||Array.from(e).length>0))throw new b("view-uielement-cannot-add",[this,e]);return 0}render(t,e){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys())e.setAttribute(t,this.getAttribute(t));return e}}function Aa(t){t.document.on("arrowKey",((e,n)=>function(t,e,n){if(e.keyCode==Zi.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection(),o=1==t.rangeCount&&t.getRangeAt(0).collapsed;if(o||e.shiftKey){const e=t.focusNode,i=t.focusOffset,r=n.domPositionToView(e,i);if(null===r)return;let s=!1;const a=r.getLastMatchingPosition((t=>(t.item.is("uiElement")&&(s=!0),!(!t.item.is("uiElement")&&!t.item.is("attributeElement")))));if(s){const e=n.viewPositionToDom(a);o?t.collapse(e.parent,e.offset):t.extend(e.parent,e.offset)}}}}(0,n,t.domConverter)),{priority:"low"})}function Ca(){return null}_a.prototype.is=function(t,e){return e?e===this.name&&("uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t):"uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class va extends Ys{constructor(...t){super(...t),this.getFillerOffset=ya}_insertChild(t,e){if(e&&(e instanceof jr||Array.from(e).length>0))throw new b("view-rawelement-cannot-add",[this,e]);return 0}render(){}}function ya(){return null}va.prototype.is=function(t,e){return e?e===this.name&&("rawElement"===t||"view:rawElement"===t||"element"===t||"view:element"===t):"rawElement"===t||"view:rawElement"===t||t===this.name||t==="view:"+this.name||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class xa extends(T(Lr)){constructor(t,e){super(),this.document=t,this._children=[],e&&this._insertChild(0,e),this._customProperties=new Map}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=function(t,e){if("string"==typeof e)return[new Fr(t,e)];J(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Fr(t,e):e instanceof Vr?new Fr(t,e.data):e))}(this.document,e);for(const e of o)null!==e.parent&&e._remove(),e.parent=this,this._children.splice(t,0,e),t++,n++;return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n{const n=t[t.length-1],o=!e.is("uiElement");return n&&n.breakAttributes==o?n.nodes.push(e):t.push({breakAttributes:o,nodes:[e]}),t}),[]);let o=null,i=t;for(const{nodes:t,breakAttributes:e}of n){const n=this._insertNodes(i,t,e);o||(o=n.start),i=n.end}return o?new oa(o,i):new oa(t)}remove(t){const e=t instanceof oa?t:oa._createOn(t);if(za(e,this.document),e.isCollapsed)return new xa(this.document);const{start:n,end:o}=this._breakAttributesRange(e,!0),i=n.parent,r=o.offset-n.offset,s=i._removeChildren(n.offset,r);for(const t of s)this._removeFromClonedElementsGroup(t);const a=this.mergeAttributes(n);return e.start=a,e.end=a.clone(),new xa(this.document,s)}clear(t,e){za(t,this.document);const n=t.getWalker({direction:"backward",ignoreElementEnd:!0});for(const o of n){const n=o.item;let i;if(n.is("element")&&e.isSimilar(n))i=oa._createOn(n);else if(!o.nextPosition.isAfter(t.start)&&n.is("$textProxy")){const t=n.getAncestors().find((t=>t.is("element")&&e.isSimilar(t)));t&&(i=oa._createIn(t))}i&&(i.end.isAfter(t.end)&&(i.end=t.end),i.start.isBefore(t.start)&&(i.start=t.start),this.remove(i))}}move(t,e){let n;if(e.isAfter(t.end)){const o=(e=this._breakAttributes(e,!0)).parent,i=o.childCount;t=this._breakAttributesRange(t,!0),n=this.remove(t),e.offset+=o.childCount-i}else n=this.remove(t);return this.insert(e,n)}wrap(t,e){if(!(e instanceof pa))throw new b("view-writer-wrap-invalid-attribute",this.document);if(za(t,this.document),t.isCollapsed){let o=t.start;o.parent.is("element")&&(n=o.parent,!Array.from(n.getChildren()).some((t=>!t.is("uiElement"))))&&(o=o.getLastMatchingPosition((t=>t.item.is("uiElement")))),o=this._wrapPosition(o,e);const i=this.document.selection;return i.isCollapsed&&i.getFirstPosition().isEqual(t.start)&&this.setSelection(o),new oa(o)}return this._wrapRange(t,e);var n}unwrap(t,e){if(!(e instanceof pa))throw new b("view-writer-unwrap-invalid-attribute",this.document);if(za(t,this.document),t.isCollapsed)return t;const{start:n,end:o}=this._breakAttributesRange(t,!0),i=n.parent,r=this._unwrapChildren(i,n.offset,o.offset,e),s=this.mergeAttributes(r.start);s.isEqual(r.start)||r.end.offset--;const a=this.mergeAttributes(r.end);return new oa(s,a)}rename(t,e){const n=new Qs(this.document,t,e.getAttributes());return this.insert(na._createAfter(e),n),this.move(oa._createIn(e),na._createAt(n,0)),this.remove(oa._createOn(e)),n}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return na._createAt(t,e)}createPositionAfter(t){return na._createAfter(t)}createPositionBefore(t){return na._createBefore(t)}createRange(...t){return new oa(...t)}createRangeOn(t){return oa._createOn(t)}createRangeIn(t){return oa._createIn(t)}createSelection(...t){return new ra(...t)}createSlot(t){if(!this._slotFactory)throw new b("view-writer-invalid-create-slot-context",this.document);return this._slotFactory(this,t)}_registerSlotFactory(t){this._slotFactory=t}_clearSlotFactory(){this._slotFactory=null}_insertNodes(t,e,n){let o,i;if(o=n?Da(t):t.parent.is("$text")?t.parent.parent:t.parent,!o)throw new b("view-writer-invalid-position-container",this.document);i=n?this._breakAttributes(t,!0):t.parent.is("$text")?Ma(t):t;const r=o._insertChild(i.offset,e);for(const t of e)this._addToClonedElementsGroup(t);const s=i.getShiftedBy(r),a=this.mergeAttributes(i);a.isEqual(i)||s.offset--;const c=this.mergeAttributes(s);return new oa(a,c)}_wrapChildren(t,e,n,o){let i=e;const r=[];for(;i!1,t.parent._insertChild(t.offset,n);const o=new oa(t,t.getShiftedBy(1));this.wrap(o,e);const i=new na(n.parent,n.index);n._remove();const r=i.nodeBefore,s=i.nodeAfter;return r instanceof Fr&&s instanceof Fr?Sa(r,s):Ta(i)}_wrapAttributeElement(t,e){if(!La(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const n of t.getAttributeKeys())if("class"!==n&&"style"!==n&&e.hasAttribute(n)&&e.getAttribute(n)!==t.getAttribute(n))return!1;for(const n of t.getStyleNames())if(e.hasStyle(n)&&e.getStyle(n)!==t.getStyle(n))return!1;for(const n of t.getAttributeKeys())"class"!==n&&"style"!==n&&(e.hasAttribute(n)||this.setAttribute(n,t.getAttribute(n),e));for(const n of t.getStyleNames())e.hasStyle(n)||this.setStyle(n,t.getStyle(n),e);for(const n of t.getClassNames())e.hasClass(n)||this.addClass(n,e);return!0}_unwrapAttributeElement(t,e){if(!La(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const n of t.getAttributeKeys())if("class"!==n&&"style"!==n&&(!e.hasAttribute(n)||e.getAttribute(n)!==t.getAttribute(n)))return!1;if(!e.hasClass(...t.getClassNames()))return!1;for(const n of t.getStyleNames())if(!e.hasStyle(n)||e.getStyle(n)!==t.getStyle(n))return!1;for(const n of t.getAttributeKeys())"class"!==n&&"style"!==n&&this.removeAttribute(n,e);return this.removeClass(Array.from(t.getClassNames()),e),this.removeStyle(Array.from(t.getStyleNames()),e),!0}_breakAttributesRange(t,e=!1){const n=t.start,o=t.end;if(za(t,this.document),t.isCollapsed){const n=this._breakAttributes(t.start,e);return new oa(n,n)}const i=this._breakAttributes(o,e),r=i.parent.childCount,s=this._breakAttributes(n,e);return i.offset+=i.parent.childCount-r,new oa(s,i)}_breakAttributes(t,e=!1){const n=t.offset,o=t.parent;if(t.parent.is("emptyElement"))throw new b("view-writer-cannot-break-empty-element",this.document);if(t.parent.is("uiElement"))throw new b("view-writer-cannot-break-ui-element",this.document);if(t.parent.is("rawElement"))throw new b("view-writer-cannot-break-raw-element",this.document);if(!e&&o.is("$text")&&Pa(o.parent))return t.clone();if(Pa(o))return t.clone();if(o.is("$text"))return this._breakAttributes(Ma(t),e);if(n==o.childCount){const t=new na(o.parent,o.index+1);return this._breakAttributes(t,e)}if(0===n){const t=new na(o.parent,o.index);return this._breakAttributes(t,e)}{const t=o.index+1,i=o._clone();o.parent._insertChild(t,i),this._addToClonedElementsGroup(i);const r=o.childCount-n,s=o._removeChildren(n,r);i._appendChild(s);const a=new na(o.parent,t);return this._breakAttributes(a,e)}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement"))return;if(t.is("element"))for(const e of t.getChildren())this._addToClonedElementsGroup(e);const e=t.id;if(!e)return;let n=this._cloneGroups.get(e);n||(n=new Set,this._cloneGroups.set(e,n)),n.add(t),t._clonesGroup=n}_removeFromClonedElementsGroup(t){if(t.is("element"))for(const e of t.getChildren())this._removeFromClonedElementsGroup(e);const e=t.id;if(!e)return;const n=this._cloneGroups.get(e);n&&n.delete(t)}}function Da(t){let e=t.parent;for(;!Pa(e);){if(!e)return;e=e.parent}return e}function Ia(t,e){return t.prioritye.priority)&&t.getIdentity()n instanceof t)))throw new b("view-writer-insert-invalid-node-type",e);n.is("$text")||Ba(n.getChildren(),e)}}function Pa(t){return t&&(t.is("containerElement")||t.is("documentFragment"))}function za(t,e){const n=Da(t.start),o=Da(t.end);if(!n||!o||n!==o)throw new b("view-writer-invalid-range-container",e)}function La(t,e){return null===t.id&&null===e.id}const Oa=t=>t.createTextNode(" "),Ra=t=>{const e=t.createElement("span");return e.dataset.ckeFiller="true",e.innerText=" ",e},ja=t=>{const e=t.createElement("br");return e.dataset.ckeFiller="true",e},Fa=7,Va="⁠".repeat(Fa);function Ha(t){return Ai(t)&&t.data.substr(0,Fa)===Va}function Ua(t){return t.data.length==Fa&&Ha(t)}function Wa(t){return Ha(t)?t.data.slice(Fa):t.data}function qa(t,e){if(e.keyCode==Zi.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(1==t.rangeCount&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer,n=t.getRangeAt(0).startOffset;Ha(e)&&n<=Fa&&t.collapse(e,0)}}}var Ga=n(9315),$a={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Ga.Z,$a);Ga.Z.locals;class Ya extends(W()){constructor(t,e){super(),this.domDocuments=new Set,this.domConverter=t,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this.selection=e,this.set("isFocused",!1),this.set("isSelecting",!1),i.isBlink&&!i.isAndroid&&this.on("change:isSelecting",(()=>{this.isSelecting||this.render()})),this.set("isComposing",!1),this.on("change:isComposing",(()=>{this.isComposing||this.render()})),this._inlineFiller=null,this._fakeSelectionContainer=null}markToSync(t,e){if("text"===t)this.domConverter.mapViewToDom(e.parent)&&this.markedTexts.add(e);else{if(!this.domConverter.mapViewToDom(e))return;if("attributes"===t)this.markedAttributes.add(e);else{if("children"!==t)throw new b("view-renderer-unknown-type",this);this.markedChildren.add(e)}}}render(){if(this.isComposing&&!i.isAndroid)return;let t=null;const e=!(i.isBlink&&!i.isAndroid)||!this.isSelecting;for(const t of this.markedChildren)this._updateChildrenMappings(t);e?(this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?t=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(t=this.selection.getFirstPosition(),this.markedChildren.add(t.parent))):this._inlineFiller&&this._inlineFiller.parentNode&&(t=this.domConverter.domPositionToView(this._inlineFiller),t&&t.parent.is("$text")&&(t=na._createBefore(t.parent)));for(const t of this.markedAttributes)this._updateAttrs(t);for(const e of this.markedChildren)this._updateChildren(e,{inlineFillerPosition:t});for(const e of this.markedTexts)!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)&&this._updateText(e,{inlineFillerPosition:t});if(e)if(t){const e=this.domConverter.viewPositionToDom(t),n=e.parent.ownerDocument;Ha(e.parent)?this._inlineFiller=e.parent:this._inlineFiller=Ka(n,e.parent,e.offset)}else this._inlineFiller=null;this._updateFocus(),this._updateSelection(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(t){if(!this.domConverter.mapViewToDom(t))return;const e=Array.from(this.domConverter.mapViewToDom(t).childNodes),n=Array.from(this.domConverter.viewChildrenToDom(t,{withChildren:!1})),o=this._diffNodeLists(e,n),i=this._findReplaceActions(o,e,n);if(-1!==i.indexOf("replace")){const o={equal:0,insert:0,delete:0};for(const r of i)if("replace"===r){const i=o.equal+o.insert,r=o.equal+o.delete,s=t.getChild(i);!s||s.is("uiElement")||s.is("rawElement")||this._updateElementMappings(s,e[r]),ji(n[i]),o.equal++}else o[r]++}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e),this.domConverter.bindElements(e,t),this.markedChildren.add(t),this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();return t.parent.is("$text")?na._createBefore(t.parent):t}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=this.domConverter.viewPositionToDom(t);return!!(e&&Ai(e.parent)&&Ha(e.parent))}_removeInlineFiller(){const t=this._inlineFiller;if(!Ha(t))throw new b("view-renderer-filler-was-lost",this);Ua(t)?t.remove():t.data=t.data.substr(Fa),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=t.parent,n=t.offset;if(!this.domConverter.mapViewToDom(e.root))return!1;if(!e.is("element"))return!1;if(!function(t){if("false"==t.getAttribute("contenteditable"))return!1;const e=t.findAncestor((t=>t.hasAttribute("contenteditable")));return!e||"true"==e.getAttribute("contenteditable")}(e))return!1;if(n===e.getFillerOffset())return!1;const o=t.nodeBefore,r=t.nodeAfter;return!(o instanceof Fr||r instanceof Fr)&&(!i.isAndroid||!o&&!r)}_updateText(t,e){const n=this.domConverter.findCorrespondingDomText(t);let o=this.domConverter.viewToDom(t).data;const i=e.inlineFillerPosition;i&&i.parent==t.parent&&i.offset==t.index&&(o=Va+o),Xa(n,o)}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const n=Array.from(e.attributes).map((t=>t.name)),o=t.getAttributeKeys();for(const n of o)this.domConverter.setDomElementAttribute(e,n,t.getAttribute(n),t);for(const o of n)t.hasAttribute(o)||this.domConverter.removeDomElementAttribute(e,o)}_updateChildren(t,e){const n=this.domConverter.mapViewToDom(t);if(!n)return;if(i.isAndroid){let t=null;for(const e of Array.from(n.childNodes)){if(t&&Ai(t)&&Ai(e)){n.normalize();break}t=e}}const o=e.inlineFillerPosition,r=n.childNodes,s=Array.from(this.domConverter.viewChildrenToDom(t,{bind:!0}));o&&o.parent===t&&Ka(n.ownerDocument,s,o.offset);const a=this._diffNodeLists(r,s),c=i.isAndroid?this._findReplaceActions(a,r,s,{replaceText:!0}):a;let l=0;const d=new Set;for(const t of c)"delete"===t?(d.add(r[l]),ji(r[l])):"equal"!==t&&"replace"!==t||l++;l=0;for(const t of c)"insert"===t?(Bi(n,l,s[l]),l++):"replace"===t?(Xa(r[l],s[l].data),l++):"equal"===t&&(this._markDescendantTextToSync(this.domConverter.domToView(s[l])),l++);for(const t of d)t.parentNode||this.domConverter.unbindDomElement(t)}_diffNodeLists(t,e){return t=function(t,e){const n=Array.from(t);if(0==n.length||!e)return n;const o=n[n.length-1];o==e&&n.pop();return n}(t,this._fakeSelectionContainer),l(t,e,Ja.bind(null,this.domConverter))}_findReplaceActions(t,e,n,o={}){if(-1===t.indexOf("insert")||-1===t.indexOf("delete"))return t;let i=[],r=[],s=[];const a={equal:0,insert:0,delete:0};for(const c of t)"insert"===c?s.push(n[a.equal+a.insert]):"delete"===c?r.push(e[a.equal+a.delete]):(i=i.concat(l(r,s,o.replaceText?Za:Qa).map((t=>"equal"===t?"replace":t))),i.push("equal"),r=[],s=[]),a[c]++;return i.concat(l(r,s,o.replaceText?Za:Qa).map((t=>"equal"===t?"replace":t)))}_markDescendantTextToSync(t){if(t)if(t.is("$text"))this.markedTexts.add(t);else if(t.is("element"))for(const e of t.getChildren())this._markDescendantTextToSync(e)}_updateSelection(){if(i.isBlink&&!i.isAndroid&&this.isSelecting&&!this.markedChildren.size)return;if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const t=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&t&&(this.selection.isFake?this._updateFakeSelection(t):this._fakeSelectionContainer&&this._fakeSelectionContainer.isConnected?(this._removeFakeSelection(),this._updateDomSelection(t)):this.isComposing&&i.isAndroid||this._updateDomSelection(t))}_updateFakeSelection(t){const e=t.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(t){const e=t.createElement("div");return e.className="ck-fake-selection-container",Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),e.textContent=" ",e}(e));const n=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(n,this.selection),!this._fakeSelectionNeedsUpdate(t))return;n.parentElement&&n.parentElement==t||t.appendChild(n),n.textContent=this.selection.fakeSelectionLabel||" ";const o=e.getSelection(),i=e.createRange();o.removeAllRanges(),i.selectNodeContents(n),o.addRange(i)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e))return;const n=this.domConverter.viewPositionToDom(this.selection.anchor),o=this.domConverter.viewPositionToDom(this.selection.focus);e.collapse(n.parent,n.offset),e.extend(o.parent,o.offset),i.isGecko&&function(t,e){const n=t.parent;if(n.nodeType!=Node.ELEMENT_NODE||t.offset!=n.childNodes.length-1)return;const o=n.childNodes[t.offset];o&&"BR"==o.tagName&&e.addRange(e.getRangeAt(0))}(o,e)}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t))return!0;const e=t&&this.domConverter.domSelectionToView(t);return(!e||!this.selection.isEqual(e))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(e))}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer,n=t.ownerDocument.getSelection();return!e||e.parentElement!==t||(n.anchorNode!==e&&!e.contains(n.anchorNode)||e.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const t of this.domDocuments){const e=t.getSelection();if(e.rangeCount){const n=t.activeElement,o=this.domConverter.mapDomToView(n);n&&o&&e.removeAllRanges()}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;t&&t.remove()}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;t&&this.domConverter.focus(t)}}}function Ka(t,e,n){const o=e instanceof Array?e:e.childNodes,i=o[n];if(Ai(i))return i.data=Va+i.data,i;{const i=t.createTextNode(Va);return Array.isArray(e)?o.splice(n,0,i):Bi(e,n,i),i}}function Qa(t,e){return ui(t)&&ui(e)&&!Ai(t)&&!Ai(e)&&!Pi(t)&&!Pi(e)&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function Za(t,e){return ui(t)&&ui(e)&&Ai(t)&&Ai(e)}function Ja(t,e,n){return e===n||(Ai(e)&&Ai(n)?e.data===n.data:!(!t.isBlockFiller(e)||!t.isBlockFiller(n)))}function Xa(t,e){const n=t.data;if(n==e)return;const o=s(n,e);for(const e of o)"insert"===e.type?t.insertData(e.index,e.values.join("")):t.deleteData(e.index,e.howMany)}const tc=ja(wi.document),ec=Oa(wi.document),nc=Ra(wi.document),oc="data-ck-unsafe-attribute-",ic="data-ck-unsafe-element";class rc{constructor(t,e={}){this.document=t,this.renderingMode=e.renderingMode||"editing",this.blockFillerMode=e.blockFillerMode||("editing"===this.renderingMode?"br":"nbsp"),this.preElements=["pre"],this.blockElements=["address","article","aside","blockquote","caption","center","dd","details","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","legend","li","main","menu","nav","ol","p","pre","section","summary","table","tbody","td","tfoot","th","thead","tr","ul"],this.inlineObjectElements=["object","iframe","input","button","textarea","select","option","video","embed","audio","img","canvas"],this.unsafeElements=["script","style"],this._domDocument="editing"===this.renderingMode?wi.document:wi.document.implementation.createHTMLDocument(""),this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap,this._rawContentElementMatcher=new Hr,this._encounteredRawContentDomNodes=new WeakSet}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new ra(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t),this._viewToDomMapping.delete(e);for(const e of Array.from(t.children))this.unbindDomElement(e)}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}shouldRenderAttribute(t,e,n){return"data"===this.renderingMode||!(t=t.toLowerCase()).startsWith("on")&&(("srcdoc"!==t||!e.match(/\bon\S+\s*=|javascript:|<\s*\/*script/i))&&("img"===n&&("src"===t||"srcset"===t)||("source"===n&&"srcset"===t||!e.match(/^\s*(javascript:|data:(image\/svg|text\/x?html))/i))))}setContentOf(t,e){if("data"===this.renderingMode)return void(t.innerHTML=e);const n=(new DOMParser).parseFromString(e,"text/html"),o=n.createDocumentFragment(),i=n.body.childNodes;for(;i.length>0;)o.appendChild(i[0]);const r=n.createTreeWalker(o,NodeFilter.SHOW_ELEMENT),s=[];let a;for(;a=r.nextNode();)s.push(a);for(const t of s){for(const e of t.getAttributeNames())this.setDomElementAttribute(t,e,t.getAttribute(e));const e=t.tagName.toLowerCase();this._shouldRenameElement(e)&&(cc(e),t.replaceWith(this._createReplacementDomElement(e,t)))}for(;t.firstChild;)t.firstChild.remove();t.append(o)}viewToDom(t,e={}){if(t.is("$text")){const e=this._processDataFromViewText(t);return this._domDocument.createTextNode(e)}{if(this.mapViewToDom(t))return this.mapViewToDom(t);let n;if(t.is("documentFragment"))n=this._domDocument.createDocumentFragment(),e.bind&&this.bindDocumentFragments(n,t);else{if(t.is("uiElement"))return n="$comment"===t.name?this._domDocument.createComment(t.getCustomProperty("$rawContent")):t.render(this._domDocument,this),e.bind&&this.bindElements(n,t),n;this._shouldRenameElement(t.name)?(cc(t.name),n=this._createReplacementDomElement(t.name)):n=t.hasAttribute("xmlns")?this._domDocument.createElementNS(t.getAttribute("xmlns"),t.name):this._domDocument.createElement(t.name),t.is("rawElement")&&t.render(n,this),e.bind&&this.bindElements(n,t);for(const e of t.getAttributeKeys())this.setDomElementAttribute(n,e,t.getAttribute(e),t)}if(!1!==e.withChildren)for(const o of this.viewChildrenToDom(t,e))n.appendChild(o);return n}}setDomElementAttribute(t,e,n,o){const i=this.shouldRenderAttribute(e,n,t.tagName.toLowerCase())||o&&o.shouldRenderUnsafeAttribute(e);i||w("domconverter-unsafe-attribute-detected",{domElement:t,key:e,value:n}),t.hasAttribute(e)&&!i?t.removeAttribute(e):t.hasAttribute(oc+e)&&i&&t.removeAttribute(oc+e),t.setAttribute(i?e:oc+e,n)}removeDomElementAttribute(t,e){e!=ic&&(t.removeAttribute(e),t.removeAttribute(oc+e))}*viewChildrenToDom(t,e={}){const n=t.getFillerOffset&&t.getFillerOffset();let o=0;for(const i of t.getChildren()){n===o&&(yield this._getBlockFiller());const t=i.is("element")&&!!i.getCustomProperty("dataPipeline:transparentRendering")&&!lr(i.getAttributes());t&&"data"==this.renderingMode?yield*this.viewChildrenToDom(i,e):(t&&w("domconverter-transparent-rendering-unsupported-in-editing-pipeline",{viewElement:i}),yield this.viewToDom(i,e)),o++}n===o&&(yield this._getBlockFiller())}viewRangeToDom(t){const e=this.viewPositionToDom(t.start),n=this.viewPositionToDom(t.end),o=this._domDocument.createRange();return o.setStart(e.parent,e.offset),o.setEnd(n.parent,n.offset),o}viewPositionToDom(t){const e=t.parent;if(e.is("$text")){const n=this.findCorrespondingDomText(e);if(!n)return null;let o=t.offset;return Ha(n)&&(o+=Fa),{parent:n,offset:o}}{let n,o,i;if(0===t.offset){if(n=this.mapViewToDom(e),!n)return null;i=n.childNodes[0]}else{const e=t.nodeBefore;if(o=e.is("$text")?this.findCorrespondingDomText(e):this.mapViewToDom(e),!o)return null;n=o.parentNode,i=o.nextSibling}if(Ai(i)&&Ha(i))return{parent:i,offset:Fa};return{parent:n,offset:o?Ni(o)+1:0}}}domToView(t,e={}){if(this.isBlockFiller(t))return null;const n=this.getHostViewElement(t);if(n)return n;if(Pi(t)&&e.skipComments)return null;if(Ai(t)){if(Ua(t))return null;{const e=this._processDataFromDomText(t);return""===e?null:new Fr(this.document,e)}}{if(this.mapDomToView(t))return this.mapDomToView(t);let n;if(this.isDocumentFragment(t))n=new xa(this.document),e.bind&&this.bindDocumentFragments(t,n);else{n=this._createViewElement(t,e),e.bind&&this.bindElements(t,n);const o=t.attributes;if(o)for(let t=o.length,e=0;e{const{scrollLeft:e,scrollTop:n}=t;o.push([e,n])})),e.focus(),sc(e,(t=>{const[e,n]=o.shift();t.scrollLeft=e,t.scrollTop=n})),wi.window.scrollTo(t,n)}}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isBlockFiller(t){return"br"==this.blockFillerMode?t.isEqualNode(tc):!("BR"!==t.tagName||!ac(t,this.blockElements)||1!==t.parentNode.childNodes.length)||(t.isEqualNode(nc)||function(t,e){const n=t.isEqualNode(ec);return n&&ac(t,e)&&1===t.parentNode.childNodes.length}(t,this.blockElements))}isDomSelectionBackward(t){if(t.isCollapsed)return!1;const e=this._domDocument.createRange();try{e.setStart(t.anchorNode,t.anchorOffset),e.setEnd(t.focusNode,t.focusOffset)}catch(t){return!1}const n=e.collapsed;return e.detach(),n}getHostViewElement(t){const e=_i(t);for(e.pop();e.length;){const t=e.pop(),n=this._domToViewMapping.get(t);if(n&&(n.is("uiElement")||n.is("rawElement")))return n}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}registerRawContentMatcher(t){this._rawContentElementMatcher.add(t)}_getBlockFiller(){switch(this.blockFillerMode){case"nbsp":return Oa(this._domDocument);case"markedNbsp":return Ra(this._domDocument);case"br":return ja(this._domDocument)}}_isDomSelectionPositionCorrect(t,e){if(Ai(t)&&Ha(t)&&ethis.preElements.includes(t.name))))return e;if(" "==e.charAt(0)){const n=this._getTouchingInlineViewNode(t,!1);!(n&&n.is("$textProxy")&&this._nodeEndsWithSpace(n))&&n||(e=" "+e.substr(1))}if(" "==e.charAt(e.length-1)){const n=this._getTouchingInlineViewNode(t,!0),o=n&&n.is("$textProxy")&&" "==n.data.charAt(0);" "!=e.charAt(e.length-2)&&n&&!o||(e=e.substr(0,e.length-1)+" ")}return e.replace(/ {2}/g,"  ")}_nodeEndsWithSpace(t){if(t.getAncestors().some((t=>this.preElements.includes(t.name))))return!1;const e=this._processDataFromViewText(t);return" "==e.charAt(e.length-1)}_processDataFromDomText(t){let e=t.data;if(function(t,e){const n=_i(t);return n.some((t=>t.tagName&&e.includes(t.tagName.toLowerCase())))}(t,this.preElements))return Wa(t);e=e.replace(/[ \n\t\r]{1,}/g," ");const n=this._getTouchingInlineDomNode(t,!1),o=this._getTouchingInlineDomNode(t,!0),i=this._checkShouldLeftTrimDomText(t,n),r=this._checkShouldRightTrimDomText(t,o);i&&(e=e.replace(/^ /,"")),r&&(e=e.replace(/ $/,"")),e=Wa(new Text(e)),e=e.replace(/ \u00A0/g," ");const s=o&&this.isElement(o)&&"BR"!=o.tagName,a=o&&Ai(o)&&" "==o.data.charAt(0);return(/( |\u00A0)\u00A0$/.test(e)||!o||s||a)&&(e=e.replace(/\u00A0$/," ")),(i||n&&this.isElement(n)&&"BR"!=n.tagName)&&(e=e.replace(/^\u00A0/," ")),e}_checkShouldLeftTrimDomText(t,e){return!e||(this.isElement(e)?"BR"===e.tagName:!this._encounteredRawContentDomNodes.has(t.previousSibling)&&/[^\S\u00A0]/.test(e.data.charAt(e.data.length-1)))}_checkShouldRightTrimDomText(t,e){return!e&&!Ha(t)}_getTouchingInlineViewNode(t,e){const n=new ea({startPosition:e?na._createAfter(t):na._createBefore(t),direction:e?"forward":"backward"});for(const t of n){if(t.item.is("element")&&this.inlineObjectElements.includes(t.item.name))return t.item;if(t.item.is("containerElement"))return null;if(t.item.is("element","br"))return null;if(t.item.is("$textProxy"))return t.item}return null}_getTouchingInlineDomNode(t,e){if(!t.parentNode)return null;const n=e?"firstChild":"lastChild",o=e?"nextSibling":"previousSibling";let i=!0,r=t;do{if(!i&&r[n]?r=r[n]:r[o]?(r=r[o],i=!1):(r=r.parentNode,i=!0),!r||this._isBlockElement(r))return null}while(!Ai(r)&&"BR"!=r.tagName&&!this._isInlineObjectElement(r));return r}_isBlockElement(t){return this.isElement(t)&&this.blockElements.includes(t.tagName.toLowerCase())}_isInlineObjectElement(t){return this.isElement(t)&&this.inlineObjectElements.includes(t.tagName.toLowerCase())}_createViewElement(t,e){if(Pi(t))return new _a(this.document,"$comment");const n=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();return new Ys(this.document,n)}_isViewElementWithRawContent(t,e){return!1!==e.withChildren&&!!this._rawContentElementMatcher.match(t)}_shouldRenameElement(t){const e=t.toLowerCase();return"editing"===this.renderingMode&&this.unsafeElements.includes(e)}_createReplacementDomElement(t,e){const n=this._domDocument.createElement("span");if(n.setAttribute(ic,t),e){for(;e.firstChild;)n.appendChild(e.firstChild);for(const t of e.getAttributeNames())n.setAttribute(t,e.getAttribute(t))}return n}}function sc(t,e){let n=t;for(;n;)e(n),n=n.parentElement}function ac(t,e){const n=t.parentNode;return!!n&&!!n.tagName&&e.includes(n.tagName.toLowerCase())}function cc(t){"script"===t&&w("domconverter-unsafe-script-element-detected"),"style"===t&&w("domconverter-unsafe-style-element-detected")}class lc extends(pi()){constructor(t){super(),this.view=t,this.document=t.document,this.isEnabled=!1}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}destroy(){this.disable(),this.stopListening()}checkShouldIgnoreEventFromTarget(t){return t&&3===t.nodeType&&(t=t.parentNode),!(!t||1!==t.nodeType)&&t.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}const dc=Fs((function(t,e){Re(e,xn(e),t)}));class hc{constructor(t,e,n){this.view=t,this.document=t.document,this.domEvent=e,this.domTarget=e.target,dc(this,n)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}class uc extends lc{constructor(t){super(t),this.useCapture=!1}observe(t){("string"==typeof this.domEventType?[this.domEventType]:this.domEventType).forEach((e=>{this.listenTo(t,e,((t,e)=>{this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(e.target)&&this.onDomEvent(e)}),{useCapture:this.useCapture})}))}fire(t,e,n){this.isEnabled&&this.document.fire(t,new hc(this.view,e,n))}}class gc extends uc{constructor(t){super(t),this.domEventType=["keydown","keyup"]}onDomEvent(t){const e={keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,get keystroke(){return Xi(this)}};this.fire(t.type,t,e)}}const mc=function(){return et.Date.now()};var pc=/\s/;const fc=function(t){for(var e=t.length;e--&&pc.test(t.charAt(e)););return e};var kc=/^\s+/;const bc=function(t){return t?t.slice(0,fc(t)+1).replace(kc,""):t};var wc=NaN,_c=/^[-+]0x[0-9a-f]+$/i,Ac=/^0b[01]+$/i,Cc=/^0o[0-7]+$/i,vc=parseInt;const yc=function(t){if("number"==typeof t)return t;if(Gr(t))return wc;if(O(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=O(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=bc(t);var n=Ac.test(t);return n||Cc.test(t)?vc(t.slice(2),n?2:8):_c.test(t)?wc:+t};var xc="Expected a function",Ec=Math.max,Dc=Math.min;const Ic=function(t,e,n){var o,i,r,s,a,c,l=0,d=!1,h=!1,u=!0;if("function"!=typeof t)throw new TypeError(xc);function g(e){var n=o,r=i;return o=i=void 0,l=e,s=t.apply(r,n)}function m(t){var n=t-c;return void 0===c||n>=e||n<0||h&&t-l>=r}function p(){var t=mc();if(m(t))return f(t);a=setTimeout(p,function(t){var n=e-(t-c);return h?Dc(n,r-(t-l)):n}(t))}function f(t){return a=void 0,u&&o?g(t):(o=i=void 0,s)}function k(){var t=mc(),n=m(t);if(o=arguments,i=this,c=t,n){if(void 0===a)return function(t){return l=t,a=setTimeout(p,e),d?g(t):s}(c);if(h)return clearTimeout(a),a=setTimeout(p,e),g(c)}return void 0===a&&(a=setTimeout(p,e)),s}return e=yc(e)||0,O(n)&&(d=!!n.leading,r=(h="maxWait"in n)?Ec(yc(n.maxWait)||0,e):r,u="trailing"in n?!!n.trailing:u),k.cancel=function(){void 0!==a&&clearTimeout(a),l=0,o=c=i=a=void 0},k.flush=function(){return void 0===a?s:f(mc())},k};class Tc extends lc{constructor(t){super(t),this._fireSelectionChangeDoneDebounced=Ic((t=>{this.document.fire("selectionChangeDone",t)}),200)}observe(){const t=this.document;t.on("arrowKey",((e,n)=>{t.selection.isFake&&this.isEnabled&&n.preventDefault()}),{context:"$capture"}),t.on("arrowKey",((e,n)=>{t.selection.isFake&&this.isEnabled&&this._handleSelectionMove(n.keyCode)}),{priority:"lowest"})}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection,n=new ra(e.getRanges(),{backward:e.isBackward,fake:!1});t!=Zi.arrowleft&&t!=Zi.arrowup||n.setTo(n.getFirstPosition()),t!=Zi.arrowright&&t!=Zi.arrowdown||n.setTo(n.getLastPosition());const o={oldSelection:e,newSelection:n,domSelection:null};this.document.fire("selectionChange",o),this._fireSelectionChangeDoneDebounced(o)}}var Mc="__lodash_hash_undefined__";const Sc=function(t){return this.__data__.set(t,Mc),this};const Nc=function(t){return this.__data__.has(t)};function Bc(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new Ie;++ea))return!1;var l=r.get(t),d=r.get(e);if(l&&d)return l==e&&d==t;var h=-1,u=!0,g=n&Rc?new Pc:void 0;for(r.set(t,e),r.set(e,t);++h{this._isFocusChanging=!0,this._renderTimeoutId=setTimeout((()=>{this.flush(),t.change((()=>{}))}),50)})),e.on("blur",((n,o)=>{const i=e.selection.editableElement;null!==i&&i!==o.target||(e.isFocused=!1,this._isFocusChanging=!1,t.change((()=>{})))}))}flush(){this._isFocusChanging&&(this._isFocusChanging=!1,this.document.isFocused=!0)}onDomEvent(t){this.fire(t.type,t)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class bl extends lc{constructor(t){super(t),this.mutationObserver=t.getObserver(pl),this.focusObserver=t.getObserver(kl),this.selection=this.document.selection,this.domConverter=t.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=Ic((t=>{this.document.fire("selectionChangeDone",t)}),200),this._clearInfiniteLoopInterval=setInterval((()=>this._clearInfiniteLoop()),1e3),this._documentIsSelectingInactivityTimeoutDebounced=Ic((()=>this.document.isSelecting=!1),5e3),this._loopbackCounter=0}observe(t){const e=t.ownerDocument,n=()=>{this.document.isSelecting&&(this._handleSelectionChange(null,e),this.document.isSelecting=!1,this._documentIsSelectingInactivityTimeoutDebounced.cancel())};this.listenTo(t,"selectstart",(()=>{this.document.isSelecting=!0,this._documentIsSelectingInactivityTimeoutDebounced()}),{priority:"highest"}),this.listenTo(t,"keydown",n,{priority:"highest",useCapture:!0}),this.listenTo(t,"keyup",n,{priority:"highest",useCapture:!0}),this._documents.has(e)||(this.listenTo(e,"mouseup",n,{priority:"highest",useCapture:!0}),this.listenTo(e,"selectionchange",((t,n)=>{this.document.isComposing&&!i.isAndroid||(this._handleSelectionChange(n,e),this._documentIsSelectingInactivityTimeoutDebounced())})),this._documents.add(e))}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel(),this._documentIsSelectingInactivityTimeoutDebounced.cancel()}_handleSelectionChange(t,e){if(!this.isEnabled)return;const n=e.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(n.anchorNode))return;this.mutationObserver.flush();const o=this.domConverter.domSelectionToView(n);if(0!=o.rangeCount){if(this.view.hasDomSelection=!0,!(this.selection.isEqual(o)&&this.domConverter.isDomSelectionCorrect(n)||++this._loopbackCounter>60))if(this.focusObserver.flush(),this.selection.isSimilar(o))this.view.forceRender();else{const t={oldSelection:this.selection,newSelection:o,domSelection:n};this.document.fire("selectionChange",t),this._fireSelectionChangeDoneDebounced(t)}}else this.view.hasDomSelection=!1}_clearInfiniteLoop(){this._loopbackCounter=0}}class wl extends uc{constructor(t){super(t),this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",(()=>{e.isComposing=!0}),{priority:"low"}),e.on("compositionend",(()=>{e.isComposing=!1}),{priority:"low"})}onDomEvent(t){this.fire(t.type,t,{data:t.data})}}class _l{constructor(t,e={}){this._files=e.cacheFiles?Al(t):null,this._native=t}get files(){return this._files||(this._files=Al(this._native)),this._files}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}set effectAllowed(t){this._native.effectAllowed=t}get effectAllowed(){return this._native.effectAllowed}set dropEffect(t){this._native.dropEffect=t}get dropEffect(){return this._native.dropEffect}get isCanceled(){return"none"==this._native.dropEffect||!!this._native.mozUserCancelled}}function Al(t){const e=Array.from(t.files||[]),n=Array.from(t.items||[]);return e.length?e:n.filter((t=>"file"===t.kind)).map((t=>t.getAsFile()))}class Cl extends uc{constructor(t){super(t),this.domEventType=["beforeinput"]}onDomEvent(t){const e=t.getTargetRanges(),n=this.view,o=n.document;let r=null,s=null,a=[];if(t.dataTransfer&&(r=new _l(t.dataTransfer)),null!==t.data?s=t.data:r&&(s=r.getData("text/plain")),o.selection.isFake)a=Array.from(o.selection.getRanges());else if(e.length)a=e.map((t=>n.domConverter.domRangeToView(t)));else if(i.isAndroid){const e=t.target.ownerDocument.defaultView.getSelection();a=Array.from(n.domConverter.domSelectionToView(e).getRanges())}if(i.isAndroid&&"insertCompositionText"==t.inputType&&s&&s.endsWith("\n"))this.fire(t.type,t,{inputType:"insertParagraph",targetRanges:[n.createRange(a[0].end)]});else if("insertText"==t.inputType&&s&&s.includes("\n")){const e=s.split(/\n{1,2}/g);let n=a;for(let i=0;i{if(this.isEnabled&&((n=e.keyCode)==Zi.arrowright||n==Zi.arrowleft||n==Zi.arrowup||n==Zi.arrowdown)){const n=new aa(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(n,e),n.stop.called&&t.stop()}var n}))}observe(){}}class yl extends lc{constructor(t){super(t);const e=this.document;e.on("keydown",((t,n)=>{if(!this.isEnabled||n.keyCode!=Zi.tab||n.ctrlKey)return;const o=new aa(e,"tab",e.selection.getFirstRange());e.fire(o,n),o.stop.called&&t.stop()}))}observe(){}}class xl extends(W()){constructor(t){super(),this.document=new ma(t),this.domConverter=new rc(this.document),this.domRoots=new Map,this.set("isRenderingInProgress",!1),this.set("hasDomSelection",!1),this._renderer=new Ya(this.domConverter,this.document.selection),this._renderer.bind("isFocused","isSelecting","isComposing").to(this.document,"isFocused","isSelecting","isComposing"),this._initialDomRootAttributes=new WeakMap,this._observers=new Map,this._ongoingChange=!1,this._postFixersInProgress=!1,this._renderingDisabled=!1,this._hasChangedSinceTheLastRendering=!1,this._writer=new Ea(this.document),this.addObserver(pl),this.addObserver(kl),this.addObserver(bl),this.addObserver(gc),this.addObserver(Tc),this.addObserver(wl),this.addObserver(vl),this.addObserver(Cl),this.addObserver(yl),this.document.on("arrowKey",qa,{priority:"low"}),Aa(this),this.on("render",(()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1})),this.listenTo(this.document.selection,"change",(()=>{this._hasChangedSinceTheLastRendering=!0})),this.listenTo(this.document,"change:isFocused",(()=>{this._hasChangedSinceTheLastRendering=!0}))}attachDomRoot(t,e="main"){const n=this.document.getRoot(e);n._name=t.tagName.toLowerCase();const o={};for(const{name:e,value:i}of Array.from(t.attributes))o[e]=i,"class"===e?this._writer.addClass(i.split(" "),n):this._writer.setAttribute(e,i,n);this._initialDomRootAttributes.set(t,o);const i=()=>{this._writer.setAttribute("contenteditable",(!n.isReadOnly).toString(),n),n.isReadOnly?this._writer.addClass("ck-read-only",n):this._writer.removeClass("ck-read-only",n)};i(),this.domRoots.set(e,t),this.domConverter.bindElements(t,n),this._renderer.markToSync("children",n),this._renderer.markToSync("attributes",n),this._renderer.domDocuments.add(t.ownerDocument),n.on("change:children",((t,e)=>this._renderer.markToSync("children",e))),n.on("change:attributes",((t,e)=>this._renderer.markToSync("attributes",e))),n.on("change:text",((t,e)=>this._renderer.markToSync("text",e))),n.on("change:isReadOnly",(()=>this.change(i))),n.on("change",(()=>{this._hasChangedSinceTheLastRendering=!0}));for(const n of this._observers.values())n.observe(t,e)}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach((({name:t})=>e.removeAttribute(t)));const n=this._initialDomRootAttributes.get(e);for(const t in n)e.setAttribute(t,n[t]);this.domRoots.delete(t),this.domConverter.unbindDomElement(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e)return e;e=new t(this),this._observers.set(t,e);for(const[t,n]of this.domRoots)e.observe(n,t);return e.enable(),e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values())t.disable()}enableObservers(){for(const t of this._observers.values())t.enable()}scrollToTheSelection(){const t=this.document.selection.getFirstRange();t&&function({target:t,viewportOffset:e=0}){const n=Gi(t);let o=n,i=null;for(;o;){let r;r=$i(o==n?t:i),Vi(r,(()=>Yi(t,o)));const s=Yi(t,o);if(Fi(o,s,e),o.parent!=o){if(i=o.frameElement,o=o.parent,!i)return}else o=null}}({target:this.domConverter.viewRangeToDom(t),viewportOffset:20})}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;t&&(this.domConverter.focus(t),this.forceRender())}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress)throw new b("cannot-change-view-tree",this);try{if(this._ongoingChange)return t(this._writer);this._ongoingChange=!0;const e=t(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),e}catch(t){b.rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.getObserver(kl).flush(),this.change((()=>{}))}destroy(){for(const t of this._observers.values())t.destroy();this.document.destroy(),this.stopListening()}createPositionAt(t,e){return na._createAt(t,e)}createPositionAfter(t){return na._createAfter(t)}createPositionBefore(t){return na._createBefore(t)}createRange(...t){return new oa(...t)}createRangeOn(t){return oa._createOn(t)}createRangeIn(t){return oa._createIn(t)}createSelection(...t){return new ra(...t)}_disableRendering(t){this._renderingDisabled=t,0==t&&this.change((()=>{}))}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}class El{is(){throw new Error("is() method is abstract")}}class Dl extends El{constructor(t){super(),this.parent=null,this._attrs=ur(t)}get document(){return null}get index(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildIndex(this)))throw new b("model-node-not-found-in-parent",this);return t}get startOffset(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildStartOffset(this)))throw new b("model-node-not-found-in-parent",this);return t}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.startOffset),e=e.parent;return t}getAncestors(t={}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e),o=t.getAncestors(e);let i=0;for(;n[i]==o[i]&&n[i];)i++;return 0===i?null:n[i-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),n=t.getPath(),o=Z(e,n);switch(o){case"prefix":return!0;case"extension":return!1;default:return e[o](t[e[0]]=e[1],t)),{})),t}_clone(t){return new this.constructor(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=ur(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}Dl.prototype.is=function(t){return"node"===t||"model:node"===t};class Il{constructor(t){this._nodes=[],t&&this._insertNodes(0,t)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce(((t,e)=>t+e.offsetSize),0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return-1==e?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return null===e?null:this._nodes.slice(0,e).reduce(((t,e)=>t+e.offsetSize),0)}indexToOffset(t){if(t==this._nodes.length)return this.maxOffset;const e=this._nodes[t];if(!e)throw new b("model-nodelist-index-out-of-bounds",this);return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const n of this._nodes){if(t>=e&&tgr)return t.slice(0,n).concat(e).concat(t.slice(n+o,t.length));{const i=Array.from(t);return i.splice(n,o,...e),i}}(this._nodes,Array.from(e),t,0)}_removeNodes(t,e=1){return this._nodes.splice(t,e)}toJSON(){return this._nodes.map((t=>t.toJSON()))}}class Tl extends Dl{constructor(t,e){super(e),this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}toJSON(){const t=super.toJSON();return t.data=this.data,t}_clone(){return new Tl(this.data,this.getAttributes())}static fromJSON(t){return new Tl(t.data,t.attributes)}}Tl.prototype.is=function(t){return"$text"===t||"model:$text"===t||"text"===t||"model:text"===t||"node"===t||"model:node"===t};class Ml extends El{constructor(t,e,n){if(super(),this.textNode=t,e<0||e>t.offsetSize)throw new b("model-textproxy-wrong-offsetintext",this);if(n<0||e+n>t.offsetSize)throw new b("model-textproxy-wrong-length",this);this.data=t.data.substring(e,e+n),this.offsetInText=e}get startOffset(){return null!==this.textNode.startOffset?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return null!==this.startOffset?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}getPath(){const t=this.textNode.getPath();return t.length>0&&(t[t.length-1]+=this.offsetInText),t}getAncestors(t={}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}Ml.prototype.is=function(t){return"$textProxy"===t||"model:$textProxy"===t||"textProxy"===t||"model:textProxy"===t};class Sl extends Dl{constructor(t,e,n){super(e),this._children=new Il,this.name=t,n&&this._insertChild(0,n)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const n of t)e=e.getChild(e.offsetToIndex(n));return e}findAncestor(t,e={}){let n=e.includeSelf?this:this.parent;for(;n;){if(n.name===t)return n;n=n.parent}return null}toJSON(){const t=super.toJSON();if(t.name=this.name,this._children.length>0){t.children=[];for(const e of this._children)t.children.push(e.toJSON())}return t}_clone(t=!1){const e=t?Array.from(this._children).map((t=>t._clone(!0))):void 0;return new Sl(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=function(t){if("string"==typeof t)return[new Tl(t)];J(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new Tl(t):t instanceof Ml?new Tl(t.data,t.getAttributes()):t))}(e);for(const t of n)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n)t.parent=null;return n}static fromJSON(t){let e;if(t.children){e=[];for(const n of t.children)n.name?e.push(Sl.fromJSON(n)):e.push(Tl.fromJSON(n))}return new Sl(t.name,t.attributes,e)}}Sl.prototype.is=function(t,e){return e?e===this.name&&("element"===t||"model:element"===t):"element"===t||"model:element"===t||"node"===t||"model:node"===t};class Nl{constructor(t){if(!t||!t.boundaries&&!t.startPosition)throw new b("model-tree-walker-no-start-position",null);const e=t.direction||"forward";if("forward"!=e&&"backward"!=e)throw new b("model-tree-walker-unknown-direction",t,{direction:e});this.direction=e,this.boundaries=t.boundaries||null,t.startPosition?this.position=t.startPosition.clone():this.position=Pl._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null,this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(t){let e,n,o,i;do{o=this.position,i=this._visitedParent,({done:e,value:n}=this.next())}while(!e&&t(n));e||(this.position=o,this._visitedParent=i)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const t=this.position,e=this.position.clone(),n=this._visitedParent;if(null===n.parent&&e.offset===n.maxOffset)return{done:!0,value:void 0};if(n===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0,value:void 0};const o=zl(e,n),i=o||Ll(e,n,o);if(i instanceof Sl)return this.shallow?e.offset++:(e.path.push(0),this._visitedParent=i),this.position=e,Bl("elementStart",i,t,e,1);if(i instanceof Tl){let o;if(this.singleCharacters)o=1;else{let t=i.endOffset;this._boundaryEndParent==n&&this.boundaries.end.offsett&&(t=this.boundaries.start.offset),o=e.offset-t}const i=e.offset-r.startOffset,s=new Ml(r,i-o,o);return e.offset-=o,this.position=e,Bl("text",s,t,e,o)}return e.path.pop(),this.position=e,this._visitedParent=n.parent,Bl("elementStart",n,t,e,1)}}function Bl(t,e,n,o,i){return{done:!1,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}class Pl extends El{constructor(t,e,n="toNone"){if(super(),!t.is("element")&&!t.is("documentFragment"))throw new b("model-position-root-invalid",t);if(!(e instanceof Array)||0===e.length)throw new b("model-position-path-incorrect-format",t,{path:e});t.is("rootElement")?e=e.slice():(e=[...t.getPath(),...e],t=t.root),this.root=t,this.path=e,this.stickiness=n}get offset(){return this.path[this.path.length-1]}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;e1)return!1;if(1===e)return Rl(t,this,n);if(-1===e)return Rl(this,t,n)}return this.path.length===t.path.length||(this.path.length>t.path.length?jl(this.path,e):jl(t.path,e))}hasSameParentAs(t){if(this.root!==t.root)return!1;return"same"==Z(this.getParentPath(),t.getParentPath())}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=Pl._createAt(this)}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;return e.containsPosition(this)||e.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(t.splitPosition,t.moveTargetPosition):t.graveyardPosition?this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1):this._getTransformedByInsertion(t.insertionPosition,1)}_getTransformedByMergeOperation(t){const e=t.movedRange;let n;return e.containsPosition(this)||e.start.isEqual(this)?(n=this._getCombined(t.sourcePosition,t.targetPosition),t.sourcePosition.isBefore(t.targetPosition)&&(n=n._getTransformedByDeletion(t.deletionPosition,1))):n=this.isEqual(t.deletionPosition)?Pl._createAt(t.deletionPosition):this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1),n}_getTransformedByDeletion(t,e){const n=Pl._createAt(this);if(this.root!=t.root)return n;if("same"==Z(t.getParentPath(),this.getParentPath())){if(t.offsetthis.offset)return null;n.offset-=e}}else if("prefix"==Z(t.getParentPath(),this.getParentPath())){const o=t.path.length-1;if(t.offset<=this.path[o]){if(t.offset+e>this.path[o])return null;n.path[o]-=e}}return n}_getTransformedByInsertion(t,e){const n=Pl._createAt(this);if(this.root!=t.root)return n;if("same"==Z(t.getParentPath(),this.getParentPath()))(t.offset=e;){if(t.path[o]+i!==n.maxOffset)return!1;i=1,o--,n=n.parent}return!0}(t,n+1))}function jl(t,e){for(;ee+1;){const e=o.maxOffset-n.offset;0!==e&&t.push(new Fl(n,n.getShiftedBy(e))),n.path=n.path.slice(0,-1),n.offset++,o=o.parent}for(;n.path.length<=this.end.path.length;){const e=this.end.path[n.path.length-1],o=e-n.offset;0!==o&&t.push(new Fl(n,n.getShiftedBy(o))),n.offset=e,n.path.push(0)}return t}getWalker(t={}){return t.boundaries=this,new Nl(t)}*getItems(t={}){t.boundaries=this,t.ignoreElementEnd=!0;const e=new Nl(t);for(const t of e)yield t.item}*getPositions(t={}){t.boundaries=this;const e=new Nl(t);yield e.position;for(const t of e)yield t.nextPosition}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new Fl(this.start,this.end)]}getTransformedByOperations(t){const e=[new Fl(this.start,this.end)];for(const n of t)for(let t=0;t0?new this(n,o):new this(o,n)}static _createIn(t){return new this(Pl._createAt(t,0),Pl._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(Pl._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(0===t.length)throw new b("range-create-from-ranges-empty-array",null);if(1==t.length)return t[0].clone();const e=t[0];t.sort(((t,e)=>t.start.isAfter(e.start)?1:-1));const n=t.indexOf(e),o=new this(e.start,e.end);if(n>0)for(let e=n-1;t[e].end.isEqual(o.start);e++)o.start=Pl._createAt(t[e].start);for(let e=n+1;e{if(e.viewPosition)return;const n=this._modelToViewMapping.get(e.modelPosition.parent);if(!n)throw new b("mapping-model-position-view-parent-not-found",this,{modelPosition:e.modelPosition});e.viewPosition=this.findPositionIn(n,e.modelPosition.offset)}),{priority:"low"}),this.on("viewToModelPosition",((t,e)=>{if(e.modelPosition)return;const n=this.findMappedViewAncestor(e.viewPosition),o=this._viewToModelMapping.get(n),i=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,n);e.modelPosition=Pl._createAt(o,i)}),{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e),this._viewToModelMapping.set(e,t)}unbindViewElement(t,e={}){const n=this.toModelElement(t);if(this._elementToMarkerNames.has(t))for(const e of this._elementToMarkerNames.get(t))this._unboundMarkerNames.add(e);e.defer?this._deferredBindingRemovals.set(t,t.root):(this._viewToModelMapping.delete(t),this._modelToViewMapping.get(n)==t&&this._modelToViewMapping.delete(n))}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t),this._viewToModelMapping.get(e)==t&&this._viewToModelMapping.delete(e)}bindElementToMarker(t,e){const n=this._markerNameToElements.get(e)||new Set;n.add(t);const o=this._elementToMarkerNames.get(t)||new Set;o.add(e),this._markerNameToElements.set(e,n),this._elementToMarkerNames.set(t,o)}unbindElementFromMarkerName(t,e){const n=this._markerNameToElements.get(e);n&&(n.delete(t),0==n.size&&this._markerNameToElements.delete(e));const o=this._elementToMarkerNames.get(t);o&&(o.delete(e),0==o.size&&this._elementToMarkerNames.delete(t))}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),t}flushDeferredBindings(){for(const[t,e]of this._deferredBindingRemovals)t.root==e&&this.unbindViewElement(t);this._deferredBindingRemovals=new Map}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set,this._deferredBindingRemovals=new Map}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new Fl(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new oa(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};return this.fire("viewToModelPosition",e),e.modelPosition}toViewPosition(t,e={}){const n={modelPosition:t,mapper:this,isPhantom:e.isPhantom};return this.fire("modelToViewPosition",n),n.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e)return null;const n=new Set;for(const t of e)if(t.is("attributeElement"))for(const e of t.getElementsWithSameId())n.add(e);else n.add(t);return n}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;for(;!this._viewToModelMapping.has(e);)e=e.parent;return e}_toModelOffset(t,e,n){if(n!=t){return this._toModelOffset(t.parent,t.index,n)+this._toModelOffset(t,e,t)}if(t.is("$text"))return e;let o=0;for(let n=0;n1?e[0]+":"+e[1]:e[0]}class Wl extends(T()){constructor(t){super(),this._conversionApi={dispatcher:this,...t},this._firedEventsMap=new WeakMap}convertChanges(t,e,n){const o=this._createConversionApi(n,t.getRefreshedItems());for(const e of t.getMarkersToRemove())this._convertMarkerRemove(e.name,e.range,o);const i=this._reduceChanges(t.getChanges());for(const t of i)"insert"===t.type?this._convertInsert(Fl._createFromPositionAndShift(t.position,t.length),o):"reinsert"===t.type?this._convertReinsert(Fl._createFromPositionAndShift(t.position,t.length),o):"remove"===t.type?this._convertRemove(t.position,t.length,t.name,o):this._convertAttribute(t.range,t.attributeKey,t.attributeOldValue,t.attributeNewValue,o);for(const t of o.mapper.flushUnboundMarkerNames()){const n=e.get(t).getRange();this._convertMarkerRemove(t,n,o),this._convertMarkerAdd(t,n,o)}for(const e of t.getMarkersToAdd())this._convertMarkerAdd(e.name,e.range,o);o.mapper.flushDeferredBindings(),o.consumable.verifyAllConsumed("insert")}convert(t,e,n,o={}){const i=this._createConversionApi(n,void 0,o);this._convertInsert(t,i);for(const[t,n]of e)this._convertMarkerAdd(t,n,i);i.consumable.verifyAllConsumed("insert")}convertSelection(t,e,n){const o=Array.from(e.getMarkersAtPosition(t.getFirstPosition())),i=this._createConversionApi(n);if(this._addConsumablesForSelection(i.consumable,t,o),this.fire("selection",{selection:t},i),t.isCollapsed){for(const e of o){const n=e.getRange();if(!ql(t.getFirstPosition(),e,i.mapper))continue;const o={item:t,markerName:e.name,markerRange:n};i.consumable.test(t,"addMarker:"+e.name)&&this.fire(`addMarker:${e.name}`,o,i)}for(const e of t.getAttributeKeys()){const n={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};i.consumable.test(t,"attribute:"+n.attributeKey)&&this.fire(`attribute:${n.attributeKey}:$text`,n,i)}}}_convertInsert(t,e,n={}){n.doNotAddConsumables||this._addConsumablesForInsert(e.consumable,Array.from(t));for(const n of Array.from(t.getWalker({shallow:!0})).map(Gl))this._testAndFire("insert",n,e)}_convertRemove(t,e,n,o){this.fire(`remove:${n}`,{position:t,length:e},o)}_convertAttribute(t,e,n,o,i){this._addConsumablesForRange(i.consumable,t,`attribute:${e}`);for(const r of t){const t={item:r.item,range:Fl._createFromPositionAndShift(r.previousPosition,r.length),attributeKey:e,attributeOldValue:n,attributeNewValue:o};this._testAndFire(`attribute:${e}`,t,i)}}_convertReinsert(t,e){const n=Array.from(t.getWalker({shallow:!0}));this._addConsumablesForInsert(e.consumable,n);for(const t of n.map(Gl))this._testAndFire("insert",{...t,reconversion:!0},e)}_convertMarkerAdd(t,e,n){if("$graveyard"==e.root.rootName)return;const o=`addMarker:${t}`;if(n.consumable.add(e,o),this.fire(o,{markerName:t,markerRange:e},n),n.consumable.consume(e,o)){this._addConsumablesForRange(n.consumable,e,o);for(const i of e.getItems()){if(!n.consumable.test(i,o))continue;const r={item:i,range:Fl._createOn(i),markerName:t,markerRange:e};this.fire(o,r,n)}}}_convertMarkerRemove(t,e,n){"$graveyard"!=e.root.rootName&&this.fire(`removeMarker:${t}`,{markerName:t,markerRange:e},n)}_reduceChanges(t){const e={changes:t};return this.fire("reduceChanges",e),e.changes}_addConsumablesForInsert(t,e){for(const n of e){const e=n.item;if(null===t.test(e,"insert")){t.add(e,"insert");for(const n of e.getAttributeKeys())t.add(e,"attribute:"+n)}}return t}_addConsumablesForRange(t,e,n){for(const o of e.getItems())t.add(o,n);return t}_addConsumablesForSelection(t,e,n){t.add(e,"selection");for(const o of n)t.add(e,"addMarker:"+o.name);for(const n of e.getAttributeKeys())t.add(e,"attribute:"+n);return t}_testAndFire(t,e,n){const o=function(t,e){const n=e.item.is("element")?e.item.name:"$text";return`${t}:${n}`}(t,e),i=e.item.is("$textProxy")?n.consumable._getSymbolForTextProxy(e.item):e.item,r=this._firedEventsMap.get(n),s=r.get(i);if(s){if(s.has(o))return;s.add(o)}else r.set(i,new Set([o]));this.fire(o,e,n)}_testAndFireAddAttributes(t,e){const n={item:t,range:Fl._createOn(t)};for(const t of n.item.getAttributeKeys())n.attributeKey=t,n.attributeOldValue=null,n.attributeNewValue=n.item.getAttribute(t),this._testAndFire(`attribute:${t}`,n,e)}_createConversionApi(t,e=new Set,n={}){const o={...this._conversionApi,consumable:new Hl,writer:t,options:n,convertItem:t=>this._convertInsert(Fl._createOn(t),o),convertChildren:t=>this._convertInsert(Fl._createIn(t),o,{doNotAddConsumables:!0}),convertAttributes:t=>this._testAndFireAddAttributes(t,o),canReuseView:t=>!e.has(o.mapper.toModelElement(t))};return this._firedEventsMap.set(o,new Map),o}}function ql(t,e,n){const o=e.getRange(),i=Array.from(t.getAncestors());i.shift(),i.reverse();return!i.some((t=>{if(o.containsItem(t)){return!!n.toViewElement(t).getCustomProperty("addHighlight")}}))}function Gl(t){return{item:t.item,range:Fl._createFromPositionAndShift(t.previousPosition,t.length)}}class $l extends(T(El)){constructor(...t){super(),this._lastRangeBackward=!1,this._attrs=new Map,this._ranges=[],t.length&&this.setTo(...t)}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){return 1===this._ranges.length&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let n=!1;for(const o of t._ranges)if(e.isEqual(o)){n=!0;break}if(!n)return!1}return!0}*getRanges(){for(const t of this._ranges)yield new Fl(t.start,t.end)}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?new Fl(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?new Fl(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(...t){let[e,n,o]=t;if("object"==typeof n&&(o=n,n=void 0),null===e)this._setRanges([]);else if(e instanceof $l)this._setRanges(e.getRanges(),e.isBackward);else if(e&&"function"==typeof e.getRanges)this._setRanges(e.getRanges(),e.isBackward);else if(e instanceof Fl)this._setRanges([e],!!o&&!!o.backward);else if(e instanceof Pl)this._setRanges([new Fl(e)]);else if(e instanceof Dl){const t=!!o&&!!o.backward;let i;if("in"==n)i=Fl._createIn(e);else if("on"==n)i=Fl._createOn(e);else{if(void 0===n)throw new b("model-selection-setto-required-second-parameter",[this,e]);i=new Fl(Pl._createAt(e,n))}this._setRanges([i],t)}else{if(!J(e))throw new b("model-selection-setto-not-selectable",[this,e]);this._setRanges(e,o&&!!o.backward)}}_setRanges(t,e=!1){const n=Array.from(t),o=n.some((e=>{if(!(e instanceof Fl))throw new b("model-selection-set-ranges-not-range",[this,t]);return this._ranges.every((t=>!t.isEqual(e)))}));(n.length!==this._ranges.length||o)&&(this._replaceAllRanges(n),this._lastRangeBackward=!!e,this.fire("change:range",{directChange:!0}))}setFocus(t,e){if(null===this.anchor)throw new b("model-selection-setfocus-no-ranges",[this,t]);const n=Pl._createAt(t,e);if("same"==n.compareWith(this.focus))return;const o=this.anchor;this._ranges.length&&this._popRange(),"before"==n.compareWith(o)?(this._pushRange(new Fl(n,o)),this._lastRangeBackward=!0):(this._pushRange(new Fl(o,n)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){this.hasAttribute(t)&&(this._attrs.delete(t),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}setAttribute(t,e){this.getAttribute(t)!==e&&(this._attrs.set(t,e),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const n=Ql(e.start,t);n&&Zl(n,e)&&(yield n);for(const n of e.getWalker()){const o=n.item;"elementEnd"==n.type&&Kl(o,t,e)&&(yield o)}const o=Ql(e.end,t);o&&!e.end.isTouching(Pl._createAt(o,0))&&Zl(o,e)&&(yield o)}}containsEntireContent(t=this.anchor.root){const e=Pl._createAt(t,0),n=Pl._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&n.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t),this._ranges.push(new Fl(t.start,t.end))}_checkRange(t){for(let e=0;e0;)this._popRange()}_popRange(){this._ranges.pop()}}function Yl(t,e){return!e.has(t)&&(e.add(t),t.root.document.model.schema.isBlock(t)&&!!t.parent)}function Kl(t,e,n){return Yl(t,e)&&Zl(t,n)}function Ql(t,e){const n=t.parent.root.document.model.schema,o=t.parent.getAncestors({parentFirst:!0,includeSelf:!0});let i=!1;const r=o.find((t=>!i&&(i=n.isLimit(t),!i&&Yl(t,e))));return o.forEach((t=>e.add(t))),r}function Zl(t,e){const n=function(t){const e=t.root.document.model.schema;let n=t.parent;for(;n;){if(e.isBlock(n))return n;n=n.parent}}(t);if(!n)return!0;return!e.containsRange(Fl._createOn(n),!0)}$l.prototype.is=function(t){return"selection"===t||"model:selection"===t};class Jl extends(T(Fl)){constructor(t,e){super(t,e),Xl.call(this)}detach(){this.stopListening()}toRange(){return new Fl(this.start,this.end)}static fromRange(t){return new Jl(t.start,t.end)}}function Xl(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&td.call(this,n)}),{priority:"low"})}function td(t){const e=this.getTransformedByOperation(t),n=Fl._createFromRanges(e),o=!n.isEqual(this),i=function(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return!1}(this,t);let r=null;if(o){"$graveyard"==n.root.rootName&&(r="remove"==t.type?t.sourcePosition:t.deletionPosition);const e=this.toRange();this.start=n.start,this.end=n.end,this.fire("change:range",e,{deletionPosition:r})}else i&&this.fire("change:content",this.toRange(),{deletionPosition:r})}Jl.prototype.is=function(t){return"liveRange"===t||"model:liveRange"===t||"range"==t||"model:range"===t};const ed="selection:";class nd extends(T(El)){constructor(t){super(),this._selection=new od(t),this._selection.delegate("change:range").to(this),this._selection.delegate("change:attribute").to(this),this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection.updateMarkers(),this._selection._updateAttributes(!1)}observeMarkers(t){this._selection.observeMarkers(t)}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(...t){this._selection.setTo(...t)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection.getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return ed+t}static _isStoreAttributeKey(t){return t.startsWith(ed)}}nd.prototype.is=function(t){return"selection"===t||"model:selection"==t||"documentSelection"==t||"model:documentSelection"==t};class od extends $l{constructor(t){super(),this.markers=new cr({idProperty:"name"}),this._attributePriority=new Map,this._selectionRestorePosition=null,this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this._observedMarkers=new Set,this._model=t.model,this._document=t,this.listenTo(this._model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&"marker"!=n.type&&"rename"!=n.type&&"noop"!=n.type&&(0==this._ranges.length&&this._selectionRestorePosition&&this._fixGraveyardSelection(this._selectionRestorePosition),this._selectionRestorePosition=null,this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1})))}),{priority:"lowest"}),this.on("change:range",(()=>{this._validateSelectionRanges(this.getRanges())})),this.listenTo(this._model.markers,"update",((t,e,n,o)=>{this._updateMarker(e,o)})),this.listenTo(this._document,"change",((t,e)=>{!function(t,e){const n=t.document.differ;for(const o of n.getChanges()){if("insert"!=o.type)continue;const n=o.position.parent;o.length===n.maxOffset&&t.enqueueChange(e,(t=>{const e=Array.from(n.getAttributeKeys()).filter((t=>t.startsWith(ed)));for(const o of e)t.removeAttribute(o,n)}))}}(this._model,e)}))}get isCollapsed(){return 0===this._ranges.length?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t{if(this._hasChangedRange=!0,e.root==this._document.graveyard){this._selectionRestorePosition=o.deletionPosition;const t=this._ranges.indexOf(e);this._ranges.splice(t,1),e.detach()}})),e}updateMarkers(){if(!this._observedMarkers.size)return;const t=[];let e=!1;for(const e of this._model.markers){const n=e.name.split(":",1)[0];if(!this._observedMarkers.has(n))continue;const o=e.getRange();for(const n of this.getRanges())o.containsRange(n,!n.isCollapsed)&&t.push(e)}const n=Array.from(this.markers);for(const n of t)this.markers.has(n)||(this.markers.add(n),e=!0);for(const n of Array.from(this.markers))t.includes(n)||(this.markers.remove(n),e=!0);e&&this.fire("change:marker",{oldMarkers:n,directChange:!1})}_updateMarker(t,e){const n=t.name.split(":",1)[0];if(!this._observedMarkers.has(n))return;let o=!1;const i=Array.from(this.markers),r=this.markers.has(t);if(e){let n=!1;for(const t of this.getRanges())if(e.containsRange(t,!t.isCollapsed)){n=!0;break}n&&!r?(this.markers.add(t),o=!0):!n&&r&&(this.markers.remove(t),o=!0)}else r&&(this.markers.remove(t),o=!0);o&&this.fire("change:marker",{oldMarkers:i,directChange:!1})}_updateAttributes(t){const e=ur(this._getSurroundingAttributes()),n=ur(this.getAttributes());if(t)this._attributePriority=new Map,this._attrs=new Map;else for(const[t,e]of this._attributePriority)"low"==e&&(this._attrs.delete(t),this._attributePriority.delete(t));this._setAttributesTo(e);const o=[];for(const[t,e]of this.getAttributes())n.has(t)&&n.get(t)===e||o.push(t);for(const[t]of n)this.hasAttribute(t)||o.push(t);o.length>0&&this.fire("change:attribute",{attributeKeys:o,directChange:!1})}_setAttribute(t,e,n=!0){const o=n?"normal":"low";if("low"==o&&"normal"==this._attributePriority.get(t))return!1;return super.getAttribute(t)!==e&&(this._attrs.set(t,e),this._attributePriority.set(t,o),!0)}_removeAttribute(t,e=!0){const n=e?"normal":"low";return("low"!=n||"normal"!=this._attributePriority.get(t))&&(this._attributePriority.set(t,n),!!super.hasAttribute(t)&&(this._attrs.delete(t),!0))}_setAttributesTo(t){const e=new Set;for(const[e,n]of this.getAttributes())t.get(e)!==n&&this._removeAttribute(e,!1);for(const[n,o]of t){this._setAttribute(n,o,!1)&&e.add(n)}return e}*getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty)for(const e of t.getAttributeKeys())if(e.startsWith(ed)){const n=e.substr(ed.length);yield[n,t.getAttribute(e)]}}_getSurroundingAttributes(){const t=this.getFirstPosition(),e=this._model.schema;let n=null;if(this.isCollapsed){const o=t.textNode?t.textNode:t.nodeBefore,i=t.textNode?t.textNode:t.nodeAfter;if(this.isGravityOverridden||(n=id(o)),n||(n=id(i)),!this.isGravityOverridden&&!n){let t=o;for(;t&&!e.isInline(t)&&!n;)t=t.previousSibling,n=id(t)}if(!n){let t=i;for(;t&&!e.isInline(t)&&!n;)t=t.nextSibling,n=id(t)}n||(n=this.getStoredAttributes())}else{const t=this.getFirstRange();for(const o of t){if(o.item.is("element")&&e.isObject(o.item))break;if("text"==o.type){n=o.item.getAttributes();break}}}return n}_fixGraveyardSelection(t){const e=this._model.schema.getNearestSelectionRange(t);e&&this._pushRange(e)}}function id(t){return t instanceof Ml||t instanceof Tl?t.getAttributes():null}class rd{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers)t(e);return this}}var sd=1,ad=4;const cd=function(t){return ii(t,sd|ad)};class ld extends rd{elementToElement(t){return this.add(function(t){const e=ud(t.model),n=gd(t.view,"container");e.attributes.length&&(e.children=!0);return o=>{o.on(`insert:${e.name}`,function(t,e=Ad){return(n,o,i)=>{if(!e(o.item,i.consumable,{preflight:!0}))return;const r=t(o.item,i,o);if(!r)return;e(o.item,i.consumable);const s=i.mapper.toViewPosition(o.range.start);i.mapper.bindElements(o.item,r),i.writer.insert(s,r),i.convertAttributes(o.item),wd(r,o.item.getChildren(),i,{reconversion:o.reconversion})}}(n,bd(e)),{priority:t.converterPriority||"normal"}),(e.children||e.attributes.length)&&o.on("reduceChanges",kd(e),{priority:"low"})}}(t))}elementToStructure(t){return this.add(function(t){const e=ud(t.model),n=gd(t.view,"container");return e.children=!0,o=>{if(o._conversionApi.schema.checkChild(e.name,"$text"))throw new b("conversion-element-to-structure-disallowed-text",o,{elementName:e.name});var i,r;o.on(`insert:${e.name}`,(i=n,r=bd(e),(t,e,n)=>{if(!r(e.item,n.consumable,{preflight:!0}))return;const o=new Map;n.writer._registerSlotFactory(function(t,e,n){return(o,i="children")=>{const r=o.createContainerElement("$slot");let s=null;if("children"===i)s=Array.from(t.getChildren());else{if("function"!=typeof i)throw new b("conversion-slot-mode-unknown",n.dispatcher,{modeOrFilter:i});s=Array.from(t.getChildren()).filter((t=>i(t)))}return e.set(r,s),r}}(e.item,o,n));const s=i(e.item,n,e);if(n.writer._clearSlotFactory(),!s)return;!function(t,e,n){const o=Array.from(e.values()).flat(),i=new Set(o);if(i.size!=o.length)throw new b("conversion-slot-filter-overlap",n.dispatcher,{element:t});if(i.size!=t.childCount)throw new b("conversion-slot-filter-incomplete",n.dispatcher,{element:t})}(e.item,o,n),r(e.item,n.consumable);const a=n.mapper.toViewPosition(e.range.start);n.mapper.bindElements(e.item,s),n.writer.insert(a,s),n.convertAttributes(e.item),function(t,e,n,o){n.mapper.on("modelToViewPosition",s,{priority:"highest"});let i=null,r=null;for([i,r]of e)wd(t,r,n,o),n.writer.move(n.writer.createRangeIn(i),n.writer.createPositionBefore(i)),n.writer.remove(i);function s(t,e){const n=e.modelPosition.nodeAfter,o=r.indexOf(n);o<0||(e.viewPosition=e.mapper.findPositionIn(i,o))}n.mapper.off("modelToViewPosition",s)}(s,o,n,{reconversion:e.reconversion})}),{priority:t.converterPriority||"normal"}),o.on("reduceChanges",kd(e),{priority:"low"})}}(t))}attributeToElement(t){return this.add(function(t){t=cd(t);let e=t.model;"string"==typeof e&&(e={key:e});let n=`attribute:${e.key}`;e.name&&(n+=":"+e.name);if(e.values)for(const n of e.values)t.view[n]=gd(t.view[n],"attribute");else t.view=gd(t.view,"attribute");const o=md(t);return e=>{e.on(n,function(t){return(e,n,o)=>{if(!o.consumable.test(n.item,e.name))return;const i=t(n.attributeOldValue,o,n),r=t(n.attributeNewValue,o,n);if(!i&&!r)return;o.consumable.consume(n.item,e.name);const s=o.writer,a=s.document.selection;if(n.item instanceof $l||n.item instanceof nd)s.wrap(a.getFirstRange(),r);else{let t=o.mapper.toViewRange(n.range);null!==n.attributeOldValue&&i&&(t=s.unwrap(t,i)),null!==n.attributeNewValue&&r&&s.wrap(t,r)}}}(o),{priority:t.converterPriority||"normal"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=cd(t);let e=t.model;"string"==typeof e&&(e={key:e});let n=`attribute:${e.key}`;e.name&&(n+=":"+e.name);if(e.values)for(const n of e.values)t.view[n]=pd(t.view[n]);else t.view=pd(t.view);const o=md(t);return e=>{var i;e.on(n,(i=o,(t,e,n)=>{if(!n.consumable.test(e.item,t.name))return;const o=i(e.attributeOldValue,n,e),r=i(e.attributeNewValue,n,e);if(!o&&!r)return;n.consumable.consume(e.item,t.name);const s=n.mapper.toViewElement(e.item),a=n.writer;if(!s)throw new b("conversion-attribute-to-attribute-on-text",n.dispatcher,e);if(null!==e.attributeOldValue&&o)if("class"==o.key){const t=or(o.value);for(const e of t)a.removeClass(e,s)}else if("style"==o.key){const t=Object.keys(o.value);for(const e of t)a.removeStyle(e,s)}else a.removeAttribute(o.key,s);if(null!==e.attributeNewValue&&r)if("class"==r.key){const t=or(r.value);for(const e of t)a.addClass(e,s)}else if("style"==r.key){const t=Object.keys(r.value);for(const e of t)a.setStyle(e,r.value[e],s)}else a.setAttribute(r.key,r.value,s)}),{priority:t.converterPriority||"normal"})}}(t))}markerToElement(t){return this.add(function(t){const e=gd(t.view,"ui");return n=>{var o;n.on(`addMarker:${t.model}`,(o=e,(t,e,n)=>{e.isOpening=!0;const i=o(e,n);e.isOpening=!1;const r=o(e,n);if(!i||!r)return;const s=e.markerRange;if(s.isCollapsed&&!n.consumable.consume(s,t.name))return;for(const e of s)if(!n.consumable.consume(e.item,t.name))return;const a=n.mapper,c=n.writer;c.insert(a.toViewPosition(s.start),i),n.mapper.bindElementToMarker(i,e.markerName),s.isCollapsed||(c.insert(a.toViewPosition(s.end),r),n.mapper.bindElementToMarker(r,e.markerName)),t.stop()}),{priority:t.converterPriority||"normal"}),n.on(`removeMarker:${t.model}`,((t,e,n)=>{const o=n.mapper.markerNameToElements(e.markerName);if(o){for(const t of o)n.mapper.unbindElementFromMarkerName(t,e.markerName),n.writer.clear(n.writer.createRangeOn(t),t);n.writer.clearClonedElementsGroup(e.markerName),t.stop()}}),{priority:t.converterPriority||"normal"})}}(t))}markerToHighlight(t){return this.add(function(t){return e=>{var n;e.on(`addMarker:${t.model}`,(n=t.view,(t,e,o)=>{if(!e.item)return;if(!(e.item instanceof $l||e.item instanceof nd||e.item.is("$textProxy")))return;const i=fd(n,e,o);if(!i)return;if(!o.consumable.consume(e.item,t.name))return;const r=o.writer,s=dd(r,i),a=r.document.selection;if(e.item instanceof $l||e.item instanceof nd)r.wrap(a.getFirstRange(),s);else{const t=o.mapper.toViewRange(e.range),n=r.wrap(t,s);for(const t of n.getItems())if(t.is("attributeElement")&&t.isSimilar(s)){o.mapper.bindElementToMarker(t,e.markerName);break}}}),{priority:t.converterPriority||"normal"}),e.on(`addMarker:${t.model}`,function(t){return(e,n,o)=>{if(!n.item)return;if(!(n.item instanceof Sl))return;const i=fd(t,n,o);if(!i)return;if(!o.consumable.test(n.item,e.name))return;const r=o.mapper.toViewElement(n.item);if(r&&r.getCustomProperty("addHighlight")){o.consumable.consume(n.item,e.name);for(const t of Fl._createIn(n.item))o.consumable.consume(t.item,e.name);r.getCustomProperty("addHighlight")(r,i,o.writer),o.mapper.bindElementToMarker(r,n.markerName)}}}(t.view),{priority:t.converterPriority||"normal"}),e.on(`removeMarker:${t.model}`,function(t){return(e,n,o)=>{if(n.markerRange.isCollapsed)return;const i=fd(t,n,o);if(!i)return;const r=dd(o.writer,i),s=o.mapper.markerNameToElements(n.markerName);if(s){for(const t of s)if(o.mapper.unbindElementFromMarkerName(t,n.markerName),t.is("attributeElement"))o.writer.unwrap(o.writer.createRangeOn(t),r);else{t.getCustomProperty("removeHighlight")(t,i.id,o.writer)}o.writer.clearClonedElementsGroup(n.markerName),e.stop()}}}(t.view),{priority:t.converterPriority||"normal"})}}(t))}markerToData(t){return this.add(function(t){t=cd(t);const e=t.model;let n=t.view;n||(n=n=>({group:e,name:n.substr(t.model.length+1)}));return o=>{var i;o.on(`addMarker:${e}`,(i=n,(t,e,n)=>{const o=i(e.markerName,n);if(!o)return;const r=e.markerRange;n.consumable.consume(r,t.name)&&(hd(r,!1,n,e,o),hd(r,!0,n,e,o),t.stop())}),{priority:t.converterPriority||"normal"}),o.on(`removeMarker:${e}`,function(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i)return;const r=o.mapper.markerNameToElements(n.markerName);if(r){for(const t of r)o.mapper.unbindElementFromMarkerName(t,n.markerName),t.is("containerElement")?(s(`data-${i.group}-start-before`,t),s(`data-${i.group}-start-after`,t),s(`data-${i.group}-end-before`,t),s(`data-${i.group}-end-after`,t)):o.writer.clear(o.writer.createRangeOn(t),t);o.writer.clearClonedElementsGroup(n.markerName),e.stop()}function s(t,e){if(e.hasAttribute(t)){const n=new Set(e.getAttribute(t).split(","));n.delete(i.name),0==n.size?o.writer.removeAttribute(t,e):o.writer.setAttribute(t,Array.from(n).join(","),e)}}}}(n),{priority:t.converterPriority||"normal"})}}(t))}}function dd(t,e){const n=t.createAttributeElement("span",e.attributes);return e.classes&&n._addClass(e.classes),"number"==typeof e.priority&&(n._priority=e.priority),n._id=e.id,n}function hd(t,e,n,o,i){const r=e?t.start:t.end,s=r.nodeAfter&&r.nodeAfter.is("element")?r.nodeAfter:null,a=r.nodeBefore&&r.nodeBefore.is("element")?r.nodeBefore:null;if(s||a){let t,r;e&&s||!e&&!a?(t=s,r=!0):(t=a,r=!1);const c=n.mapper.toViewElement(t);if(c)return void function(t,e,n,o,i,r){const s=`data-${r.group}-${e?"start":"end"}-${n?"before":"after"}`,a=t.hasAttribute(s)?t.getAttribute(s).split(","):[];a.unshift(r.name),o.writer.setAttribute(s,a.join(","),t),o.mapper.bindElementToMarker(t,i.markerName)}(c,e,r,n,o,i)}!function(t,e,n,o,i){const r=`${i.group}-${e?"start":"end"}`,s=i.name?{name:i.name}:null,a=n.writer.createUIElement(r,s);n.writer.insert(t,a),n.mapper.bindElementToMarker(a,o.markerName)}(n.mapper.toViewPosition(r),e,n,o,i)}function ud(t){return"string"==typeof t&&(t={name:t}),t.attributes?Array.isArray(t.attributes)||(t.attributes=[t.attributes]):t.attributes=[],t.children=!!t.children,t}function gd(t,e){return"function"==typeof t?t:(n,o)=>function(t,e,n){"string"==typeof t&&(t={name:t});let o;const i=e.writer,r=Object.assign({},t.attributes);if("container"==n)o=i.createContainerElement(t.name,r);else if("attribute"==n){const e={priority:t.priority||pa.DEFAULT_PRIORITY};o=i.createAttributeElement(t.name,r,e)}else o=i.createUIElement(t.name,r);if(t.styles){const e=Object.keys(t.styles);for(const n of e)i.setStyle(n,t.styles[n],o)}if(t.classes){const e=t.classes;if("string"==typeof e)i.addClass(e,o);else for(const t of e)i.addClass(t,o)}return o}(t,o,e)}function md(t){return t.model.values?(e,n,o)=>{const i=t.view[e];return i?i(e,n,o):null}:t.view}function pd(t){return"string"==typeof t?e=>({key:t,value:e}):"object"==typeof t?t.value?()=>t:e=>({key:t.key,value:e}):t}function fd(t,e,n){const o="function"==typeof t?t(e,n):t;return o?(o.priority||(o.priority=10),o.id||(o.id=e.markerName),o):null}function kd(t){const e=function(t){return(e,n)=>{if(!e.is("element",t.name))return!1;if("attribute"==n.type){if(t.attributes.includes(n.attributeKey))return!0}else if(t.children)return!0;return!1}}(t);return(t,n)=>{const o=[];n.reconvertedElements||(n.reconvertedElements=new Set);for(const t of n.changes){const i="attribute"==t.type?t.range.start.nodeAfter:t.position.parent;if(i&&e(i,t)){if(!n.reconvertedElements.has(i)){n.reconvertedElements.add(i);const t=Pl._createBefore(i);o.push({type:"remove",name:i.name,position:t,length:1},{type:"reinsert",name:i.name,position:t,length:1})}}else o.push(t)}n.changes=o}}function bd(t){return(e,n,o={})=>{const i=["insert"];for(const n of t.attributes)e.hasAttribute(n)&&i.push(`attribute:${n}`);return!!i.every((t=>n.test(e,t)))&&(o.preflight||i.forEach((t=>n.consume(e,t))),!0)}}function wd(t,e,n,o){for(const i of e)_d(t.root,i,n,o)||n.convertItem(i)}function _d(t,e,n,o){const{writer:i,mapper:r}=n;if(!o.reconversion)return!1;const s=r.toViewElement(e);return!(!s||s.root==t)&&(!!n.canReuseView(s)&&(i.move(i.createRangeOn(s),r.toViewPosition(Pl._createBefore(e))),!0))}function Ad(t,e,{preflight:n}={}){return n?e.test(t,"insert"):e.consume(t,"insert")}function Cd(t){const{schema:e,document:n}=t.model;for(const o of n.getRootNames()){const i=n.getRoot(o);if(i.isEmpty&&!e.checkChild(i,"$text")&&e.checkChild(i,"paragraph"))return t.insertElement("paragraph",i),!0}return!1}function vd(t,e,n){const o=n.createContext(t);return!!n.checkChild(o,"paragraph")&&!!n.checkChild(o.push("paragraph"),e)}function yd(t,e){const n=e.createElement("paragraph");return e.insert(n,t),e.createPositionAt(n,0)}class xd extends rd{elementToElement(t){return this.add(Ed(t))}elementToAttribute(t){return this.add(function(t){t=cd(t),Td(t);const e=Md(t,!1),n=Dd(t.view),o=n?`element:${n}`:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"low"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=cd(t);let e=null;("string"==typeof t.view||t.view.key)&&(e=function(t){"string"==typeof t.view&&(t.view={key:t.view});const e=t.view.key;let n;if("class"==e||"style"==e){n={["class"==e?"classes":"styles"]:t.view.value}}else{n={attributes:{[e]:void 0===t.view.value?/[\s\S]*/:t.view.value}}}t.view.name&&(n.name=t.view.name);return t.view=n,e}(t));Td(t,e);const n=Md(t,!0);return e=>{e.on("element",n,{priority:t.converterPriority||"low"})}}(t))}elementToMarker(t){return this.add(function(t){const e=function(t){return(e,n)=>{const o="string"==typeof t?t:t(e,n);return n.writer.createElement("$marker",{"data-name":o})}}(t.model);return Ed({...t,model:e})}(t))}dataToMarker(t){return this.add(function(t){t=cd(t),t.model||(t.model=e=>e?t.view+":"+e:t.view);const e={view:t.view,model:t.model},n=Id(Sd(e,"start")),o=Id(Sd(e,"end"));return i=>{i.on(`element:${t.view}-start`,n,{priority:t.converterPriority||"normal"}),i.on(`element:${t.view}-end`,o,{priority:t.converterPriority||"normal"});const r=p.get("low"),s=p.get("highest"),a=p.get(t.converterPriority)/s;i.on("element",function(t){return(e,n,o)=>{const i=`data-${t.view}`;function r(e,i){for(const r of i){const i=t.model(r,o),s=o.writer.createElement("$marker",{"data-name":i});o.writer.insert(s,e),n.modelCursor.isEqual(e)?n.modelCursor=n.modelCursor.getShiftedBy(1):n.modelCursor=n.modelCursor._getTransformedByInsertion(e,1),n.modelRange=n.modelRange._getTransformedByInsertion(e,1)[0]}}(o.consumable.test(n.viewItem,{attributes:i+"-end-after"})||o.consumable.test(n.viewItem,{attributes:i+"-start-after"})||o.consumable.test(n.viewItem,{attributes:i+"-end-before"})||o.consumable.test(n.viewItem,{attributes:i+"-start-before"}))&&(n.modelRange||Object.assign(n,o.convertChildren(n.viewItem,n.modelCursor)),o.consumable.consume(n.viewItem,{attributes:i+"-end-after"})&&r(n.modelRange.end,n.viewItem.getAttribute(i+"-end-after").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-start-after"})&&r(n.modelRange.end,n.viewItem.getAttribute(i+"-start-after").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-end-before"})&&r(n.modelRange.start,n.viewItem.getAttribute(i+"-end-before").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-start-before"})&&r(n.modelRange.start,n.viewItem.getAttribute(i+"-start-before").split(",")))}}(e),{priority:r+a})}}(t))}}function Ed(t){const e=Id(t=cd(t)),n=Dd(t.view),o=n?`element:${n}`:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"normal"})}}function Dd(t){return"string"==typeof t?t:"object"==typeof t&&"string"==typeof t.name?t.name:null}function Id(t){const e=new Hr(t.view);return(n,o,i)=>{const r=e.match(o.viewItem);if(!r)return;const s=r.match;if(s.name=!0,!i.consumable.test(o.viewItem,s))return;const a=function(t,e,n){return t instanceof Function?t(e,n):n.writer.createElement(t)}(t.model,o.viewItem,i);a&&i.safeInsert(a,o.modelCursor)&&(i.consumable.consume(o.viewItem,s),i.convertChildren(o.viewItem,a),i.updateConversionResult(a,o))}}function Td(t,e=null){const n=null===e||(t=>t.getAttribute(e)),o="object"!=typeof t.model?t.model:t.model.key,i="object"!=typeof t.model||void 0===t.model.value?n:t.model.value;t.model={key:o,value:i}}function Md(t,e){const n=new Hr(t.view);return(o,i,r)=>{if(!i.modelRange&&e)return;const s=n.match(i.viewItem);if(!s)return;if(!function(t,e){const n="function"==typeof t?t(e):t;if("object"==typeof n&&!Dd(n))return!1;return!n.classes&&!n.attributes&&!n.styles}(t.view,i.viewItem)?delete s.match.name:s.match.name=!0,!r.consumable.test(i.viewItem,s.match))return;const a=t.model.key,c="function"==typeof t.model.value?t.model.value(i.viewItem,r):t.model.value;if(null===c)return;i.modelRange||Object.assign(i,r.convertChildren(i.viewItem,i.modelCursor));const l=function(t,e,n,o){let i=!1;for(const r of Array.from(t.getItems({shallow:n})))o.schema.checkAttribute(r,e.key)&&(i=!0,r.hasAttribute(e.key)||o.writer.setAttribute(e.key,e.value,r));return i}(i.modelRange,{key:a,value:c},e,r);l&&(r.consumable.test(i.viewItem,{name:!0})&&(s.match.name=!0),r.consumable.consume(i.viewItem,s.match))}}function Sd(t,e){return{view:`${t.view}-${e}`,model:(e,n)=>{const o=e.getAttribute("name"),i=t.model(o,n);return n.writer.createElement("$marker",{"data-name":i})}}}class Nd extends(W()){constructor(t,e){super(),this.model=t,this.view=new xl(e),this.mapper=new Vl,this.downcastDispatcher=new Wl({mapper:this.mapper,schema:t.schema});const n=this.model.document,o=n.selection,i=this.model.markers;this.listenTo(this.model,"_beforeChanges",(()=>{this.view._disableRendering(!0)}),{priority:"highest"}),this.listenTo(this.model,"_afterChanges",(()=>{this.view._disableRendering(!1)}),{priority:"lowest"}),this.listenTo(n,"change",(()=>{this.view.change((t=>{this.downcastDispatcher.convertChanges(n.differ,i,t),this.downcastDispatcher.convertSelection(o,i,t)}))}),{priority:"low"}),this.listenTo(this.view.document,"selectionChange",function(t,e){return(n,o)=>{const i=o.newSelection,r=[];for(const t of i.getRanges())r.push(e.toModelRange(t));const s=t.createSelection(r,{backward:i.isBackward});s.isEqual(t.document.selection)||t.change((t=>{t.setSelection(s)}))}}(this.model,this.mapper)),this.downcastDispatcher.on("insert:$text",((t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewPosition(e.range.start),r=o.createText(e.item.data);o.insert(i,r)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,n)=>{n.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||n.convertChildren(e.item)}),{priority:"lowest"}),this.downcastDispatcher.on("remove",((t,e,n)=>{const o=n.mapper.toViewPosition(e.position),i=e.position.getShiftedBy(e.length),r=n.mapper.toViewPosition(i,{isPhantom:!0}),s=n.writer.createRange(o,r),a=n.writer.remove(s.getTrimmed());for(const t of n.writer.createRangeIn(a).getItems())n.mapper.unbindViewElement(t,{defer:!0})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=n.writer,i=o.document.selection;for(const t of i.getRanges())t.isCollapsed&&t.end.parent.isAttached()&&n.writer.mergeAttributes(t.start);o.setSelection(null)}),{priority:"high"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=e.selection;if(o.isCollapsed)return;if(!n.consumable.consume(o,"selection"))return;const i=[];for(const t of o.getRanges())i.push(n.mapper.toViewRange(t));n.writer.setSelection(i,{backward:o.isBackward})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=e.selection;if(!o.isCollapsed)return;if(!n.consumable.consume(o,"selection"))return;const i=n.writer,r=o.getFirstPosition(),s=n.mapper.toViewPosition(r),a=i.breakAttributes(s);i.setSelection(a)}),{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using((t=>{if("$graveyard"==t.rootName)return null;const e=new ta(this.view.document,t.name);return e.rootName=t.rootName,this.mapper.bindElements(t,e),e}))}destroy(){this.view.destroy(),this.stopListening()}reconvertMarker(t){const e="string"==typeof t?t:t.name,n=this.model.markers.get(e);if(!n)throw new b("editingcontroller-reconvertmarker-marker-not-exist",this,{markerName:e});this.model.change((()=>{this.model.markers._refresh(n)}))}reconvertItem(t){this.model.change((()=>{this.model.document.differ._refreshItem(t)}))}}class Bd{constructor(){this._consumables=new Map}add(t,e){let n;t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):(this._consumables.has(t)?n=this._consumables.get(t):(n=new zd(t),this._consumables.set(t,n)),n.add(e))}test(t,e){const n=this._consumables.get(t);return void 0===n?null:t.is("$text")||t.is("documentFragment")?n:n.test(e)}consume(t,e){return!!this.test(t,e)&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!1):this._consumables.get(t).consume(e),!0)}revert(t,e){const n=this._consumables.get(t);void 0!==n&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):n.revert(e))}static consumablesFromElement(t){const e={element:t,name:!0,attributes:[],classes:[],styles:[]},n=t.getAttributeKeys();for(const t of n)"style"!=t&&"class"!=t&&e.attributes.push(t);const o=t.getClassNames();for(const t of o)e.classes.push(t);const i=t.getStyleNames();for(const t of i)e.styles.push(t);return e}static createFrom(t,e){if(e||(e=new Bd),t.is("$text"))return e.add(t),e;t.is("element")&&e.add(t,Bd.consumablesFromElement(t)),t.is("documentFragment")&&e.add(t);for(const n of t.getChildren())e=Bd.createFrom(n,e);return e}}const Pd=["attributes","classes","styles"];class zd{constructor(t){this.element=t,this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){t.name&&(this._canConsumeName=!0);for(const e of Pd)e in t&&this._add(e,t[e])}test(t){if(t.name&&!this._canConsumeName)return this._canConsumeName;for(const e of Pd)if(e in t){const n=this._test(e,t[e]);if(!0!==n)return n}return!0}consume(t){t.name&&(this._canConsumeName=!1);for(const e of Pd)e in t&&this._consume(e,t[e])}revert(t){t.name&&(this._canConsumeName=!0);for(const e of Pd)e in t&&this._revert(e,t[e])}_add(t,e){const n=mt(e)?e:[e],o=this._consumables[t];for(const e of n){if("attributes"===t&&("class"===e||"style"===e))throw new b("viewconsumable-invalid-attribute",this);if(o.set(e,!0),"styles"===t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))o.set(t,!0)}}_test(t,e){const n=mt(e)?e:[e],o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){const t=o.get(e);if(void 0===t)return null;if(!t)return!1}else{const t="class"==e?"classes":"styles",n=this._test(t,[...this._consumables[t].keys()]);if(!0!==n)return n}return!0}_consume(t,e){const n=mt(e)?e:[e],o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){if(o.set(e,!1),"styles"==t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))o.set(t,!1)}else{const t="class"==e?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}}_revert(t,e){const n=mt(e)?e:[e],o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){!1===o.get(e)&&o.set(e,!0)}else{const t="class"==e?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}}}class Ld extends(W()){constructor(){super(),this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",((t,e)=>{e[0]=new Od(e[0])}),{priority:"highest"}),this.on("checkChild",((t,e)=>{e[0]=new Od(e[0]),e[1]=this.getDefinition(e[1])}),{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t])throw new b("schema-cannot-register-item-twice",this,{itemName:t});this._sourceDefinitions[t]=[Object.assign({},e)],this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t])throw new b("schema-cannot-extend-missing-item",this,{itemName:t});this._sourceDefinitions[t].push(Object.assign({},e)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(t){let e;return e="string"==typeof t?t:"is"in t&&(t.is("$text")||t.is("$textProxy"))?"$text":t.name,this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!(!e||!e.isBlock)}isLimit(t){const e=this.getDefinition(t);return!!e&&!(!e.isLimit&&!e.isObject)}isObject(t){const e=this.getDefinition(t);return!!e&&!!(e.isObject||e.isLimit&&e.isSelectable&&e.isContent)}isInline(t){const e=this.getDefinition(t);return!(!e||!e.isInline)}isSelectable(t){const e=this.getDefinition(t);return!!e&&!(!e.isSelectable&&!e.isObject)}isContent(t){const e=this.getDefinition(t);return!!e&&!(!e.isContent&&!e.isObject)}checkChild(t,e){return!!e&&this._checkContextMatch(e,t)}checkAttribute(t,e){const n=this.getDefinition(t.last);return!!n&&n.allowAttributes.includes(e)}checkMerge(t,e){if(t instanceof Pl){const e=t.nodeBefore,n=t.nodeAfter;if(!(e instanceof Sl))throw new b("schema-check-merge-no-element-before",this);if(!(n instanceof Sl))throw new b("schema-check-merge-no-element-after",this);return this.checkMerge(e,n)}for(const n of e.getChildren())if(!this.checkChild(t,n))return!1;return!0}addChildCheck(t){this.on("checkChild",((e,[n,o])=>{if(!o)return;const i=t(n,o);"boolean"==typeof i&&(e.stop(),e.return=i)}),{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",((e,[n,o])=>{const i=t(n,o);"boolean"==typeof i&&(e.stop(),e.return=i)}),{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof Pl)e=t.parent;else{e=(t instanceof Fl?[t]:Array.from(t.getRanges())).reduce(((t,e)=>{const n=e.getCommonAncestor();return t?t.getCommonAncestor(n,{includeSelf:!0}):n}),null)}for(;!this.isLimit(e)&&e.parent;)e=e.parent;return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const n=[...t.getFirstPosition().getAncestors(),new Tl("",t.getAttributes())];return this.checkAttribute(n,e)}{const n=t.getRanges();for(const t of n)for(const n of t)if(this.checkAttribute(n.item,e))return!0}return!1}*getValidRanges(t,e){t=function*(t){for(const e of t)yield*e.getMinimalFlatRanges()}(t);for(const n of t)yield*this._getValidRangesForRange(n,e)}getNearestSelectionRange(t,e="both"){if(this.checkChild(t,"$text"))return new Fl(t);let n,o;const i=t.getAncestors().reverse().find((t=>this.isLimit(t)))||t.root;"both"!=e&&"backward"!=e||(n=new Nl({boundaries:Fl._createIn(i),startPosition:t,direction:"backward"})),"both"!=e&&"forward"!=e||(o=new Nl({boundaries:Fl._createIn(i),startPosition:t}));for(const t of function*(t,e){let n=!1;for(;!n;){if(n=!0,t){const e=t.next();e.done||(n=!1,yield{walker:t,value:e.value})}if(e){const t=e.next();t.done||(n=!1,yield{walker:e,value:t.value})}}}(n,o)){const e=t.walker==n?"elementEnd":"elementStart",o=t.value;if(o.type==e&&this.isObject(o.item))return Fl._createOn(o.item);if(this.checkChild(o.nextPosition,"$text"))return new Fl(o.nextPosition)}return null}findAllowedParent(t,e){let n=t.parent;for(;n;){if(this.checkChild(n,e))return n;if(this.isLimit(n))return null;n=n.parent}return null}setAllowedAttributes(t,e,n){const o=n.model;for(const[i,r]of Object.entries(e))o.schema.checkAttribute(t,i)&&n.setAttribute(i,r,t)}removeDisallowedAttributes(t,e){for(const n of t)if(n.is("$text"))Qd(this,n,e);else{const t=Fl._createIn(n).getPositions();for(const n of t){Qd(this,n.nodeBefore||n.parent,e)}}}getAttributesWithProperty(t,e,n){const o={};for(const[i,r]of t.getAttributes()){const t=this.getAttributeProperties(i);void 0!==t[e]&&(void 0!==n&&n!==t[e]||(o[i]=r))}return o}createContext(t){return new Od(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={},e=this._sourceDefinitions,n=Object.keys(e);for(const o of n)t[o]=Rd(e[o],o);for(const e of n)jd(t,e);for(const e of n)Fd(t,e);for(const e of n)Vd(t,e);for(const e of n)Hd(t,e),Ud(t,e);for(const e of n)Wd(t,e),qd(t,e),Gd(t,e);this._compiledDefinitions=t}_checkContextMatch(t,e,n=e.length-1){const o=e.getItem(n);if(t.allowIn.includes(o.name)){if(0==n)return!0;{const t=this.getDefinition(o);return this._checkContextMatch(t,e,n-1)}}return!1}*_getValidRangesForRange(t,e){let n=t.start,o=t.start;for(const i of t.getItems({shallow:!0}))i.is("element")&&(yield*this._getValidRangesForRange(Fl._createIn(i),e)),this.checkAttribute(i,e)||(n.isEqual(o)||(yield new Fl(n,o)),n=Pl._createAfter(i)),o=Pl._createAfter(i);n.isEqual(o)||(yield new Fl(n,o))}}class Od{constructor(t){if(t instanceof Od)return t;let e;e="string"==typeof t?[t]:Array.isArray(t)?t:t.getAncestors({includeSelf:!0}),this._items=e.map(Kd)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new Od([t]);return e._items=[...this._items,...e._items],e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map((t=>t.name))}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function Rd(t,e){const n={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],allowChildren:[],inheritTypesFrom:[]};return function(t,e){for(const n of t){const t=Object.keys(n).filter((t=>t.startsWith("is")));for(const o of t)e[o]=!!n[o]}}(t,n),$d(t,n,"allowIn"),$d(t,n,"allowContentOf"),$d(t,n,"allowWhere"),$d(t,n,"allowAttributes"),$d(t,n,"allowAttributesOf"),$d(t,n,"allowChildren"),$d(t,n,"inheritTypesFrom"),function(t,e){for(const n of t){const t=n.inheritAllFrom;t&&(e.allowContentOf.push(t),e.allowWhere.push(t),e.allowAttributesOf.push(t),e.inheritTypesFrom.push(t))}}(t,n),n}function jd(t,e){const n=t[e];for(const o of n.allowChildren){const n=t[o];n&&n.allowIn.push(e)}n.allowChildren.length=0}function Fd(t,e){for(const n of t[e].allowContentOf)if(t[n]){Yd(t,n).forEach((t=>{t.allowIn.push(e)}))}delete t[e].allowContentOf}function Vd(t,e){for(const n of t[e].allowWhere){const o=t[n];if(o){const n=o.allowIn;t[e].allowIn.push(...n)}}delete t[e].allowWhere}function Hd(t,e){for(const n of t[e].allowAttributesOf){const o=t[n];if(o){const n=o.allowAttributes;t[e].allowAttributes.push(...n)}}delete t[e].allowAttributesOf}function Ud(t,e){const n=t[e];for(const e of n.inheritTypesFrom){const o=t[e];if(o){const t=Object.keys(o).filter((t=>t.startsWith("is")));for(const e of t)e in n||(n[e]=o[e])}}delete n.inheritTypesFrom}function Wd(t,e){const n=t[e],o=n.allowIn.filter((e=>t[e]));n.allowIn=Array.from(new Set(o))}function qd(t,e){const n=t[e];for(const o of n.allowIn){t[o].allowChildren.push(e)}}function Gd(t,e){const n=t[e];n.allowAttributes=Array.from(new Set(n.allowAttributes))}function $d(t,e,n){for(const o of t){const t=o[n];"string"==typeof t?e[n].push(t):Array.isArray(t)&&e[n].push(...t)}}function Yd(t,e){const n=t[e];return(o=t,Object.keys(o).map((t=>o[t]))).filter((t=>t.allowIn.includes(n.name)));var o}function Kd(t){return"string"==typeof t||t.is("documentFragment")?{name:"string"==typeof t?t:"$documentFragment",*getAttributeKeys(){},getAttribute(){}}:{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute:e=>t.getAttribute(e)}}function Qd(t,e,n){for(const o of e.getAttributeKeys())t.checkAttribute(e,o)||n.removeAttribute(o,e)}class Zd extends(T()){constructor(t){super(),this._splitParts=new Map,this._cursorParents=new Map,this._modelCursor=null,this._emptyElementsToKeep=new Set,this.conversionApi={...t,consumable:null,writer:null,store:null,convertItem:(t,e)=>this._convertItem(t,e),convertChildren:(t,e)=>this._convertChildren(t,e),safeInsert:(t,e)=>this._safeInsert(t,e),updateConversionResult:(t,e)=>this._updateConversionResult(t,e),splitToAllowedParent:(t,e)=>this._splitToAllowedParent(t,e),getSplitParts:t=>this._getSplitParts(t),keepEmptyElement:t=>this._keepEmptyElement(t)}}convert(t,e,n=["$root"]){this.fire("viewCleanup",t),this._modelCursor=function(t,e){let n;for(const o of new Od(t)){const t={};for(const e of o.getAttributeKeys())t[e]=o.getAttribute(e);const i=e.createElement(o.name,t);n&&e.insert(i,n),n=Pl._createAt(i,0)}return n}(n,e),this.conversionApi.writer=e,this.conversionApi.consumable=Bd.createFrom(t),this.conversionApi.store={};const{modelRange:o}=this._convertItem(t,this._modelCursor),i=e.createDocumentFragment();if(o){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren()))e.append(t,i);i.markers=function(t,e){const n=new Set,o=new Map,i=Fl._createIn(t).getItems();for(const t of i)t.is("element","$marker")&&n.add(t);for(const t of n){const n=t.getAttribute("data-name"),i=e.createPositionBefore(t);o.has(n)?o.get(n).end=i.clone():o.set(n,new Fl(i.clone())),e.remove(t)}return o}(i,e)}return this._modelCursor=null,this._splitParts.clear(),this._cursorParents.clear(),this._emptyElementsToKeep.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,i}_convertItem(t,e){const n={viewItem:t,modelCursor:e,modelRange:null};if(t.is("element")?this.fire(`element:${t.name}`,n,this.conversionApi):t.is("$text")?this.fire("text",n,this.conversionApi):this.fire("documentFragment",n,this.conversionApi),n.modelRange&&!(n.modelRange instanceof Fl))throw new b("view-conversion-dispatcher-incorrect-result",this);return{modelRange:n.modelRange,modelCursor:n.modelCursor}}_convertChildren(t,e){let n=e.is("position")?e:Pl._createAt(e,0);const o=new Fl(n);for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,n);t.modelRange instanceof Fl&&(o.end=t.modelRange.end,n=t.modelCursor)}return{modelRange:o,modelCursor:n}}_safeInsert(t,e){const n=this._splitToAllowedParent(t,e);return!!n&&(this.conversionApi.writer.insert(t,n.position),!0)}_updateConversionResult(t,e){const n=this._getSplitParts(t),o=this.conversionApi.writer;e.modelRange||(e.modelRange=o.createRange(o.createPositionBefore(t),o.createPositionAfter(n[n.length-1])));const i=this._cursorParents.get(t);e.modelCursor=i?o.createPositionAt(i,0):e.modelRange.end}_splitToAllowedParent(t,e){const{schema:n,writer:o}=this.conversionApi;let i=n.findAllowedParent(e,t);if(i){if(i===e.parent)return{position:e};this._modelCursor.parent.getAncestors().includes(i)&&(i=null)}if(!i)return vd(e,t,n)?{position:yd(e,o)}:null;const r=this.conversionApi.writer.split(e,i),s=[];for(const t of r.range.getWalker())if("elementEnd"==t.type)s.push(t.item);else{const e=s.pop(),n=t.item;this._registerSplitPair(e,n)}const a=r.range.end.parent;return this._cursorParents.set(t,a),{position:r.position,cursorParent:a}}_registerSplitPair(t,e){this._splitParts.has(t)||this._splitParts.set(t,[t]);const n=this._splitParts.get(t);this._splitParts.set(e,n),n.push(e)}_getSplitParts(t){let e;return e=this._splitParts.has(t)?this._splitParts.get(t):[t],e}_keepEmptyElement(t){this._emptyElementsToKeep.add(t)}_removeEmptyElements(){let t=!1;for(const e of this._splitParts.keys())e.isEmpty&&!this._emptyElementsToKeep.has(e)&&(this.conversionApi.writer.remove(e),this._splitParts.delete(e),t=!0);t&&this._removeEmptyElements()}}class Jd{getHtml(t){const e=document.implementation.createHTMLDocument("").createElement("div");return e.appendChild(t),e.innerHTML}}class Xd{constructor(t){this.skipComments=!0,this.domParser=new DOMParser,this.domConverter=new rc(t,{renderingMode:"data"}),this.htmlWriter=new Jd}toData(t){const e=this.domConverter.viewToDom(t);return this.htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this.domConverter.domToView(e,{skipComments:this.skipComments})}registerRawContentMatcher(t){this.domConverter.registerRawContentMatcher(t)}useFillerType(t){this.domConverter.blockFillerMode="marked"==t?"markedNbsp":"nbsp"}_toDom(t){t.match(/<(?:html|body|head|meta)(?:\s[^>]*)?>/i)||(t=`${t}`);const e=this.domParser.parseFromString(t,"text/html"),n=e.createDocumentFragment(),o=e.body.childNodes;for(;o.length>0;)n.appendChild(o[0]);return n}}class th extends(T()){constructor(t,e){super(),this.model=t,this.mapper=new Vl,this.downcastDispatcher=new Wl({mapper:this.mapper,schema:t.schema}),this.downcastDispatcher.on("insert:$text",((t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewPosition(e.range.start),r=o.createText(e.item.data);o.insert(i,r)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,n)=>{n.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||n.convertChildren(e.item)}),{priority:"lowest"}),this.upcastDispatcher=new Zd({schema:t.schema}),this.viewDocument=new ma(e),this.stylesProcessor=e,this.htmlProcessor=new Xd(this.viewDocument),this.processor=this.htmlProcessor,this._viewWriter=new Ea(this.viewDocument),this.upcastDispatcher.on("text",((t,e,{schema:n,consumable:o,writer:i})=>{let r=e.modelCursor;if(!o.test(e.viewItem))return;if(!n.checkChild(r,"$text")){if(!vd(r,"$text",n))return;if(0==e.viewItem.data.trim().length)return;const t=r.nodeBefore;r=yd(r,i),t&&t.is("element","$marker")&&(i.move(i.createRangeOn(t),r),r=i.createPositionAfter(t))}o.consume(e.viewItem);const s=i.createText(e.viewItem.data);i.insert(s,r),e.modelRange=i.createRange(r,r.getShiftedBy(s.offsetSize)),e.modelCursor=e.modelRange.end}),{priority:"lowest"}),this.upcastDispatcher.on("element",((t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=o}}),{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",((t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=o}}),{priority:"lowest"}),W().prototype.decorate.call(this,"init"),W().prototype.decorate.call(this,"set"),W().prototype.decorate.call(this,"get"),W().prototype.decorate.call(this,"toView"),W().prototype.decorate.call(this,"toModel"),this.on("init",(()=>{this.fire("ready")}),{priority:"lowest"}),this.on("ready",(()=>{this.model.enqueueChange({isUndoable:!1},Cd)}),{priority:"lowest"})}get(t={}){const{rootName:e="main",trim:n="empty"}=t;if(!this._checkIfRootsExists([e]))throw new b("datacontroller-get-non-existent-root",this);const o=this.model.document.getRoot(e);return"empty"!==n||this.model.hasContent(o,{ignoreWhitespaces:!0})?this.stringify(o,t):""}stringify(t,e={}){const n=this.toView(t,e);return this.processor.toData(n)}toView(t,e={}){const n=this.viewDocument,o=this._viewWriter;this.mapper.clearBindings();const i=Fl._createIn(t),r=new xa(n);this.mapper.bindElements(t,r);const s=t.is("documentFragment")?t.markers:function(t){const e=[],n=t.root.document;if(!n)return new Map;const o=Fl._createIn(t);for(const t of n.model.markers){const n=t.getRange(),i=n.isCollapsed,r=n.start.isEqual(o.start)||n.end.isEqual(o.end);if(i&&r)e.push([t.name,n]);else{const i=o.getIntersection(n);i&&e.push([t.name,i])}}return e.sort((([t,e],[n,o])=>{if("after"!==e.end.compareWith(o.start))return 1;if("before"!==e.start.compareWith(o.end))return-1;switch(e.start.compareWith(o.start)){case"before":return 1;case"after":return-1;default:switch(e.end.compareWith(o.end)){case"before":return 1;case"after":return-1;default:return n.localeCompare(t)}}})),new Map(e)}(t);return this.downcastDispatcher.convert(i,s,o,e),r}init(t){if(this.model.document.version)throw new b("datacontroller-init-document-not-empty",this);let e={};if("string"==typeof t?e.main=t:e=t,!this._checkIfRootsExists(Object.keys(e)))throw new b("datacontroller-init-non-existent-root",this);return this.model.enqueueChange({isUndoable:!1},(t=>{for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.insert(this.parse(e[n],o),o,0)}})),Promise.resolve()}set(t,e={}){let n={};if("string"==typeof t?n.main=t:n=t,!this._checkIfRootsExists(Object.keys(n)))throw new b("datacontroller-set-non-existent-root",this);this.model.enqueueChange(e.batchType||{},(t=>{t.setSelection(null),t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const e of Object.keys(n)){const o=this.model.document.getRoot(e);t.remove(t.createRangeIn(o)),t.insert(this.parse(n[e],o),o,0)}}))}parse(t,e="$root"){const n=this.processor.toView(t);return this.toModel(n,e)}toModel(t,e="$root"){return this.model.change((n=>this.upcastDispatcher.convert(t,n,e)))}addStyleProcessorRules(t){t(this.stylesProcessor)}registerRawContentMatcher(t){this.processor&&this.processor!==this.htmlProcessor&&this.processor.registerRawContentMatcher(t),this.htmlProcessor.registerRawContentMatcher(t)}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t)if(!this.model.document.getRootNames().includes(e))return!1;return!0}}class eh{constructor(t,e){this._helpers=new Map,this._downcast=or(t),this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=or(e),this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(t,e){const n=this._downcast.includes(e);if(!this._upcast.includes(e)&&!n)throw new b("conversion-add-alias-dispatcher-not-registered",this);this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:n})}for(t){if(!this._helpers.has(t))throw new b("conversion-for-unknown-group",this);return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:n}of nh(t))this.for("upcast").elementToElement({model:e,view:n,converterPriority:t.converterPriority})}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:n}of nh(t))this.for("upcast").elementToAttribute({view:n,model:e,converterPriority:t.converterPriority})}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:n}of nh(t))this.for("upcast").attributeToAttribute({view:n,model:e})}_createConversionHelpers({name:t,dispatchers:e,isDowncast:n}){if(this._helpers.has(t))throw new b("conversion-group-exists",this);const o=n?new ld(e):new xd(e);this._helpers.set(t,o)}}function*nh(t){if(t.model.values)for(const e of t.model.values){const n={key:t.model.key,value:e},o=t.view[e],i=t.upcastAlso?t.upcastAlso[e]:void 0;yield*oh(n,o,i)}else yield*oh(t.model,t.view,t.upcastAlso)}function*oh(t,e,n){if(yield{model:t,view:e},n)for(const e of or(n))yield{model:t,view:e}}class ih{constructor(t){this.baseVersion=t,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);return t.__className=this.constructor.className,delete t.batch,delete t.isDocumentOperation,t}static get className(){return"Operation"}static fromJSON(t,e){return new this(t.baseVersion)}}function rh(t,e){const n=ch(e),o=n.reduce(((t,e)=>t+e.offsetSize),0),i=t.parent;dh(t);const r=t.index;return i._insertChild(r,n),lh(i,r+n.length),lh(i,r),new Fl(t,t.getShiftedBy(o))}function sh(t){if(!t.isFlat)throw new b("operation-utils-remove-range-not-flat",this);const e=t.start.parent;dh(t.start),dh(t.end);const n=e._removeChildren(t.start.index,t.end.index-t.start.index);return lh(e,t.start.index),n}function ah(t,e){if(!t.isFlat)throw new b("operation-utils-move-range-not-flat",this);const n=sh(t);return rh(e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset),n)}function ch(t){const e=[];!function t(n){if("string"==typeof n)e.push(new Tl(n));else if(n instanceof Ml)e.push(new Tl(n.data,n.getAttributes()));else if(n instanceof Dl)e.push(n);else if(J(n))for(const e of n)t(e)}(t);for(let t=1;tt.maxOffset)throw new b("move-operation-nodes-do-not-exist",this);if(t===e&&n=n&&this.targetPosition.path[t]t._clone(!0)))),e=new gh(this.position,t,this.baseVersion);return e.shouldReceiveAttributes=this.shouldReceiveAttributes,e}getReversed(){const t=this.position.root.document.graveyard,e=new Pl(t,[0]);return new uh(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffsett._clone(!0)))),rh(this.position,t)}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t.nodes=this.nodes.toJSON(),t}static get className(){return"InsertOperation"}static fromJSON(t,e){const n=[];for(const e of t.nodes)e.name?n.push(Sl.fromJSON(e)):n.push(Tl.fromJSON(e));const o=new gh(Pl.fromJSON(t.position,e),n,t.baseVersion);return o.shouldReceiveAttributes=t.shouldReceiveAttributes,o}}class mh extends ih{constructor(t,e,n,o,i,r){super(r),this.name=t,this.oldRange=e?e.clone():null,this.newRange=n?n.clone():null,this.affectsData=i,this._markers=o}get type(){return"marker"}clone(){return new mh(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new mh(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){this.newRange?this._markers._set(this.name,this.newRange,!0,this.affectsData):this._markers._remove(this.name)}toJSON(){const t=super.toJSON();return this.oldRange&&(t.oldRange=this.oldRange.toJSON()),this.newRange&&(t.newRange=this.newRange.toJSON()),delete t._markers,t}static get className(){return"MarkerOperation"}static fromJSON(t,e){return new mh(t.name,t.oldRange?Fl.fromJSON(t.oldRange,e):null,t.newRange?Fl.fromJSON(t.newRange,e):null,e.model.markers,t.affectsData,t.baseVersion)}}const ph=function(t,e){return gl(t,e)};class fh extends ih{constructor(t,e,n,o,i){super(i),this.range=t.clone(),this.key=e,this.oldValue=void 0===n?null:n,this.newValue=void 0===o?null:o}get type(){return null===this.oldValue?"addAttribute":null===this.newValue?"removeAttribute":"changeAttribute"}clone(){return new fh(this.range,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new fh(this.range,this.key,this.newValue,this.oldValue,this.baseVersion+1)}toJSON(){const t=super.toJSON();return t.range=this.range.toJSON(),t}_validate(){if(!this.range.isFlat)throw new b("attribute-operation-range-not-flat",this);for(const t of this.range.getItems({shallow:!0})){if(null!==this.oldValue&&!ph(t.getAttribute(this.key),this.oldValue))throw new b("attribute-operation-wrong-old-value",this,{item:t,key:this.key,value:this.oldValue});if(null===this.oldValue&&null!==this.newValue&&t.hasAttribute(this.key))throw new b("attribute-operation-attribute-exists",this,{node:t,key:this.key})}}_execute(){ph(this.oldValue,this.newValue)||function(t,e,n){dh(t.start),dh(t.end);for(const o of t.getItems({shallow:!0})){const t=o.is("$textProxy")?o.textNode:o;null!==n?t._setAttribute(e,n):t._removeAttribute(e),lh(t.parent,t.index)}lh(t.end.parent,t.end.index)}(this.range,this.key,this.newValue)}static get className(){return"AttributeOperation"}static fromJSON(t,e){return new fh(Fl.fromJSON(t.range,e),t.key,t.oldValue,t.newValue,t.baseVersion)}}class kh extends ih{get type(){return"noop"}clone(){return new kh(this.baseVersion)}getReversed(){return new kh(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}class bh extends ih{constructor(t,e,n,o){super(o),this.position=t,this.position.stickiness="toNext",this.oldName=e,this.newName=n}get type(){return"rename"}clone(){return new bh(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new bh(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const t=this.position.nodeAfter;if(!(t instanceof Sl))throw new b("rename-operation-wrong-position",this);if(t.name!==this.oldName)throw new b("rename-operation-wrong-name",this)}_execute(){this.position.nodeAfter.name=this.newName}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t}static get className(){return"RenameOperation"}static fromJSON(t,e){return new bh(Pl.fromJSON(t.position,e),t.oldName,t.newName,t.baseVersion)}}class wh extends ih{constructor(t,e,n,o,i){super(i),this.root=t,this.key=e,this.oldValue=n,this.newValue=o}get type(){return null===this.oldValue?"addRootAttribute":null===this.newValue?"removeRootAttribute":"changeRootAttribute"}clone(){return new wh(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new wh(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment"))throw new b("rootattribute-operation-not-a-root",this,{root:this.root,key:this.key});if(null!==this.oldValue&&this.root.getAttribute(this.key)!==this.oldValue)throw new b("rootattribute-operation-wrong-old-value",this,{root:this.root,key:this.key});if(null===this.oldValue&&null!==this.newValue&&this.root.hasAttribute(this.key))throw new b("rootattribute-operation-attribute-exists",this,{root:this.root,key:this.key})}_execute(){null!==this.newValue?this.root._setAttribute(this.key,this.newValue):this.root._removeAttribute(this.key)}toJSON(){const t=super.toJSON();return t.root=this.root.toJSON(),t}static get className(){return"RootAttributeOperation"}static fromJSON(t,e){if(!e.getRoot(t.root))throw new b("rootattribute-operation-fromjson-no-root",this,{rootName:t.root});return new wh(e.getRoot(t.root),t.key,t.oldValue,t.newValue,t.baseVersion)}}class _h extends ih{constructor(t,e,n,o,i){super(i),this.sourcePosition=t.clone(),this.sourcePosition.stickiness="toPrevious",this.howMany=e,this.targetPosition=n.clone(),this.targetPosition.stickiness="toNext",this.graveyardPosition=o.clone()}get type(){return"merge"}get deletionPosition(){return new Pl(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const t=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Fl(this.sourcePosition,t)}clone(){return new _h(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.targetPosition._getTransformedByMergeOperation(this),e=this.sourcePosition.path.slice(0,-1),n=new Pl(this.sourcePosition.root,e)._getTransformedByMergeOperation(this);return new Ah(t,this.howMany,n,this.graveyardPosition,this.baseVersion+1)}_validate(){const t=this.sourcePosition.parent,e=this.targetPosition.parent;if(!t.parent)throw new b("merge-operation-source-position-invalid",this);if(!e.parent)throw new b("merge-operation-target-position-invalid",this);if(this.howMany!=t.maxOffset)throw new b("merge-operation-how-many-invalid",this)}_execute(){const t=this.sourcePosition.parent;ah(Fl._createIn(t),this.targetPosition),ah(Fl._createOn(t),this.graveyardPosition)}toJSON(){const t=super.toJSON();return t.sourcePosition=t.sourcePosition.toJSON(),t.targetPosition=t.targetPosition.toJSON(),t.graveyardPosition=t.graveyardPosition.toJSON(),t}static get className(){return"MergeOperation"}static fromJSON(t,e){const n=Pl.fromJSON(t.sourcePosition,e),o=Pl.fromJSON(t.targetPosition,e),i=Pl.fromJSON(t.graveyardPosition,e);return new this(n,t.howMany,o,i,t.baseVersion)}}class Ah extends ih{constructor(t,e,n,o,i){super(i),this.splitPosition=t.clone(),this.splitPosition.stickiness="toNext",this.howMany=e,this.insertionPosition=n,this.graveyardPosition=o?o.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();return t.push(0),new Pl(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Fl(this.splitPosition,t)}clone(){return new Ah(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.splitPosition.root.document.graveyard,e=new Pl(t,[0]);return new _h(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent,e=this.splitPosition.offset;if(!t||t.maxOffset{if(t.key===e.key&&t.range.start.hasSameParentAs(e.range.start)){const o=t.range.getDifference(e.range).map((e=>new fh(e,t.key,t.oldValue,t.newValue,0))),i=t.range.getIntersection(e.range);return i&&n.aIsStrong&&o.push(new fh(i,e.key,e.newValue,t.newValue,0)),0==o.length?[new kh(0)]:o}return[t]})),xh(fh,gh,((t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const n=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes).map((e=>new fh(e,t.key,t.oldValue,t.newValue,t.baseVersion)));if(e.shouldReceiveAttributes){const o=Nh(e,t.key,t.oldValue);o&&n.unshift(o)}return n}return t.range=t.range._getTransformedByInsertion(e.position,e.howMany,!1)[0],[t]})),xh(fh,_h,((t,e)=>{const n=[];t.range.start.hasSameParentAs(e.deletionPosition)&&(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition))&&n.push(Fl._createFromPositionAndShift(e.graveyardPosition,1));const o=t.range._getTransformedByMergeOperation(e);return o.isCollapsed||n.push(o),n.map((e=>new fh(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),xh(fh,uh,((t,e)=>{const n=function(t,e){const n=Fl._createFromPositionAndShift(e.sourcePosition,e.howMany);let o=null,i=[];n.containsRange(t,!0)?o=t:t.start.hasSameParentAs(n.start)?(i=t.getDifference(n),o=t.getIntersection(n)):i=[t];const r=[];for(let t of i){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=e.getMovedRangeStart(),o=t.start.hasSameParentAs(n),i=t._getTransformedByInsertion(n,e.howMany,o);r.push(...i)}o&&r.push(o._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,!1)[0]);return r}(t.range,e);return n.map((e=>new fh(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),xh(fh,Ah,((t,e)=>{if(t.range.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.range.end.offset++,[t];if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const n=t.clone();return n.range=new Fl(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition)),t.range.end=e.splitPosition.clone(),t.range.end.stickiness="toPrevious",[t,n]}return t.range=t.range._getTransformedBySplitOperation(e),[t]})),xh(gh,fh,((t,e)=>{const n=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const o=Nh(t,e.key,e.newValue);o&&n.push(o)}return n})),xh(gh,gh,((t,e,n)=>(t.position.isEqual(e.position)&&n.aIsStrong||(t.position=t.position._getTransformedByInsertOperation(e)),[t]))),xh(gh,uh,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),xh(gh,Ah,((t,e)=>(t.position=t.position._getTransformedBySplitOperation(e),[t]))),xh(gh,_h,((t,e)=>(t.position=t.position._getTransformedByMergeOperation(e),[t]))),xh(mh,gh,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]),t.newRange&&(t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]),[t]))),xh(mh,mh,((t,e,n)=>{if(t.name==e.name){if(!n.aIsStrong)return[new kh(0)];t.oldRange=e.newRange?e.newRange.clone():null}return[t]})),xh(mh,_h,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByMergeOperation(e)),t.newRange&&(t.newRange=t.newRange._getTransformedByMergeOperation(e)),[t]))),xh(mh,uh,((t,e,n)=>{if(t.oldRange&&(t.oldRange=Fl._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))),t.newRange){if(n.abRelation){const o=Fl._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if("left"==n.abRelation.side&&e.targetPosition.isEqual(t.newRange.start))return t.newRange.end=o.end,t.newRange.start.path=n.abRelation.path,[t];if("right"==n.abRelation.side&&e.targetPosition.isEqual(t.newRange.end))return t.newRange.start=o.start,t.newRange.end.path=n.abRelation.path,[t]}t.newRange=Fl._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]})),xh(mh,Ah,((t,e,n)=>{if(t.oldRange&&(t.oldRange=t.oldRange._getTransformedBySplitOperation(e)),t.newRange){if(n.abRelation){const o=t.newRange._getTransformedBySplitOperation(e);return t.newRange.start.isEqual(e.splitPosition)&&n.abRelation.wasStartBeforeMergedElement?t.newRange.start=Pl._createAt(e.insertionPosition):t.newRange.start.isEqual(e.splitPosition)&&!n.abRelation.wasInLeftElement&&(t.newRange.start=Pl._createAt(e.moveTargetPosition)),t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasInRightElement?t.newRange.end=Pl._createAt(e.moveTargetPosition):t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasEndBeforeMergedElement?t.newRange.end=Pl._createAt(e.insertionPosition):t.newRange.end=o.end,[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]})),xh(_h,gh,((t,e)=>(t.sourcePosition.hasSameParentAs(e.position)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e),t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e),[t]))),xh(_h,_h,((t,e,n)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(n.bWasUndone){const n=e.graveyardPosition.path.slice();return n.push(0),t.sourcePosition=new Pl(e.graveyardPosition.root,n),t.howMany=0,[t]}return[new kh(0)]}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!n.bWasUndone&&"splitAtSource"!=n.abRelation){const o="$graveyard"==t.targetPosition.root.rootName,i="$graveyard"==e.targetPosition.root.rootName;if(i&&!o||!(o&&!i)&&n.aIsStrong){const n=e.targetPosition._getTransformedByMergeOperation(e),o=t.targetPosition._getTransformedByMergeOperation(e);return[new uh(n,t.howMany,o,0)]}return[new kh(0)]}return t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),t.graveyardPosition.isEqual(e.graveyardPosition)&&n.aIsStrong||(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),xh(_h,uh,((t,e,n)=>{const o=Fl._createFromPositionAndShift(e.sourcePosition,e.howMany);return"remove"==e.type&&!n.bWasUndone&&!n.forceWeakRemove&&t.deletionPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.sourcePosition)?[new kh(0)]:(t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition.hasSameParentAs(e.sourcePosition)&&(t.howMany-=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e),t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e),t.graveyardPosition.isEqual(e.targetPosition)||(t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)),[t])})),xh(_h,Ah,((t,e,n)=>{if(e.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1),t.deletionPosition.isEqual(e.graveyardPosition)&&(t.howMany=e.howMany)),t.targetPosition.isEqual(e.splitPosition)){const o=0!=e.howMany,i=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(o||i||"mergeTargetNotMoved"==n.abRelation)return t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),[t]}if(t.sourcePosition.isEqual(e.splitPosition)){if("mergeSourceNotMoved"==n.abRelation)return t.howMany=0,t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t];if("mergeSameElement"==n.abRelation||t.sourcePosition.offset>0)return t.sourcePosition=e.moveTargetPosition.clone(),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]}return t.sourcePosition.hasSameParentAs(e.splitPosition)&&(t.howMany=e.splitPosition.offset),t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]})),xh(uh,gh,((t,e)=>{const n=Fl._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByInsertOperation(e,!1)[0];return t.sourcePosition=n.start,t.howMany=n.end.offset-n.start.offset,t.targetPosition.isEqual(e.position)||(t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)),[t]})),xh(uh,uh,((t,e,n)=>{const o=Fl._createFromPositionAndShift(t.sourcePosition,t.howMany),i=Fl._createFromPositionAndShift(e.sourcePosition,e.howMany);let r,s=n.aIsStrong,a=!n.aIsStrong;if("insertBefore"==n.abRelation||"insertAfter"==n.baRelation?a=!0:"insertAfter"!=n.abRelation&&"insertBefore"!=n.baRelation||(a=!1),r=t.targetPosition.isEqual(e.targetPosition)&&a?t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany):t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Bh(t,e)&&Bh(e,t))return[e.getReversed()];if(o.containsPosition(e.targetPosition)&&o.containsRange(i,!0))return o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Ph([o],r);if(i.containsPosition(t.targetPosition)&&i.containsRange(o,!0))return o.start=o.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),o.end=o.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),Ph([o],r);const c=Z(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if("prefix"==c||"extension"==c)return o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Ph([o],r);"remove"!=t.type||"remove"==e.type||n.aWasUndone||n.forceWeakRemove?"remove"==t.type||"remove"!=e.type||n.bWasUndone||n.forceWeakRemove||(s=!1):s=!0;const l=[],d=o.getDifference(i);for(const t of d){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany),t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const n="same"==Z(t.start.getParentPath(),e.getMovedRangeStart().getParentPath()),o=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,n);l.push(...o)}const h=o.getIntersection(i);return null!==h&&s&&(h.start=h.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),h.end=h.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),0===l.length?l.push(h):1==l.length?i.start.isBefore(o.start)||i.start.isEqual(o.start)?l.unshift(h):l.push(h):l.splice(1,0,h)),0===l.length?[new kh(t.baseVersion)]:Ph(l,r)})),xh(uh,Ah,((t,e,n)=>{let o=t.targetPosition.clone();t.targetPosition.isEqual(e.insertionPosition)&&e.graveyardPosition&&"moveTargetAfter"!=n.abRelation||(o=t.targetPosition._getTransformedBySplitOperation(e));const i=Fl._createFromPositionAndShift(t.sourcePosition,t.howMany);if(i.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.howMany++,t.targetPosition=o,[t];if(i.start.hasSameParentAs(e.splitPosition)&&i.containsPosition(e.splitPosition)){let t=new Fl(e.splitPosition,i.end);t=t._getTransformedBySplitOperation(e);return Ph([new Fl(i.start,e.splitPosition),t],o)}t.targetPosition.isEqual(e.splitPosition)&&"insertAtSource"==n.abRelation&&(o=e.moveTargetPosition),t.targetPosition.isEqual(e.insertionPosition)&&"insertBetween"==n.abRelation&&(o=t.targetPosition);const r=[i._getTransformedBySplitOperation(e)];if(e.graveyardPosition){const o=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);t.howMany>1&&o&&!n.aWasUndone&&r.push(Fl._createFromPositionAndShift(e.insertionPosition,1))}return Ph(r,o)})),xh(uh,_h,((t,e,n)=>{const o=Fl._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.sourcePosition))if("remove"!=t.type||n.forceWeakRemove){if(1==t.howMany)return n.bWasUndone?(t.sourcePosition=e.graveyardPosition.clone(),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]):[new kh(0)]}else if(!n.aWasUndone){const n=[];let o=e.graveyardPosition.clone(),i=e.targetPosition._getTransformedByMergeOperation(e);t.howMany>1&&(n.push(new uh(t.sourcePosition,t.howMany-1,t.targetPosition,0)),o=o._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1),i=i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1));const r=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition),s=new uh(o,1,r,0),a=s.getMovedRangeStart().path.slice();a.push(0);const c=new Pl(s.targetPosition.root,a);i=i._getTransformedByMove(o,r,1);const l=new uh(i,e.howMany,c,0);return n.push(s),n.push(l),n}const i=Fl._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByMergeOperation(e);return t.sourcePosition=i.start,t.howMany=i.end.offset-i.start.offset,t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]})),xh(bh,gh,((t,e)=>(t.position=t.position._getTransformedByInsertOperation(e),[t]))),xh(bh,_h,((t,e)=>t.position.isEqual(e.deletionPosition)?(t.position=e.graveyardPosition.clone(),t.position.stickiness="toNext",[t]):(t.position=t.position._getTransformedByMergeOperation(e),[t]))),xh(bh,uh,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),xh(bh,bh,((t,e,n)=>{if(t.position.isEqual(e.position)){if(!n.aIsStrong)return[new kh(0)];t.oldName=e.newName}return[t]})),xh(bh,Ah,((t,e)=>{if("same"==Z(t.position.path,e.splitPosition.getParentPath())&&!e.graveyardPosition){const e=new bh(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}return t.position=t.position._getTransformedBySplitOperation(e),[t]})),xh(wh,wh,((t,e,n)=>{if(t.root===e.root&&t.key===e.key){if(!n.aIsStrong||t.newValue===e.newValue)return[new kh(0)];t.oldValue=e.newValue}return[t]})),xh(Ah,gh,((t,e)=>(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset{if(!t.graveyardPosition&&!n.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const n=e.graveyardPosition.path.slice();n.push(0);const o=new Pl(e.graveyardPosition.root,n),i=Ah.getInsertionPosition(new Pl(e.graveyardPosition.root,n)),r=new Ah(o,0,i,null,0);return t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=Ah.getInsertionPosition(t.splitPosition),t.graveyardPosition=r.insertionPosition.clone(),t.graveyardPosition.stickiness="toNext",[r,t]}return t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)&&t.howMany--,t.splitPosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=Ah.getInsertionPosition(t.splitPosition),t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),xh(Ah,uh,((t,e,n)=>{const o=Fl._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const i=o.start.isEqual(t.graveyardPosition)||o.containsPosition(t.graveyardPosition);if(!n.bWasUndone&&i){const n=t.splitPosition._getTransformedByMoveOperation(e),o=t.graveyardPosition._getTransformedByMoveOperation(e),i=o.path.slice();i.push(0);const r=new Pl(o.root,i);return[new uh(n,t.howMany,r,0)]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}const i=t.splitPosition.isEqual(e.targetPosition);if(i&&("insertAtSource"==n.baRelation||"splitBefore"==n.abRelation))return t.howMany+=e.howMany,t.splitPosition=t.splitPosition._getTransformedByDeletion(e.sourcePosition,e.howMany),t.insertionPosition=Ah.getInsertionPosition(t.splitPosition),[t];if(i&&n.abRelation&&n.abRelation.howMany){const{howMany:e,offset:o}=n.abRelation;return t.howMany+=e,t.splitPosition=t.splitPosition.getShiftedBy(o),[t]}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.splitPosition)){const n=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);return t.howMany-=n,t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition)return[new kh(0)];if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition))return[new kh(0)];if("splitBefore"==n.abRelation)return t.howMany=0,t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e),[t]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const o="$graveyard"==t.splitPosition.root.rootName,i="$graveyard"==e.splitPosition.root.rootName;if(i&&!o||!(o&&!i)&&n.aIsStrong){const n=[];return e.howMany&&n.push(new uh(e.moveTargetPosition,e.howMany,e.splitPosition,0)),t.howMany&&n.push(new uh(t.splitPosition,t.howMany,t.moveTargetPosition,0)),n}return[new kh(0)]}if(t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)),t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==n.abRelation)return t.howMany++,[t];if(e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==n.baRelation){const n=e.insertionPosition.path.slice();n.push(0);const o=new Pl(e.insertionPosition.root,n);return[t,new uh(t.insertionPosition,1,o,0)]}return t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset{const n=e[0];n.isDocumentOperation&&Oh.call(this,n)}),{priority:"low"})}function Oh(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path,this.root=e.root,this.fire("change",t)}}zh.prototype.is=function(t){return"livePosition"===t||"model:livePosition"===t||"position"==t||"model:position"===t};class Rh{constructor(t={}){"string"==typeof t&&(t="transparent"===t?{isUndoable:!1}:{},w("batch-constructor-deprecated-string-type"));const{isUndoable:e=!0,isLocal:n=!0,isUndo:o=!1,isTyping:i=!1}=t;this.operations=[],this.isUndoable=e,this.isLocal=n,this.isUndo=o,this.isTyping=i}get type(){return w("batch-type-deprecated"),"default"}get baseVersion(){for(const t of this.operations)if(null!==t.baseVersion)return t.baseVersion;return null}addOperation(t){return t.batch=this,this.operations.push(t),t}}class jh{constructor(t){this._changesInElement=new Map,this._elementSnapshots=new Map,this._changedMarkers=new Map,this._changeCount=0,this._cachedChanges=null,this._cachedChangesWithGraveyard=null,this._refreshedItems=new Set,this._markerCollection=t}get isEmpty(){return 0==this._changesInElement.size&&0==this._changedMarkers.size}bufferOperation(t){const e=t;switch(e.type){case"insert":if(this._isInInsertedElement(e.position.parent))return;this._markInsert(e.position.parent,e.position.offset,e.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const t of e.range.getItems({shallow:!0}))this._isInInsertedElement(t.parent)||this._markAttribute(t);break;case"remove":case"move":case"reinsert":{if(e.sourcePosition.isEqual(e.targetPosition)||e.sourcePosition.getShiftedBy(e.howMany).isEqual(e.targetPosition))return;const t=this._isInInsertedElement(e.sourcePosition.parent),n=this._isInInsertedElement(e.targetPosition.parent);t||this._markRemove(e.sourcePosition.parent,e.sourcePosition.offset,e.howMany),n||this._markInsert(e.targetPosition.parent,e.getMovedRangeStart().offset,e.howMany);break}case"rename":{if(this._isInInsertedElement(e.position.parent))return;this._markRemove(e.position.parent,e.position.offset,1),this._markInsert(e.position.parent,e.position.offset,1);const t=Fl._createFromPositionAndShift(e.position,1);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getData();this.bufferMarkerChange(e.name,t,t)}break}case"split":{const t=e.splitPosition.parent;this._isInInsertedElement(t)||this._markRemove(t,e.splitPosition.offset,e.howMany),this._isInInsertedElement(e.insertionPosition.parent)||this._markInsert(e.insertionPosition.parent,e.insertionPosition.offset,1),e.graveyardPosition&&this._markRemove(e.graveyardPosition.parent,e.graveyardPosition.offset,1);break}case"merge":{const t=e.sourcePosition.parent;this._isInInsertedElement(t.parent)||this._markRemove(t.parent,t.startOffset,1);const n=e.graveyardPosition.parent;this._markInsert(n,e.graveyardPosition.offset,1);const o=e.targetPosition.parent;this._isInInsertedElement(o)||this._markInsert(o,e.targetPosition.offset,t.maxOffset);break}}this._cachedChanges=null}bufferMarkerChange(t,e,n){const o=this._changedMarkers.get(t);o?(o.newMarkerData=n,null==o.oldMarkerData.range&&null==n.range&&this._changedMarkers.delete(t)):this._changedMarkers.set(t,{newMarkerData:n,oldMarkerData:e})}getMarkersToRemove(){const t=[];for(const[e,n]of this._changedMarkers)null!=n.oldMarkerData.range&&t.push({name:e,range:n.oldMarkerData.range});return t}getMarkersToAdd(){const t=[];for(const[e,n]of this._changedMarkers)null!=n.newMarkerData.range&&t.push({name:e,range:n.newMarkerData.range});return t}getChangedMarkers(){return Array.from(this._changedMarkers).map((([t,e])=>({name:t,data:{oldRange:e.oldMarkerData.range,newRange:e.newMarkerData.range}})))}hasDataChanges(){if(this._changesInElement.size>0)return!0;for(const{newMarkerData:t,oldMarkerData:e}of this._changedMarkers.values()){if(t.affectsData!==e.affectsData)return!0;if(t.affectsData){const n=t.range&&!e.range,o=!t.range&&e.range,i=t.range&&e.range&&!t.range.isEqual(e.range);if(n||o||i)return!0}}return!1}getChanges(t={}){if(this._cachedChanges)return t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();let e=[];for(const t of this._changesInElement.keys()){const n=this._changesInElement.get(t).sort(((t,e)=>t.offset===e.offset?t.type!=e.type?"remove"==t.type?-1:1:0:t.offsett.position.root!=e.position.root?t.position.root.rootNamet));for(const t of e)delete t.changeCount,"attribute"==t.type&&(delete t.position,delete t.length);return this._changeCount=0,this._cachedChangesWithGraveyard=e,this._cachedChanges=e.filter(Hh),t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice()}getRefreshedItems(){return new Set(this._refreshedItems)}reset(){this._changesInElement.clear(),this._elementSnapshots.clear(),this._changedMarkers.clear(),this._refreshedItems=new Set,this._cachedChanges=null}_refreshItem(t){if(this._isInInsertedElement(t.parent))return;this._markRemove(t.parent,t.startOffset,t.offsetSize),this._markInsert(t.parent,t.startOffset,t.offsetSize),this._refreshedItems.add(t);const e=Fl._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getData();this.bufferMarkerChange(t.name,e,e)}this._cachedChanges=null}_markInsert(t,e,n){const o={type:"insert",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o)}_markRemove(t,e,n){const o={type:"remove",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o),this._removeAllNestedChanges(t,e,n)}_markAttribute(t){const e={type:"attribute",offset:t.startOffset,howMany:t.offsetSize,count:this._changeCount++};this._markChange(t.parent,e)}_markChange(t,e){this._makeSnapshot(t);const n=this._getChangesForElement(t);this._handleChange(e,n),n.push(e);for(let t=0;tn.offset){if(o>i){const t={type:"attribute",offset:i,howMany:o-i,count:this._changeCount++};this._handleChange(t,e),e.push(t)}t.nodesToHandle=n.offset-t.offset,t.howMany=t.nodesToHandle}else t.offset>=n.offset&&t.offseti?(t.nodesToHandle=o-i,t.offset=i):t.nodesToHandle=0);if("remove"==n.type&&t.offsetn.offset){const i={type:"attribute",offset:n.offset,howMany:o-n.offset,count:this._changeCount++};this._handleChange(i,e),e.push(i),t.nodesToHandle=n.offset-t.offset,t.howMany=t.nodesToHandle}"attribute"==n.type&&(t.offset>=n.offset&&o<=i?(t.nodesToHandle=0,t.howMany=0,t.offset=0):t.offset<=n.offset&&o>=i&&(n.howMany=0))}}t.howMany=t.nodesToHandle,delete t.nodesToHandle}_getInsertDiff(t,e,n){return{type:"insert",position:Pl._createAt(t,e),name:n.name,attributes:new Map(n.attributes),length:1,changeCount:this._changeCount++}}_getRemoveDiff(t,e,n){return{type:"remove",position:Pl._createAt(t,e),name:n.name,attributes:new Map(n.attributes),length:1,changeCount:this._changeCount++}}_getAttributesDiff(t,e,n){const o=[];n=new Map(n);for(const[i,r]of e){const e=n.has(i)?n.get(i):null;e!==r&&o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:i,attributeOldValue:r,attributeNewValue:e,changeCount:this._changeCount++}),n.delete(i)}for(const[e,i]of n)o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:i,changeCount:this._changeCount++});return o}_isInInsertedElement(t){const e=t.parent;if(!e)return!1;const n=this._changesInElement.get(e),o=t.startOffset;if(n)for(const t of n)if("insert"==t.type&&o>=t.offset&&oo){for(let e=0;ethis._version+1&&this._gaps.set(this._version,t),this._version=t}get lastOperation(){return this._operations[this._operations.length-1]}addOperation(t){if(t.baseVersion!==this.version)throw new b("model-document-history-addoperation-incorrect-version",this,{operation:t,historyVersion:this.version});this._operations.push(t),this._version++,this._baseVersionToOperationIndex.set(t.baseVersion,this._operations.length-1)}getOperations(t,e=this.version){if(!this._operations.length)return[];const n=this._operations[0];void 0===t&&(t=n.baseVersion);let o=e-1;for(const[e,n]of this._gaps)t>e&&te&&othis.lastOperation.baseVersion)return[];let i=this._baseVersionToOperationIndex.get(t);void 0===i&&(i=0);let r=this._baseVersionToOperationIndex.get(o);return void 0===r&&(r=this._operations.length-1),this._operations.slice(i,r+1)}getOperation(t){const e=this._baseVersionToOperationIndex.get(t);if(void 0!==e)return this._operations[e]}setOperationAsUndone(t,e){this._undoPairs.set(e,t),this._undoneOperations.add(t)}isUndoingOperation(t){return this._undoPairs.has(t)}isUndoneOperation(t){return this._undoneOperations.has(t)}getUndoneOperation(t){return this._undoPairs.get(t)}reset(){this._version=0,this._undoPairs=new Map,this._operations=[],this._undoneOperations=new Set,this._gaps=new Map,this._baseVersionToOperationIndex=new Map}}class Wh extends Sl{constructor(t,e,n="main"){super(e),this._document=t,this.rootName=n}get document(){return this._document}toJSON(){return this.rootName}}Wh.prototype.is=function(t,e){return e?e===this.name&&("rootElement"===t||"model:rootElement"===t||"element"===t||"model:element"===t):"rootElement"===t||"model:rootElement"===t||"element"===t||"model:element"===t||"node"===t||"model:node"===t};const qh="$graveyard";class Gh extends(T()){constructor(t){super(),this.model=t,this.history=new Uh,this.selection=new nd(this),this.roots=new cr({idProperty:"rootName"}),this.differ=new jh(t.markers),this._postFixers=new Set,this._hasSelectionChangedFromTheLastChangeBlock=!1,this.createRoot("$root",qh),this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&this.differ.bufferOperation(n)}),{priority:"high"}),this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&this.history.addOperation(n)}),{priority:"low"}),this.listenTo(this.selection,"change",(()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0})),this.listenTo(t.markers,"update",((t,e,n,o,i)=>{const r={...e.getData(),range:o};this.differ.bufferMarkerChange(e.name,i,r),null===n&&e.on("change",((t,n)=>{const o=e.getData();this.differ.bufferMarkerChange(e.name,{...o,range:n},o)}))}))}get version(){return this.history.version}set version(t){this.history.version=t}get graveyard(){return this.getRoot(qh)}createRoot(t="$root",e="main"){if(this.roots.get(e))throw new b("model-document-createroot-name-exists",this,{name:e});const n=new Wh(this,t,e);return this.roots.add(n),n}destroy(){this.selection.destroy(),this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(){return Array.from(this.roots,(t=>t.rootName)).filter((t=>t!=qh))}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=Rr(this);return t.selection="[engine.model.DocumentSelection]",t.model="[engine.model.Model]",t}_handleChangeBlock(t){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(t),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",t.batch):this.fire("change",t.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const t of this.roots)if(t!==this.graveyard)return t;return this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot(),e=this.model,n=e.schema,o=e.createPositionFromPath(t,[0]);return n.getNearestSelectionRange(o)||e.createRange(o)}_validateSelectionRange(t){return $h(t.start)&&$h(t.end)}_callPostFixers(t){let e=!1;do{for(const n of this._postFixers)if(this.selection.refresh(),e=n(t),e)break}while(e)}}function $h(t){const e=t.textNode;if(e){const n=e.data,o=t.offset-e.startOffset;return!mr(n,o)&&!pr(n,o)}return!0}class Yh extends(T()){constructor(){super(...arguments),this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){const e=t instanceof Kh?t.name:t;return this._markers.has(e)}get(t){return this._markers.get(t)||null}_set(t,e,n=!1,o=!1){const i=t instanceof Kh?t.name:t;if(i.includes(","))throw new b("markercollection-incorrect-marker-name",this);const r=this._markers.get(i);if(r){const t=r.getData(),s=r.getRange();let a=!1;return s.isEqual(e)||(r._attachLiveRange(Jl.fromRange(e)),a=!0),n!=r.managedUsingOperations&&(r._managedUsingOperations=n,a=!0),"boolean"==typeof o&&o!=r.affectsData&&(r._affectsData=o,a=!0),a&&this.fire(`update:${i}`,r,s,e,t),r}const s=Jl.fromRange(e),a=new Kh(i,s,n,o);return this._markers.set(i,a),this.fire(`update:${i}`,a,null,e,{...a.getData(),range:null}),a}_remove(t){const e=t instanceof Kh?t.name:t,n=this._markers.get(e);return!!n&&(this._markers.delete(e),this.fire(`update:${e}`,n,n.getRange(),null,n.getData()),this._destroyMarker(n),!0)}_refresh(t){const e=t instanceof Kh?t.name:t,n=this._markers.get(e);if(!n)throw new b("markercollection-refresh-marker-not-exists",this);const o=n.getRange();this.fire(`update:${e}`,n,o,o,n.getData())}*getMarkersAtPosition(t){for(const e of this)e.getRange().containsPosition(t)&&(yield e)}*getMarkersIntersectingRange(t){for(const e of this)null!==e.getRange().getIntersection(t)&&(yield e)}destroy(){for(const t of this._markers.values())this._destroyMarker(t);this._markers=null,this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values())e.name.startsWith(t+":")&&(yield e)}_destroyMarker(t){t.stopListening(),t._detachLiveRange()}}class Kh extends(T(El)){constructor(t,e,n,o){super(),this.name=t,this._liveRange=this._attachLiveRange(e),this._managedUsingOperations=n,this._affectsData=o}get managedUsingOperations(){if(!this._liveRange)throw new b("marker-destroyed",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new b("marker-destroyed",this);return this._affectsData}getData(){return{range:this.getRange(),affectsData:this.affectsData,managedUsingOperations:this.managedUsingOperations}}getStart(){if(!this._liveRange)throw new b("marker-destroyed",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new b("marker-destroyed",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new b("marker-destroyed",this);return this._liveRange.toRange()}_attachLiveRange(t){return this._liveRange&&this._detachLiveRange(),t.delegate("change:range").to(this),t.delegate("change:content").to(this),this._liveRange=t,t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}Kh.prototype.is=function(t){return"marker"===t||"model:marker"===t};class Qh extends ih{constructor(t,e){super(null),this.sourcePosition=t.clone(),this.howMany=e}get type(){return"detach"}toJSON(){const t=super.toJSON();return t.sourcePosition=this.sourcePosition.toJSON(),t}_validate(){if(this.sourcePosition.root.document)throw new b("detach-operation-on-document-node",this)}_execute(){sh(Fl._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}class Zh extends El{constructor(t){super(),this.markers=new Map,this._children=new Il,t&&this._insertChild(0,t)}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}get nextSibling(){return null}get previousSibling(){return null}get root(){return this}get parent(){return null}get document(){return null}getAncestors(){return[]}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const n of t)e=e.getChild(e.offsetToIndex(n));return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children)t.push(e.toJSON());return t}static fromJSON(t){const e=[];for(const n of t)n.name?e.push(Sl.fromJSON(n)):e.push(Tl.fromJSON(n));return new Zh(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=function(t){if("string"==typeof t)return[new Tl(t)];J(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new Tl(t):t instanceof Ml?new Tl(t.data,t.getAttributes()):t))}(e);for(const t of n)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n)t.parent=null;return n}}Zh.prototype.is=function(t){return"documentFragment"===t||"model:documentFragment"===t};class Jh{constructor(t,e){this.model=t,this.batch=e}createText(t,e){return new Tl(t,e)}createElement(t,e){return new Sl(t,e)}createDocumentFragment(){return new Zh}cloneElement(t,e=!0){return t._clone(e)}insert(t,e,n=0){if(this._assertWriterUsedCorrectly(),t instanceof Tl&&""==t.data)return;const o=Pl._createAt(e,n);if(t.parent){if(ou(t.root,o.root))return void this.move(Fl._createOn(t),o);if(t.root.document)throw new b("model-writer-insert-forbidden-move",this);this.remove(t)}const i=o.root.document?o.root.document.version:null,r=new gh(o,t,i);if(t instanceof Tl&&(r.shouldReceiveAttributes=!0),this.batch.addOperation(r),this.model.applyOperation(r),t instanceof Zh)for(const[e,n]of t.markers){const t=Pl._createAt(n.root,0),i={range:new Fl(n.start._getCombined(t,o),n.end._getCombined(t,o)),usingOperation:!0,affectsData:!0};this.model.markers.has(e)?this.updateMarker(e,i):this.addMarker(e,i)}}insertText(t,e,n,o){e instanceof Zh||e instanceof Sl||e instanceof Pl?this.insert(this.createText(t),e,n):this.insert(this.createText(t,e),n,o)}insertElement(t,e,n,o){e instanceof Zh||e instanceof Sl||e instanceof Pl?this.insert(this.createElement(t),e,n):this.insert(this.createElement(t,e),n,o)}append(t,e){this.insert(t,e,"end")}appendText(t,e,n){e instanceof Zh||e instanceof Sl?this.insert(this.createText(t),e,"end"):this.insert(this.createText(t,e),n,"end")}appendElement(t,e,n){e instanceof Zh||e instanceof Sl?this.insert(this.createElement(t),e,"end"):this.insert(this.createElement(t,e),n,"end")}setAttribute(t,e,n){if(this._assertWriterUsedCorrectly(),n instanceof Fl){const o=n.getMinimalFlatRanges();for(const n of o)Xh(this,t,e,n)}else tu(this,t,e,n)}setAttributes(t,e){for(const[n,o]of ur(t))this.setAttribute(n,o,e)}removeAttribute(t,e){if(this._assertWriterUsedCorrectly(),e instanceof Fl){const n=e.getMinimalFlatRanges();for(const e of n)Xh(this,t,null,e)}else tu(this,t,null,e)}clearAttributes(t){this._assertWriterUsedCorrectly();const e=t=>{for(const e of t.getAttributeKeys())this.removeAttribute(e,t)};if(t instanceof Fl)for(const n of t.getItems())e(n);else e(t)}move(t,e,n){if(this._assertWriterUsedCorrectly(),!(t instanceof Fl))throw new b("writer-move-invalid-range",this);if(!t.isFlat)throw new b("writer-move-range-not-flat",this);const o=Pl._createAt(e,n);if(o.isEqual(t.start))return;if(this._addOperationForAffectedMarkers("move",t),!ou(t.root,o.root))throw new b("writer-move-different-document",this);const i=t.root.document?t.root.document.version:null,r=new uh(t.start,t.end.offset-t.start.offset,o,i);this.batch.addOperation(r),this.model.applyOperation(r)}remove(t){this._assertWriterUsedCorrectly();const e=(t instanceof Fl?t:Fl._createOn(t)).getMinimalFlatRanges().reverse();for(const t of e)this._addOperationForAffectedMarkers("move",t),nu(t.start,t.end.offset-t.start.offset,this.batch,this.model)}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore,n=t.nodeAfter;if(this._addOperationForAffectedMarkers("merge",t),!(e instanceof Sl))throw new b("writer-merge-no-element-before",this);if(!(n instanceof Sl))throw new b("writer-merge-no-element-after",this);t.root.document?this._merge(t):this._mergeDetached(t)}createPositionFromPath(t,e,n){return this.model.createPositionFromPath(t,e,n)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(...t){return this.model.createSelection(...t)}_mergeDetached(t){const e=t.nodeBefore,n=t.nodeAfter;this.move(Fl._createIn(n),Pl._createAt(e,"end")),this.remove(n)}_merge(t){const e=Pl._createAt(t.nodeBefore,"end"),n=Pl._createAt(t.nodeAfter,0),o=t.root.document.graveyard,i=new Pl(o,[0]),r=t.root.document.version,s=new _h(n,t.nodeAfter.maxOffset,e,i,r);this.batch.addOperation(s),this.model.applyOperation(s)}rename(t,e){if(this._assertWriterUsedCorrectly(),!(t instanceof Sl))throw new b("writer-rename-not-element-instance",this);const n=t.root.document?t.root.document.version:null,o=new bh(Pl._createBefore(t),t.name,e,n);this.batch.addOperation(o),this.model.applyOperation(o)}split(t,e){this._assertWriterUsedCorrectly();let n,o,i=t.parent;if(!i.parent)throw new b("writer-split-element-no-parent",this);if(e||(e=i.parent),!t.parent.getAncestors({includeSelf:!0}).includes(e))throw new b("writer-split-invalid-limit-element",this);do{const e=i.root.document?i.root.document.version:null,r=i.maxOffset-t.offset,s=Ah.getInsertionPosition(t),a=new Ah(t,r,s,null,e);this.batch.addOperation(a),this.model.applyOperation(a),n||o||(n=i,o=t.parent.nextSibling),i=(t=this.createPositionAfter(t.parent)).parent}while(i!==e);return{position:t,range:new Fl(Pl._createAt(n,"end"),Pl._createAt(o,0))}}wrap(t,e){if(this._assertWriterUsedCorrectly(),!t.isFlat)throw new b("writer-wrap-range-not-flat",this);const n=e instanceof Sl?e:new Sl(e);if(n.childCount>0)throw new b("writer-wrap-element-not-empty",this);if(null!==n.parent)throw new b("writer-wrap-element-attached",this);this.insert(n,t.start);const o=new Fl(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(o,Pl._createAt(n,0))}unwrap(t){if(this._assertWriterUsedCorrectly(),null===t.parent)throw new b("writer-unwrap-element-no-parent",this);this.move(Fl._createIn(t),this.createPositionAfter(t)),this.remove(t)}addMarker(t,e){if(this._assertWriterUsedCorrectly(),!e||"boolean"!=typeof e.usingOperation)throw new b("writer-addmarker-no-usingoperation",this);const n=e.usingOperation,o=e.range,i=void 0!==e.affectsData&&e.affectsData;if(this.model.markers.has(t))throw new b("writer-addmarker-marker-exists",this);if(!o)throw new b("writer-addmarker-no-range",this);return n?(eu(this,t,null,o,i),this.model.markers.get(t)):this.model.markers._set(t,o,n,i)}updateMarker(t,e){this._assertWriterUsedCorrectly();const n="string"==typeof t?t:t.name,o=this.model.markers.get(n);if(!o)throw new b("writer-updatemarker-marker-not-exists",this);if(!e)return w("writer-updatemarker-reconvert-using-editingcontroller",{markerName:n}),void this.model.markers._refresh(o);const i="boolean"==typeof e.usingOperation,r="boolean"==typeof e.affectsData,s=r?e.affectsData:o.affectsData;if(!i&&!e.range&&!r)throw new b("writer-updatemarker-wrong-options",this);const a=o.getRange(),c=e.range?e.range:a;i&&e.usingOperation!==o.managedUsingOperations?e.usingOperation?eu(this,n,null,c,s):(eu(this,n,a,null,s),this.model.markers._set(n,c,void 0,s)):o.managedUsingOperations?eu(this,n,a,c,s):this.model.markers._set(n,c,void 0,s)}removeMarker(t){this._assertWriterUsedCorrectly();const e="string"==typeof t?t:t.name;if(!this.model.markers.has(e))throw new b("writer-removemarker-no-marker",this);const n=this.model.markers.get(e);if(!n.managedUsingOperations)return void this.model.markers._remove(e);eu(this,e,n.getRange(),null,n.affectsData)}setSelection(...t){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(...t)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._setSelectionAttribute(t,e);else for(const[e,n]of ur(t))this._setSelectionAttribute(e,n)}removeSelectionAttribute(t){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._removeSelectionAttribute(t);else for(const e of t)this._removeSelectionAttribute(e)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const n=this.model.document.selection;if(n.isCollapsed&&n.anchor.parent.isEmpty){const o=nd._getStoreAttributeKey(t);this.setAttribute(o,e,n.anchor.parent)}n._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const n=nd._getStoreAttributeKey(t);this.removeAttribute(n,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new b("writer-incorrect-use",this)}_addOperationForAffectedMarkers(t,e){for(const n of this.model.markers){if(!n.managedUsingOperations)continue;const o=n.getRange();let i=!1;if("move"===t){const t=e;i=t.containsPosition(o.start)||t.start.isEqual(o.start)||t.containsPosition(o.end)||t.end.isEqual(o.end)}else{const t=e,n=t.nodeBefore,r=t.nodeAfter,s=o.start.parent==n&&o.start.isAtEnd,a=o.end.parent==r&&0==o.end.offset,c=o.end.nodeAfter==r,l=o.start.nodeAfter==r;i=s||a||c||l}i&&this.updateMarker(n.name,{range:o})}}}function Xh(t,e,n,o){const i=t.model,r=i.document;let s,a,c,l=o.start;for(const t of o.getWalker({shallow:!0}))c=t.item.getAttribute(e),s&&a!=c&&(a!=n&&d(),l=s),s=t.nextPosition,a=c;function d(){const o=new Fl(l,s),c=o.root.document?r.version:null,d=new fh(o,e,a,n,c);t.batch.addOperation(d),i.applyOperation(d)}s instanceof Pl&&s!=l&&a!=n&&d()}function tu(t,e,n,o){const i=t.model,r=i.document,s=o.getAttribute(e);let a,c;if(s!=n){if(o.root===o){const t=o.document?r.version:null;c=new wh(o,e,s,n,t)}else{a=new Fl(Pl._createBefore(o),t.createPositionAfter(o));const i=a.root.document?r.version:null;c=new fh(a,e,s,n,i)}t.batch.addOperation(c),i.applyOperation(c)}}function eu(t,e,n,o,i){const r=t.model,s=r.document,a=new mh(e,n,o,r.markers,!!i,s.version);t.batch.addOperation(a),r.applyOperation(a)}function nu(t,e,n,o){let i;if(t.root.document){const n=o.document,r=new Pl(n.graveyard,[0]);i=new uh(t,e,r,n.version)}else i=new Qh(t,e);n.addOperation(i),o.applyOperation(i)}function ou(t,e){return t===e||t instanceof Wh&&e instanceof Wh}function iu(t){t.document.registerPostFixer((e=>function(t,e){const n=e.document.selection,o=e.schema,i=[];let r=!1;for(const t of n.getRanges()){const e=ru(t,o);e&&!e.isEqual(t)?(i.push(e),r=!0):i.push(t)}r&&t.setSelection(function(t){const e=[...t],n=new Set;let o=1;for(;o!n.has(e)))}(i),{backward:n.isBackward});return!1}(e,t)))}function ru(t,e){return t.isCollapsed?function(t,e){const n=t.start,o=e.getNearestSelectionRange(n);if(!o){const t=n.getAncestors().reverse().find((t=>e.isObject(t)));return t?Fl._createOn(t):null}if(!o.isCollapsed)return o;const i=o.start;if(n.isEqual(i))return null;return new Fl(i)}(t,e):function(t,e){const{start:n,end:o}=t,i=e.checkChild(n,"$text"),r=e.checkChild(o,"$text"),s=e.getLimitElement(n),a=e.getLimitElement(o);if(s===a){if(i&&r)return null;if(function(t,e,n){const o=t.nodeAfter&&!n.isLimit(t.nodeAfter)||n.checkChild(t,"$text"),i=e.nodeBefore&&!n.isLimit(e.nodeBefore)||n.checkChild(e,"$text");return o||i}(n,o,e)){const t=n.nodeAfter&&e.isSelectable(n.nodeAfter)?null:e.getNearestSelectionRange(n,"forward"),i=o.nodeBefore&&e.isSelectable(o.nodeBefore)?null:e.getNearestSelectionRange(o,"backward"),r=t?t.start:n,s=i?i.end:o;return new Fl(r,s)}}const c=s&&!s.is("rootElement"),l=a&&!a.is("rootElement");if(c||l){const t=n.nodeAfter&&o.nodeBefore&&n.nodeAfter.parent===o.nodeBefore.parent,i=c&&(!t||!au(n.nodeAfter,e)),r=l&&(!t||!au(o.nodeBefore,e));let d=n,h=o;return i&&(d=Pl._createBefore(su(s,e))),r&&(h=Pl._createAfter(su(a,e))),new Fl(d,h)}return null}(t,e)}function su(t,e){let n=t,o=n;for(;e.isLimit(o)&&o.parent;)n=o,o=o.parent;return n}function au(t,e){return t&&e.isSelectable(t)}function cu(t,e,n={}){if(e.isCollapsed)return;const o=e.getFirstRange();if("$graveyard"==o.root.rootName)return;const i=t.schema;t.change((t=>{if(!n.doNotResetEntireContent&&function(t,e){const n=t.getLimitElement(e);if(!e.containsEntireContent(n))return!1;const o=e.getFirstRange();if(o.start.parent==o.end.parent)return!1;return t.checkChild(n,"paragraph")}(i,e))return void function(t,e){const n=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(n)),uu(t,t.createPositionAt(n,0),e)}(t,e);const r={};if(!n.doNotAutoparagraph){const t=e.getSelectedElement();t&&Object.assign(r,i.getAttributesWithProperty(t,"copyOnReplace",!0))}const[s,a]=function(t){const e=t.root.document.model,n=t.start;let o=t.end;if(e.hasContent(t,{ignoreMarkers:!0})){const n=function(t){const e=t.parent,n=e.root.document.model.schema,o=e.getAncestors({parentFirst:!0,includeSelf:!0});for(const t of o){if(n.isLimit(t))return null;if(n.isBlock(t))return t}}(o);if(n&&o.isTouching(e.createPositionAt(n,0))){const n=e.createSelection(t);e.modifySelection(n,{direction:"backward"});const i=n.getLastPosition(),r=e.createRange(i,o);e.hasContent(r,{ignoreMarkers:!0})||(o=i)}}return[zh.fromPosition(n,"toPrevious"),zh.fromPosition(o,"toNext")]}(o);s.isTouching(a)||t.remove(t.createRange(s,a)),n.leaveUnmerged||(!function(t,e,n){const o=t.model;if(!hu(t.model.schema,e,n))return;const[i,r]=function(t,e){const n=t.getAncestors(),o=e.getAncestors();let i=0;for(;n[i]&&n[i]==o[i];)i++;return[n[i],o[i]]}(e,n);if(!i||!r)return;!o.hasContent(i,{ignoreMarkers:!0})&&o.hasContent(r,{ignoreMarkers:!0})?du(t,e,n,i.parent):lu(t,e,n,i.parent)}(t,s,a),i.removeDisallowedAttributes(s.parent.getChildren(),t)),gu(t,e,s),!n.doNotAutoparagraph&&function(t,e){const n=t.checkChild(e,"$text"),o=t.checkChild(e,"paragraph");return!n&&o}(i,s)&&uu(t,s,e,r),s.detach(),a.detach()}))}function lu(t,e,n,o){const i=e.parent,r=n.parent;if(i!=o&&r!=o){for(e=t.createPositionAfter(i),(n=t.createPositionBefore(r)).isEqual(e)||t.insert(r,e),t.merge(e);n.parent.isEmpty;){const e=n.parent;n=t.createPositionBefore(e),t.remove(e)}hu(t.model.schema,e,n)&&lu(t,e,n,o)}}function du(t,e,n,o){const i=e.parent,r=n.parent;if(i!=o&&r!=o){for(e=t.createPositionAfter(i),(n=t.createPositionBefore(r)).isEqual(e)||t.insert(i,n);e.parent.isEmpty;){const n=e.parent;e=t.createPositionBefore(n),t.remove(n)}n=t.createPositionBefore(r),function(t,e){const n=e.nodeBefore,o=e.nodeAfter;n.name!=o.name&&t.rename(n,o.name);t.clearAttributes(n),t.setAttributes(Object.fromEntries(o.getAttributes()),n),t.merge(e)}(t,n),hu(t.model.schema,e,n)&&du(t,e,n,o)}}function hu(t,e,n){const o=e.parent,i=n.parent;return o!=i&&(!t.isLimit(o)&&!t.isLimit(i)&&function(t,e,n){const o=new Fl(t,e);for(const t of o.getWalker())if(n.isLimit(t.item))return!1;return!0}(e,n,t))}function uu(t,e,n,o={}){const i=t.createElement("paragraph");t.model.schema.setAllowedAttributes(i,o,t),t.insert(i,e),gu(t,n,t.createPositionAt(i,0))}function gu(t,e,n){e instanceof nd?t.setSelection(n):e.setTo(n)}function mu(t,e){const n=[];Array.from(t.getItems({direction:"backward"})).map((t=>e.createRangeOn(t))).filter((e=>(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end)))).forEach((t=>{n.push(t.start.parent),e.remove(t)})),n.forEach((t=>{let n=t;for(;n.parent&&n.isEmpty;){const t=e.createRangeOn(n);n=n.parent,e.remove(t)}}))}class pu{constructor(t,e,n){this._firstNode=null,this._lastNode=null,this._lastAutoParagraph=null,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null,this._nodeToSelect=null,this.model=t,this.writer=e,this.position=n,this.canMergeWith=new Set([this.position.parent]),this.schema=t.schema,this._documentFragment=e.createDocumentFragment(),this._documentFragmentPosition=e.createPositionAt(this._documentFragment,0)}handleNodes(t){for(const e of Array.from(t))this._handleNode(e);this._insertPartialFragment(),this._lastAutoParagraph&&this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph),this._mergeOnRight(),this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer),this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(t){const e=this.writer.createPositionAfter(this._lastNode),n=this.writer.createPositionAfter(t);if(n.isAfter(e)){if(this._lastNode=t,this.position.parent!=t||!this.position.isAtEnd)throw new b("insertcontent-invalid-insertion-position",this);this.position=n,this._setAffectedBoundaries(this.position)}}getSelectionRange(){return this._nodeToSelect?Fl._createOn(this._nodeToSelect):this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){return this._affectedStart?new Fl(this._affectedStart,this._affectedEnd):null}destroy(){this._affectedStart&&this._affectedStart.detach(),this._affectedEnd&&this._affectedEnd.detach()}_handleNode(t){if(this.schema.isObject(t))return void this._handleObject(t);let e=this._checkAndAutoParagraphToAllowedPosition(t);e||(e=this._checkAndSplitToAllowedPosition(t),e)?(this._appendToFragment(t),this._firstNode||(this._firstNode=t),this._lastNode=t):this._handleDisallowedNode(t)}_insertPartialFragment(){if(this._documentFragment.isEmpty)return;const t=zh.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position),this._documentFragment.getChild(0)==this._firstNode&&(this.writer.insert(this._firstNode,this.position),this._mergeOnLeft(),this.position=t.toPosition()),this._documentFragment.isEmpty||this.writer.insert(this._documentFragment,this.position),this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0),this.position=t.toPosition(),t.detach()}_handleObject(t){this._checkAndSplitToAllowedPosition(t)?this._appendToFragment(t):this._tryAutoparagraphing(t)}_handleDisallowedNode(t){t.is("element")?this.handleNodes(t.getChildren()):this._tryAutoparagraphing(t)}_appendToFragment(t){if(!this.schema.checkChild(this.position,t))throw new b("insertcontent-wrong-position",this,{node:t,position:this.position});this.writer.insert(t,this._documentFragmentPosition),this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(t.offsetSize),this.schema.isObject(t)&&!this.schema.checkChild(this.position,"$text")?this._nodeToSelect=t:this._nodeToSelect=null,this._filterAttributesOf.push(t)}_setAffectedBoundaries(t){this._affectedStart||(this._affectedStart=zh.fromPosition(t,"toPrevious")),this._affectedEnd&&!this._affectedEnd.isBefore(t)||(this._affectedEnd&&this._affectedEnd.detach(),this._affectedEnd=zh.fromPosition(t,"toNext"))}_mergeOnLeft(){const t=this._firstNode;if(!(t instanceof Sl))return;if(!this._canMergeLeft(t))return;const e=zh._createBefore(t);e.stickiness="toNext";const n=zh.fromPosition(this.position,"toNext");this._affectedStart.isEqual(e)&&(this._affectedStart.detach(),this._affectedStart=zh._createAt(e.nodeBefore,"end","toPrevious")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode&&(this._affectedEnd.detach(),this._affectedEnd=zh._createAt(e.nodeBefore,"end","toNext")),this.position=n.toPosition(),n.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_mergeOnRight(){const t=this._lastNode;if(!(t instanceof Sl))return;if(!this._canMergeRight(t))return;const e=zh._createAfter(t);if(e.stickiness="toNext",!this.position.isEqual(e))throw new b("insertcontent-invalid-insertion-position",this);this.position=Pl._createAt(e.nodeBefore,"end");const n=zh.fromPosition(this.position,"toPrevious");this._affectedEnd.isEqual(e)&&(this._affectedEnd.detach(),this._affectedEnd=zh._createAt(e.nodeBefore,"end","toNext")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode&&(this._affectedStart.detach(),this._affectedStart=zh._createAt(e.nodeBefore,0,"toPrevious")),this.position=n.toPosition(),n.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_canMergeLeft(t){const e=t.previousSibling;return e instanceof Sl&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(e,t)}_canMergeRight(t){const e=t.nextSibling;return e instanceof Sl&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(t,e)}_tryAutoparagraphing(t){const e=this.writer.createElement("paragraph");this._getAllowedIn(this.position.parent,e)&&this.schema.checkChild(e,t)&&(e._appendChild(t),this._handleNode(e))}_checkAndAutoParagraphToAllowedPosition(t){if(this.schema.checkChild(this.position.parent,t))return!0;if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",t))return!1;this._insertPartialFragment();const e=this.writer.createElement("paragraph");return this.writer.insert(e,this.position),this._setAffectedBoundaries(this.position),this._lastAutoParagraph=e,this.position=this.writer.createPositionAt(e,0),!0}_checkAndSplitToAllowedPosition(t){const e=this._getAllowedIn(this.position.parent,t);if(!e)return!1;for(e!=this.position.parent&&this._insertPartialFragment();e!=this.position.parent;)if(this.position.isAtStart){const t=this.position.parent;this.position=this.writer.createPositionBefore(t),t.isEmpty&&t.parent===e&&this.writer.remove(t)}else if(this.position.isAtEnd)this.position=this.writer.createPositionAfter(this.position.parent);else{const t=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position),this.writer.split(this.position),this.position=t,this.canMergeWith.add(this.position.nodeAfter)}return!0}_getAllowedIn(t,e){return this.schema.checkChild(t,e)?t:this.schema.isLimit(t)?null:this._getAllowedIn(t.parent,e)}}function fu(t,e,n="auto"){const o=t.getSelectedElement();if(o&&e.schema.isObject(o)&&!e.schema.isInline(o))return"before"==n||"after"==n?e.createRange(e.createPositionAt(o,n)):e.createRangeOn(o);const i=lr(t.getSelectedBlocks());if(!i)return e.createRange(t.focus);if(i.isEmpty)return e.createRange(e.createPositionAt(i,0));const r=e.createPositionAfter(i);return t.focus.isTouching(r)?e.createRange(r):e.createRange(e.createPositionBefore(i))}function ku(t,e,n,o,i={}){if(!t.schema.isObject(e))throw new b("insertobject-element-not-an-object",t,{object:e});let r;r=n?n instanceof $l||n instanceof nd?n:t.createSelection(n,o):t.document.selection;let s=r;i.findOptimalPosition&&t.schema.isBlock(e)&&(s=t.createSelection(fu(r,t,i.findOptimalPosition)));const a=lr(r.getSelectedBlocks()),c={};return a&&Object.assign(c,t.schema.getAttributesWithProperty(a,"copyOnReplace",!0)),t.change((n=>{s.isCollapsed||t.deleteContent(s,{doNotAutoparagraph:!0});let o=e;const r=s.anchor.parent;!t.schema.checkChild(r,e)&&t.schema.checkChild(r,"paragraph")&&t.schema.checkChild("paragraph",e)&&(o=n.createElement("paragraph"),n.insert(e,o)),t.schema.setAllowedAttributes(o,c,n);const a=t.insertContent(o,s);return a.isCollapsed||i.setSelection&&function(t,e,n,o){const i=t.model;if("on"==n)return void t.setSelection(e,"on");if("after"!=n)throw new b("insertobject-invalid-place-parameter-value",i);let r=e.nextSibling;if(i.schema.isInline(e))return void t.setSelection(e,"after");const s=r&&i.schema.checkChild(r,"$text");!s&&i.schema.checkChild(e.parent,"paragraph")&&(r=t.createElement("paragraph"),i.schema.setAllowedAttributes(r,o,t),i.insertContent(r,t.createPositionAfter(e)));r&&t.setSelection(r,0)}(n,e,i.setSelection,c),a}))}const bu=' ,.?!:;"-()';function wu(t,e){const{isForward:n,walker:o,unit:i,schema:r,treatEmojiAsSingleUnit:s}=t,{type:a,item:c,nextPosition:l}=e;if("text"==a)return"word"===t.unit?function(t,e){let n=t.position.textNode;n||(n=e?t.position.nodeAfter:t.position.nodeBefore);for(;n&&n.is("$text");){const o=t.position.offset-n.startOffset;if(Cu(n,o,e))n=e?t.position.nodeAfter:t.position.nodeBefore;else{if(Au(n.data,o,e))break;t.next()}}return t.position}(o,n):function(t,e,n){const o=t.position.textNode;if(o){const i=o.data;let r=t.position.offset-o.startOffset;for(;mr(i,r)||"character"==e&&pr(i,r)||n&&kr(i,r);)t.next(),r=t.position.offset-o.startOffset}return t.position}(o,i,s);if(a==(n?"elementStart":"elementEnd")){if(r.isSelectable(c))return Pl._createAt(c,n?"after":"before");if(r.checkChild(l,"$text"))return l}else{if(r.isLimit(c))return void o.skip((()=>!0));if(r.checkChild(l,"$text"))return l}}function _u(t,e){const n=t.root,o=Pl._createAt(n,e?"end":0);return e?new Fl(t,o):new Fl(o,t)}function Au(t,e,n){const o=e+(n?0:-1);return bu.includes(t.charAt(o))}function Cu(t,e,n){return e===(n?t.offsetSize:0)}class vu extends(W()){constructor(){super(),this.markers=new Yh,this.document=new Gh(this),this.schema=new Ld,this._pendingChanges=[],this._currentWriter=null,["insertContent","insertObject","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach((t=>this.decorate(t))),this.on("applyOperation",((t,e)=>{e[0]._validate()}),{priority:"highest"}),this.schema.register("$root",{isLimit:!0}),this.schema.register("$container",{allowIn:["$root","$container"]}),this.schema.register("$block",{allowIn:["$root","$container"],isBlock:!0}),this.schema.register("$blockObject",{allowWhere:"$block",isBlock:!0,isObject:!0}),this.schema.register("$inlineObject",{allowWhere:"$text",allowAttributesOf:"$text",isInline:!0,isObject:!0}),this.schema.register("$text",{allowIn:"$block",isInline:!0,isContent:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$documentFragment",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$marker"),this.schema.addChildCheck(((t,e)=>{if("$marker"===e.name)return!0})),iu(this),this.document.registerPostFixer(Cd)}change(t){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new Rh,callback:t}),this._runPendingChanges()[0]):t(this._currentWriter)}catch(t){b.rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{t?"function"==typeof t?(e=t,t=new Rh):t instanceof Rh||(t=new Rh(t)):t=new Rh,this._pendingChanges.push({batch:t,callback:e}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(t){b.rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,n){return function(t,e,n,o){return t.change((i=>{let r;r=n?n instanceof $l||n instanceof nd?n:i.createSelection(n,o):t.document.selection,r.isCollapsed||t.deleteContent(r,{doNotAutoparagraph:!0});const s=new pu(t,i,r.anchor),a=[];let c;if(e.is("documentFragment")){if(e.markers.size){const t=[];for(const[n,o]of e.markers){const{start:e,end:i}=o,r=e.isEqual(i);t.push({position:e,name:n,isCollapsed:r},{position:i,name:n,isCollapsed:r})}t.sort((({position:t},{position:e})=>t.isBefore(e)?1:-1));for(const{position:n,name:o,isCollapsed:r}of t){let t=null,s=null;const c=n.parent===e&&n.isAtStart,l=n.parent===e&&n.isAtEnd;c||l?r&&(s=c?"start":"end"):(t=i.createElement("$marker"),i.insert(t,n)),a.push({name:o,element:t,collapsed:s})}}c=e.getChildren()}else c=[e];s.handleNodes(c);let l=s.getSelectionRange();if(e.is("documentFragment")&&a.length){const t=l?Jl.fromRange(l):null,e={};for(let t=a.length-1;t>=0;t--){const{name:n,element:o,collapsed:r}=a[t],c=!e[n];if(c&&(e[n]=[]),o){const t=i.createPositionAt(o,"before");e[n].push(t),i.remove(o)}else{const t=s.getAffectedRange();if(!t){r&&e[n].push(s.position);continue}r?e[n].push(t[r]):e[n].push(c?t.start:t.end)}}for(const[t,[n,o]]of Object.entries(e))n&&o&&n.root===o.root&&i.addMarker(t,{usingOperation:!0,affectsData:!0,range:new Fl(n,o)});t&&(l=t.toRange(),t.detach())}l&&(r instanceof nd?i.setSelection(l):r.setTo(l));const d=s.getAffectedRange()||t.createRange(r.anchor);return s.destroy(),d}))}(this,t,e,n)}insertObject(t,e,n,o){return ku(this,t,e,n,o)}deleteContent(t,e){cu(this,t,e)}modifySelection(t,e){!function(t,e,n={}){const o=t.schema,i="backward"!=n.direction,r=n.unit?n.unit:"character",s=!!n.treatEmojiAsSingleUnit,a=e.focus,c=new Nl({boundaries:_u(a,i),singleCharacters:!0,direction:i?"forward":"backward"}),l={walker:c,schema:o,isForward:i,unit:r,treatEmojiAsSingleUnit:s};let d;for(;d=c.next();){if(d.done)return;const n=wu(l,d.value);if(n)return void(e instanceof nd?t.change((t=>{t.setSelectionFocus(n)})):e.setFocus(n))}}(this,t,e)}getSelectedContent(t){return function(t,e){return t.change((t=>{const n=t.createDocumentFragment(),o=e.getFirstRange();if(!o||o.isCollapsed)return n;const i=o.start.root,r=o.start.getCommonPath(o.end),s=i.getNodeByPath(r);let a;a=o.start.parent==o.end.parent?o:t.createRange(t.createPositionAt(s,o.start.path[r.length]),t.createPositionAt(s,o.end.path[r.length]+1));const c=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:!0}))e.is("$textProxy")?t.appendText(e.data,e.getAttributes(),n):t.append(t.cloneElement(e,!0),n);if(a!=o){const e=o._getTransformedByMove(a.start,t.createPositionAt(n,0),c)[0],i=t.createRange(t.createPositionAt(n,0),e.start);mu(t.createRange(e.end,t.createPositionAt(n,"end")),t),mu(i,t)}return n}))}(this,t)}hasContent(t,e={}){const n=t instanceof Fl?t:Fl._createIn(t);if(n.isCollapsed)return!1;const{ignoreWhitespaces:o=!1,ignoreMarkers:i=!1}=e;if(!i)for(const t of this.markers.getMarkersIntersectingRange(n))if(t.affectsData)return!0;for(const t of n.getItems())if(this.schema.isContent(t)){if(!t.is("$textProxy"))return!0;if(!o)return!0;if(-1!==t.data.search(/\S/))return!0}return!1}createPositionFromPath(t,e,n){return new Pl(t,e,n)}createPositionAt(t,e){return Pl._createAt(t,e)}createPositionAfter(t){return Pl._createAfter(t)}createPositionBefore(t){return Pl._createBefore(t)}createRange(t,e){return new Fl(t,e)}createRangeIn(t){return Fl._createIn(t)}createRangeOn(t){return Fl._createOn(t)}createSelection(...t){return new $l(...t)}createBatch(t){return new Rh(t)}createOperationFromJSON(t){return vh.fromJSON(t,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const t=[];this.fire("_beforeChanges");try{for(;this._pendingChanges.length;){const e=this._pendingChanges[0].batch;this._currentWriter=new Jh(this,e);const n=this._pendingChanges[0].callback(this._currentWriter);t.push(n),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}}finally{this._pendingChanges.length=0,this._currentWriter=null,this.fire("_afterChanges")}return t}}class yu extends uc{constructor(t){super(t),this.domEventType="click"}onDomEvent(t){this.fire(t.type,t)}}class xu extends uc{constructor(t){super(t),this.domEventType=["mousedown","mouseup","mouseover","mouseout"]}onDomEvent(t){this.fire(t.type,t)}}class Eu{constructor(t){this.document=t}createDocumentFragment(t){return new xa(this.document,t)}createElement(t,e,n){return new Ys(this.document,t,e,n)}createText(t){return new Fr(this.document,t)}clone(t,e=!1){return t._clone(e)}appendChild(t,e){return e._appendChild(t)}insertChild(t,e,n){return n._insertChild(t,e)}removeChildren(t,e,n){return n._removeChildren(t,e)}remove(t){const e=t.parent;return e?this.removeChildren(e.getChildIndex(t),1,e):[]}replace(t,e){const n=t.parent;if(n){const o=n.getChildIndex(t);return this.removeChildren(o,1,n),this.insertChild(o,e,n),!0}return!1}unwrapElement(t){const e=t.parent;if(e){const n=e.getChildIndex(t);this.remove(t),this.insertChild(n,t.getChildren(),e)}}rename(t,e){const n=new Ys(this.document,t,e.getAttributes(),e.getChildren());return this.replace(e,n)?n:null}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){Dt(t)&&void 0===n?e._setStyle(t):n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}createPositionAt(t,e){return na._createAt(t,e)}createPositionAfter(t){return na._createAfter(t)}createPositionBefore(t){return na._createBefore(t)}createRange(t,e){return new oa(t,e)}createRangeOn(t){return oa._createOn(t)}createRangeIn(t){return oa._createIn(t)}createSelection(...t){return new ra(...t)}}new Set(["black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","orange","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","activeborder","activecaption","appworkspace","background","buttonface","buttonhighlight","buttonshadow","buttontext","captiontext","graytext","highlight","highlighttext","inactiveborder","inactivecaption","inactivecaptiontext","infobackground","infotext","menu","menutext","scrollbar","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","window","windowframe","windowtext","rebeccapurple","currentcolor","transparent"]);class Du{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const n=this.get(t);if(!n)throw new b("commandcollection-command-not-found",this,{commandName:t});return n.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands())t.destroy()}}class Iu extends hr{constructor(t){super(),this.editor=t}set(t,e,n={}){if("string"==typeof e){const t=e;e=(e,n)=>{this.editor.execute(t),n()}}super.set(t,e,n)}}class Tu extends(W()){constructor(t={}){super();const e=this.constructor,n=t.language||e.defaultConfig&&e.defaultConfig.language;this._context=t.context||new yr({language:n}),this._context._addEditor(this,!t.context);const o=Array.from(e.builtinPlugins||[]);this.config=new li(t,e.defaultConfig),this.config.define("plugins",o),this.config.define(this._context._getEditorConfig()),this.plugins=new vr(this,o,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this._readOnlyLocks=new Set,this.commands=new Du,this.set("state","initializing"),this.once("ready",(()=>this.state="ready"),{priority:"high"}),this.once("destroy",(()=>this.state="destroyed"),{priority:"high"}),this.model=new vu;const i=new qs;this.data=new th(this.model,i),this.editing=new Nd(this.model,i),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new eh([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher),this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher),this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher),this.keystrokes=new Iu(this),this.keystrokes.listenTo(this.editing.view.document)}get isReadOnly(){return this._readOnlyLocks.size>0}set isReadOnly(t){throw new b("editor-isreadonly-has-no-setter")}enableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new b("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)||(this._readOnlyLocks.add(t),1===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!0,!1))}disableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new b("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)&&(this._readOnlyLocks.delete(t),0===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!1,!0))}initPlugins(){const t=this.config,e=t.get("plugins"),n=t.get("removePlugins")||[],o=t.get("extraPlugins")||[],i=t.get("substitutePlugins")||[];return this.plugins.init(e.concat(o),n,i)}destroy(){let t=Promise.resolve();return"initializing"==this.state&&(t=new Promise((t=>this.once("ready",t)))),t.then((()=>{this.fire("destroy"),this.stopListening(),this.commands.destroy()})).then((()=>this.plugins.destroy())).then((()=>{this.model.destroy(),this.data.destroy(),this.editing.destroy(),this.keystrokes.destroy()})).then((()=>this._context._removeEditor(this)))}execute(t,...e){try{return this.commands.execute(t,...e)}catch(t){b.rethrowUnexpectedError(t,this)}}focus(){this.editing.view.focus()}}function Mu(t){return class extends t{setData(t){this.data.set(t)}getData(t){return this.data.get(t)}}}{const t=Mu(Object);Mu.setData=t.prototype.setData,Mu.getData=t.prototype.getData}function Su(t){return class extends t{updateSourceElement(t=this.data.get()){if(!this.sourceElement)throw new b("editor-missing-sourceelement",this);const e=this.config.get("updateSourceElementOnDestroy"),n=this.sourceElement instanceof HTMLTextAreaElement;Mi(this.sourceElement,e||n?t:"")}}}Su.updateSourceElement=Su(Object).prototype.updateSourceElement;class Nu extends xr{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new cr({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(t){if("string"!=typeof t)throw new b("pendingactions-add-invalid-message",this);const e=new(W());return e.set("message",t),this._actions.add(e),this.hasAny=!0,e}remove(t){this._actions.remove(t),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}const Bu={bold:'',cancel:'',caption:'',check:'',cog:'',eraser:'',image:'',lowVision:'',importExport:'',paragraph:'',plus:'',text:'',alignBottom:'',alignMiddle:'',alignTop:'',alignLeft:'',alignCenter:'',alignRight:'',alignJustify:'',objectLeft:'',objectCenter:'',objectRight:'',objectFullWidth:'',objectInline:'',objectBlockLeft:'',objectBlockRight:'',objectSizeFull:'',objectSizeLarge:'',objectSizeSmall:'',objectSizeMedium:'',pencil:'',pilcrow:'',quote:'',threeVerticalDots:''};function Pu({emitter:t,activator:e,callback:n,contextElements:o}){t.listenTo(document,"mousedown",((t,i)=>{if(!e())return;const r="function"==typeof i.composedPath?i.composedPath():[],s="function"==typeof o?o():o;for(const t of s)if(t.contains(i.target)||r.includes(t))return;n()}))}function zu(t){const e=t;e.set("_isCssTransitionsDisabled",!1),e.disableCssTransitions=()=>{e._isCssTransitionsDisabled=!0},e.enableCssTransitions=()=>{e._isCssTransitionsDisabled=!1},e.extendTemplate({attributes:{class:[e.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}function Lu({view:t}){t.listenTo(t.element,"submit",((e,n)=>{n.preventDefault(),t.fire("submit")}),{useCapture:!0})}class Ou extends cr{constructor(t=[]){super(t,{idProperty:"viewUid"}),this.on("add",((t,e,n)=>{this._renderViewIntoCollectionParent(e,n)})),this.on("remove",((t,e)=>{e.element&&this._parentElement&&e.element.remove()})),this._parentElement=null}destroy(){this.map((t=>t.destroy()))}setParent(t){this._parentElement=t;for(const t of this)this._renderViewIntoCollectionParent(t)}delegate(...t){if(!t.length||!t.every((t=>"string"==typeof t)))throw new b("ui-viewcollection-delegate-wrong-events",this);return{to:e=>{for(const n of this)for(const o of t)n.delegate(o).to(e);this.on("add",((n,o)=>{for(const n of t)o.delegate(n).to(e)})),this.on("remove",((n,o)=>{for(const n of t)o.stopDelegating(n,e)}))}}}_renderViewIntoCollectionParent(t,e){t.isRendered||t.render(),t.element&&this._parentElement&&this._parentElement.insertBefore(t.element,this._parentElement.children[e])}}var Ru=n(4793),ju={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Ru.Z,ju);Ru.Z.locals;class Fu extends(pi(W())){constructor(t){super(),this.element=null,this.isRendered=!1,this.locale=t,this.t=t&&t.t,this._viewCollections=new cr,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",((e,n)=>{n.locale=t,n.t=t&&t.t})),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=Vu.bind(this,this)}createCollection(t){const e=new Ou(t);return this._viewCollections.add(e),e}registerChild(t){J(t)||(t=[t]);for(const e of t)this._unboundChildren.add(e)}deregisterChild(t){J(t)||(t=[t]);for(const e of t)this._unboundChildren.remove(e)}setTemplate(t){this.template=new Vu(t)}extendTemplate(t){Vu.extend(this.template,t)}render(){if(this.isRendered)throw new b("ui-view-render-already-rendered",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map((t=>t.destroy())),this.template&&this.template._revertData&&this.template.revert(this.element)}}class Vu extends(T()){constructor(t){super(),Object.assign(this,Zu(Qu(t))),this._isRendered=!1,this._revertData=null}render(){const t=this._renderNode({intoFragment:!0});return this._isRendered=!0,t}apply(t){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:t,intoFragment:!1,isApplying:!0,revertData:this._revertData}),t}revert(t){if(!this._revertData)throw new b("ui-template-revert-not-applied",[this,t]);this._revertTemplateFromNode(t,this._revertData)}*getViews(){yield*function*t(e){if(e.children)for(const n of e.children)og(n)?yield n:ig(n)&&(yield*t(n))}(this)}static bind(t,e){return{to:(n,o)=>new Uu({eventNameOrFunction:n,attribute:n,observable:t,emitter:e,callback:o}),if:(n,o,i)=>new Wu({observable:t,emitter:e,attribute:n,valueIfTrue:o,callback:i})}}static extend(t,e){if(t._isRendered)throw new b("template-extend-render",[this,t]);eg(t,Zu(Qu(e)))}_renderNode(t){let e;if(e=t.node?this.tag&&this.text:this.tag?this.text:!this.text,e)throw new b("ui-template-wrong-syntax",this);return this.text?this._renderText(t):this._renderElement(t)}_renderElement(t){let e=t.node;return e||(e=t.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(t),this._renderElementChildren(t),this._setUpListeners(t),e}_renderText(t){let e=t.node;return e?t.revertData.text=e.textContent:e=t.node=document.createTextNode(""),qu(this.text)?this._bindToObservable({schema:this.text,updater:$u(e),data:t}):e.textContent=this.text.join(""),e}_renderAttributes(t){if(!this.attributes)return;const e=t.node,n=t.revertData;for(const o in this.attributes){const i=e.getAttribute(o),r=this.attributes[o];n&&(n.attributes[o]=i);const s=sg(r)?r[0].ns:null;if(qu(r)){const a=sg(r)?r[0].value:r;n&&ag(o)&&a.unshift(i),this._bindToObservable({schema:a,updater:Yu(e,o,s),data:t})}else if("style"==o&&"string"!=typeof r[0])this._renderStyleAttribute(r[0],t);else{n&&i&&ag(o)&&r.unshift(i);const t=r.map((t=>t&&t.value||t)).reduce(((t,e)=>t.concat(e)),[]).reduce(Xu,"");ng(t)||e.setAttributeNS(s,o,t)}}}_renderStyleAttribute(t,e){const n=e.node;for(const o in t){const i=t[o];qu(i)?this._bindToObservable({schema:[i],updater:Ku(n,o),data:e}):n.style[o]=i}}_renderElementChildren(t){const e=t.node,n=t.intoFragment?document.createDocumentFragment():e,o=t.isApplying;let i=0;for(const r of this.children)if(rg(r)){if(!o){r.setParent(e);for(const t of r)n.appendChild(t.element)}}else if(og(r))o||(r.isRendered||r.render(),n.appendChild(r.element));else if(ui(r))n.appendChild(r);else if(o){const e={children:[],bindings:[],attributes:{}};t.revertData.children.push(e),r._renderNode({intoFragment:!1,node:n.childNodes[i++],isApplying:!0,revertData:e})}else n.appendChild(r.render());t.intoFragment&&e.appendChild(n)}_setUpListeners(t){if(this.eventListeners)for(const e in this.eventListeners){const n=this.eventListeners[e].map((n=>{const[o,i]=e.split("@");return n.activateDomEventListener(o,i,t)}));t.revertData&&t.revertData.bindings.push(n)}}_bindToObservable({schema:t,updater:e,data:n}){const o=n.revertData;Gu(t,e,n);const i=t.filter((t=>!ng(t))).filter((t=>t.observable)).map((o=>o.activateAttributeListener(t,e,n)));o&&o.bindings.push(i)}_revertTemplateFromNode(t,e){for(const t of e.bindings)for(const e of t)e();if(e.text)return void(t.textContent=e.text);const n=t;for(const t in e.attributes){const o=e.attributes[t];null===o?n.removeAttribute(t):n.setAttribute(t,o)}for(let t=0;tGu(t,e,n);return this.emitter.listenTo(this.observable,`change:${this.attribute}`,o),()=>{this.emitter.stopListening(this.observable,`change:${this.attribute}`,o)}}}class Uu extends Hu{constructor(t){super(t),this.eventNameOrFunction=t.eventNameOrFunction}activateDomEventListener(t,e,n){const o=(t,n)=>{e&&!n.target.matches(e)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(n):this.observable.fire(this.eventNameOrFunction,n))};return this.emitter.listenTo(n.node,t,o),()=>{this.emitter.stopListening(n.node,t,o)}}}class Wu extends Hu{constructor(t){super(t),this.valueIfTrue=t.valueIfTrue}getValue(t){return!ng(super.getValue(t))&&(this.valueIfTrue||!0)}}function qu(t){return!!t&&(t.value&&(t=t.value),Array.isArray(t)?t.some(qu):t instanceof Hu)}function Gu(t,e,{node:n}){const o=function(t,e){return t.map((t=>t instanceof Hu?t.getValue(e):t))}(t,n);let i;i=1==t.length&&t[0]instanceof Wu?o[0]:o.reduce(Xu,""),ng(i)?e.remove():e.set(i)}function $u(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function Yu(t,e,n){return{set(o){t.setAttributeNS(n,e,o)},remove(){t.removeAttributeNS(n,e)}}}function Ku(t,e){return{set(n){t.style[e]=n},remove(){t.style[e]=null}}}function Qu(t){return ai(t,(t=>{if(t&&(t instanceof Hu||ig(t)||og(t)||rg(t)))return t}))}function Zu(t){if("string"==typeof t?t=function(t){return{text:[t]}}(t):t.text&&function(t){t.text=or(t.text)}(t),t.on&&(t.eventListeners=function(t){for(const e in t)Ju(t,e);return t}(t.on),delete t.on),!t.text){t.attributes&&function(t){for(const e in t)t[e].value&&(t[e].value=or(t[e].value)),Ju(t,e)}(t.attributes);const e=[];if(t.children)if(rg(t.children))e.push(t.children);else for(const n of t.children)ig(n)||og(n)||ui(n)?e.push(n):e.push(new Vu(n));t.children=e}return t}function Ju(t,e){t[e]=or(t[e])}function Xu(t,e){return ng(e)?t:ng(t)?e:`${t} ${e}`}function tg(t,e){for(const n in e)t[n]?t[n].push(...e[n]):t[n]=e[n]}function eg(t,e){if(e.attributes&&(t.attributes||(t.attributes={}),tg(t.attributes,e.attributes)),e.eventListeners&&(t.eventListeners||(t.eventListeners={}),tg(t.eventListeners,e.eventListeners)),e.text&&t.text.push(...e.text),e.children&&e.children.length){if(t.children.length!=e.children.length)throw new b("ui-template-extend-children-mismatch",t);let n=0;for(const o of e.children)eg(t.children[n++],o)}}function ng(t){return!t&&0!==t}function og(t){return t instanceof Fu}function ig(t){return t instanceof Vu}function rg(t){return t instanceof Ou}function sg(t){return O(t[0])&&t[0].ns}function ag(t){return"class"==t||"style"==t}class cg extends Ou{constructor(t,e=[]){super(e),this.locale=t}attachToDom(){this._bodyCollectionContainer=new Vu({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");t||(t=bt(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(t)),t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const t=document.querySelector(".ck-body-wrapper");t&&0==t.childElementCount&&t.remove()}}var lg=n(6574),dg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(lg.Z,dg);lg.Z.locals;class hg extends Fu{constructor(){super();const t=this.bindTemplate;this.set("content",""),this.set("viewBox","0 0 20 20"),this.set("fillColor",""),this.set("isColorInherited",!0),this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon","ck-reset_all-excluded",t.if("isColorInherited","ck-icon_inherit-color")],viewBox:t.to("viewBox")}})}render(){super.render(),this._updateXMLContent(),this._colorFillPaths(),this.on("change:content",(()=>{this._updateXMLContent(),this._colorFillPaths()})),this.on("change:fillColor",(()=>{this._colorFillPaths()}))}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),e=t.getAttribute("viewBox");e&&(this.viewBox=e);for(const{name:e,value:n}of Array.from(t.attributes))hg.presentationalAttributeNames.includes(e)&&this.element.setAttribute(e,n);for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);for(;t.childNodes.length>0;)this.element.appendChild(t.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach((t=>{t.style.fill=this.fillColor}))}}hg.presentationalAttributeNames=["alignment-baseline","baseline-shift","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-rendering","cursor","direction","display","dominant-baseline","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","image-rendering","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","mask","opacity","overflow","paint-order","pointer-events","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-overflow","text-rendering","transform","unicode-bidi","vector-effect","visibility","white-space","word-spacing","writing-mode"];var ug=n(4906),gg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(ug.Z,gg);ug.Z.locals;class mg extends Fu{constructor(t){super(t);const e=this.bindTemplate,n=m();this.set("class",void 0),this.set("labelStyle",void 0),this.set("icon",void 0),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isVisible",!0),this.set("isToggleable",!1),this.set("keystroke",void 0),this.set("label",void 0),this.set("tabindex",-1),this.set("tooltip",!1),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.set("withKeystroke",!1),this.children=this.createCollection(),this.labelView=this._createLabelView(n),this.iconView=new hg,this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}}),this.keystrokeView=this._createKeystrokeView(),this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this));const o={tag:"button",attributes:{class:["ck","ck-button",e.to("class"),e.if("isEnabled","ck-disabled",(t=>!t)),e.if("isVisible","ck-hidden",(t=>!t)),e.to("isOn",(t=>t?"ck-on":"ck-off")),e.if("withText","ck-button_with-text"),e.if("withKeystroke","ck-button_with-keystroke")],type:e.to("type",(t=>t||"button")),tabindex:e.to("tabindex"),"aria-labelledby":`ck-editor__aria-label_${n}`,"aria-disabled":e.if("isEnabled",!0,(t=>!t)),"aria-pressed":e.to("isOn",(t=>!!this.isToggleable&&String(!!t))),"data-cke-tooltip-text":e.to("_tooltipString"),"data-cke-tooltip-position":e.to("tooltipPosition")},children:this.children,on:{click:e.to((t=>{this.isEnabled?this.fire("execute"):t.preventDefault()}))}};i.isSafari&&(o.on.mousedown=e.to((t=>{this.focus(),t.preventDefault()}))),this.setTemplate(o)}render(){super.render(),this.icon&&(this.iconView.bind("content").to(this,"icon"),this.children.add(this.iconView)),this.children.add(this.labelView),this.withKeystroke&&this.keystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}_createLabelView(t){const e=new Fu,n=this.bindTemplate;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:n.to("labelStyle"),id:`ck-editor__aria-label_${t}`},children:[{text:this.bindTemplate.to("label")}]}),e}_createKeystrokeView(){const t=new Fu;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",(t=>er(t)))}]}),t}_getTooltipString(t,e,n){return t?"string"==typeof t?t:(n&&(n=er(n)),t instanceof Function?t(e,n):`${e}${n?` (${n})`:""}`):""}}var pg=n(5332),fg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(pg.Z,fg);pg.Z.locals;class kg extends mg{constructor(t){super(t),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new Fu;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),t}}var bg=n(6781),wg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(bg.Z,wg);bg.Z.locals;class _g{constructor(t){this.editor=t,this._components=new Map}*names(){for(const t of this._components.values())yield t.originalName}add(t,e){this._components.set(Ag(t),{callback:e,originalName:t})}create(t){if(!this.has(t))throw new b("componentfactory-item-missing",this,{name:t});return this._components.get(Ag(t)).callback(this.editor.locale)}has(t){return this._components.has(Ag(t))}}function Ag(t){return String(t).toLowerCase()}var Cg=n(5485),vg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Cg.Z,vg);Cg.Z.locals;class yg extends Fu{constructor(t,e,n){super(t);const o=this.bindTemplate;this.buttonView=e,this.panelView=n,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class",void 0),this.set("id",void 0),this.set("panelPosition","auto"),this.keystrokes=new hr,this.focusTracker=new dr,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",o.to("class"),o.if("isEnabled","ck-disabled",(t=>!t))],id:o.to("id"),"aria-describedby":o.to("ariaDescribedById")},children:[e,n]}),e.extendTemplate({attributes:{class:["ck-dropdown__button"],"data-cke-tooltip-disabled":o.to("isOpen")}})}render(){super.render(),this.focusTracker.add(this.buttonView.element),this.focusTracker.add(this.panelView.element),this.listenTo(this.buttonView,"open",(()=>{this.isOpen=!this.isOpen})),this.panelView.bind("isVisible").to(this,"isOpen"),this.on("change:isOpen",((t,e,n)=>{n&&("auto"===this.panelPosition?this.panelView.position=yg._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions}).name:this.panelView.position=this.panelPosition)})),this.keystrokes.listenTo(this.element);const t=(t,e)=>{this.isOpen&&(this.isOpen=!1,e())};this.keystrokes.set("arrowdown",((t,e)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,e())})),this.keystrokes.set("arrowright",((t,e)=>{this.isOpen&&e()})),this.keystrokes.set("arrowleft",t),this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:t,north:e,southEast:n,southWest:o,northEast:i,northWest:r,southMiddleEast:s,southMiddleWest:a,northMiddleEast:c,northMiddleWest:l}=yg.defaultPanelPositions;return"rtl"!==this.locale.uiLanguageDirection?[n,o,s,a,t,i,r,c,l,e]:[o,n,a,s,t,r,i,l,c,e]}}yg.defaultPanelPositions={south:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/2,name:"s"}),southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),southMiddleEast:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/4,name:"sme"}),southMiddleWest:(t,e)=>({top:t.bottom,left:t.left-3*(e.width-t.width)/4,name:"smw"}),north:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/2,name:"n"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),northMiddleEast:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/4,name:"nme"}),northMiddleWest:(t,e)=>({top:t.top-e.height,left:t.left-3*(e.width-t.width)/4,name:"nmw"})},yg._getOptimalPosition=Li;const xg='';class Eg extends mg{constructor(t){super(t),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{"aria-haspopup":!0,"aria-expanded":this.bindTemplate.to("isOn",(t=>String(t)))}}),this.delegate("execute").to(this,"open")}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const t=new hg;return t.content=xg,t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),t}}var Dg=n(7686),Ig={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Dg.Z,Ig);Dg.Z.locals;class Tg extends Fu{constructor(t){super(t);const e=this.bindTemplate;this.set("class",void 0),this.set("labelStyle",void 0),this.set("icon",void 0),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isToggleable",!1),this.set("isVisible",!0),this.set("keystroke",void 0),this.set("withKeystroke",!1),this.set("label",void 0),this.set("tabindex",-1),this.set("tooltip",!1),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.children=this.createCollection(),this.actionView=this._createActionView(),this.arrowView=this._createArrowView(),this.keystrokes=new hr,this.focusTracker=new dr,this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",e.to("class"),e.if("isVisible","ck-hidden",(t=>!t)),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render(),this.children.add(this.actionView),this.children.add(this.arrowView),this.focusTracker.add(this.actionView.element),this.focusTracker.add(this.arrowView.element),this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",((t,e)=>{this.focusTracker.focusedElement===this.actionView.element&&(this.arrowView.focus(),e())})),this.keystrokes.set("arrowleft",((t,e)=>{this.focusTracker.focusedElement===this.arrowView.element&&(this.actionView.focus(),e())}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this.actionView.focus()}_createActionView(){const t=new mg;return t.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this),t.extendTemplate({attributes:{class:"ck-splitbutton__action"}}),t.delegate("execute").to(this),t}_createArrowView(){const t=new mg,e=t.bindTemplate;return t.icon=xg,t.extendTemplate({attributes:{class:["ck-splitbutton__arrow"],"data-cke-tooltip-disabled":e.to("isOn"),"aria-haspopup":!0,"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("isEnabled").to(this),t.bind("label").to(this),t.bind("tooltip").to(this),t.delegate("execute").to(this,"open"),t}}class Mg extends Fu{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",(t=>`ck-dropdown__panel_${t}`)),e.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:e.to((t=>t.preventDefault()))}})}focus(){if(this.children.length){const t=this.children.first;"function"==typeof t.focus?t.focus():w("ui-dropdown-panel-focus-child-missing-focus",{childView:this.children.first,dropdownPanel:this})}}focusLast(){if(this.children.length){const t=this.children.last;"function"==typeof t.focusLast?t.focusLast():t.focus()}}}class Sg{constructor(t){if(this.focusables=t.focusables,this.focusTracker=t.focusTracker,this.keystrokeHandler=t.keystrokeHandler,this.actions=t.actions,t.actions&&t.keystrokeHandler)for(const e in t.actions){let n=t.actions[e];"string"==typeof n&&(n=[n]);for(const o of n)t.keystrokeHandler.set(o,((t,n)=>{this[e](),n()}))}}get first(){return this.focusables.find(Ng)||null}get last(){return this.focusables.filter(Ng).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let t=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find(((e,n)=>{const o=e.element===this.focusTracker.focusedElement;return o&&(t=n),o})),t)}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(t){t&&t.focus()}_getFocusableItem(t){const e=this.current,n=this.focusables.length;if(!n)return null;if(null===e)return this[1===t?"first":"last"];let o=(e+n+t)%n;do{const e=this.focusables.get(o);if(Ng(e))return e;o=(o+n+t)%n}while(o!==e);return null}}function Ng(t){return!(!t.focus||!zi(t.element))}class Bg extends Fu{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class Pg extends Fu{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}function zg(t){return Array.isArray(t)?{items:t,removeItems:[]}:t?Object.assign({items:[],removeItems:[]},t):{items:[],removeItems:[]}}var Lg=n(5542),Og={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Lg.Z,Og);Lg.Z.locals;const{threeVerticalDots:Rg}=Bu,jg={alignLeft:Bu.alignLeft,bold:Bu.bold,importExport:Bu.importExport,paragraph:Bu.paragraph,plus:Bu.plus,text:Bu.text,threeVerticalDots:Bu.threeVerticalDots};class Fg extends Fu{constructor(t,e){super(t);const n=this.bindTemplate,o=this.t;this.options=e||{},this.set("ariaLabel",o("Editor toolbar")),this.set("maxWidth","auto"),this.items=this.createCollection(),this.focusTracker=new dr,this.keystrokes=new hr,this.set("class",void 0),this.set("isCompact",!1),this.itemsView=new Vg(t),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection();const i="rtl"===t.uiLanguageDirection;this._focusCycler=new Sg({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:[i?"arrowright":"arrowleft","arrowup"],focusNext:[i?"arrowleft":"arrowright","arrowdown"]}});const r=["ck","ck-toolbar",n.to("class"),n.if("isCompact","ck-toolbar_compact")];var s;this.options.shouldGroupWhenFull&&this.options.isFloating&&r.push("ck-toolbar_floating"),this.setTemplate({tag:"div",attributes:{class:r,role:"toolbar","aria-label":n.to("ariaLabel"),style:{maxWidth:n.to("maxWidth")}},children:this.children,on:{mousedown:(s=this,s.bindTemplate.to((t=>{t.target===s.element&&t.preventDefault()})))}}),this._behavior=this.options.shouldGroupWhenFull?new Ug(this):new Hg(this)}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element),this._behavior.render(this)}destroy(){return this._behavior.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy(),super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e,n){this.items.addMany(this._buildItemsFromConfig(t,e,n))}_buildItemsFromConfig(t,e,n){const o=zg(t),i=n||o.removeItems;return this._cleanItemsConfiguration(o.items,e,i).map((t=>O(t)?this._createNestedToolbarDropdown(t,e,i):"|"===t?new Bg:"-"===t?new Pg:e.create(t))).filter((t=>!!t))}_cleanItemsConfiguration(t,e,n){const o=t.filter(((t,o,i)=>"|"===t||-1===n.indexOf(t)&&("-"===t?!this.options.shouldGroupWhenFull||(w("toolbarview-line-break-ignored-when-grouping-items",i),!1):!(!O(t)&&!e.has(t))||(w("toolbarview-item-unavailable",{item:t}),!1))));return this._cleanSeparatorsAndLineBreaks(o)}_cleanSeparatorsAndLineBreaks(t){const e=t=>"-"!==t&&"|"!==t,n=t.length,o=t.findIndex(e);if(-1===o)return[];const i=n-t.slice().reverse().findIndex(e);return t.slice(o,i).filter(((t,n,o)=>{if(e(t))return!0;return!(n>0&&o[n-1]===t)}))}_createNestedToolbarDropdown(t,e,n){let{label:o,icon:i,items:r,tooltip:s=!0,withText:a=!1}=t;if(r=this._cleanItemsConfiguration(r,e,n),!r.length)return null;const c=Xg(this.locale);return o||w("toolbarview-nested-toolbar-dropdown-missing-label",t),c.class="ck-toolbar__nested-toolbar-dropdown",c.buttonView.set({label:o,tooltip:s,withText:!!a}),!1!==i?c.buttonView.icon=jg[i]||i||Rg:c.buttonView.withText=!0,tm(c,(()=>c.toolbarView._buildItemsFromConfig(r,e,n))),c}}class Vg extends Fu{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class Hg{constructor(t){const e=t.bindTemplate;t.set("isVertical",!1),t.itemsView.children.bindTo(t.items).using((t=>t)),t.focusables.bindTo(t.items).using((t=>t)),t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class Ug{constructor(t){this.view=t,this.viewChildren=t.children,this.viewFocusables=t.focusables,this.viewItemsView=t.itemsView,this.viewFocusTracker=t.focusTracker,this.viewLocale=t.locale,this.ungroupedItems=t.createCollection(),this.groupedItems=t.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),this.resizeObserver=null,this.cachedPadding=null,this.shouldUpdateGroupingOnNextResize=!1,t.itemsView.children.bindTo(this.ungroupedItems).using((t=>t)),this.ungroupedItems.on("change",this._updateFocusCycleableItems.bind(this)),t.children.on("change",this._updateFocusCycleableItems.bind(this)),t.items.on("change",((t,e)=>{const n=e.index,o=Array.from(e.added);for(const t of e.removed)n>=this.ungroupedItems.length?this.groupedItems.remove(t):this.ungroupedItems.remove(t);for(let t=n;tthis.ungroupedItems.length?this.groupedItems.add(e,t-this.ungroupedItems.length):this.ungroupedItems.add(e,t)}this._updateGrouping()})),t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element,this._enableGroupingOnResize(),this._enableGroupingOnMaxWidthChange(t)}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;if(!zi(this.viewElement))return void(this.shouldUpdateGroupingOnNextResize=!0);const t=this.groupedItems.length;let e;for(;this._areItemsOverflowing;)this._groupLastItem(),e=!0;if(!e&&this.groupedItems.length){for(;this.groupedItems.length&&!this._areItemsOverflowing;)this._ungroupFirstItem();this._areItemsOverflowing&&this._groupLastItem()}this.groupedItems.length!==t&&this.view.fire("groupedItemsUpdate")}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const t=this.viewElement,e=this.viewLocale.uiLanguageDirection,n=new xi(t.lastChild),o=new xi(t);if(!this.cachedPadding){const n=wi.window.getComputedStyle(t),o="ltr"===e?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(n[o])}return"ltr"===e?n.right>o.right-this.cachedPadding:n.left{t&&t===e.contentRect.width&&!this.shouldUpdateGroupingOnNextResize||(this.shouldUpdateGroupingOnNextResize=!1,this._updateGrouping(),t=e.contentRect.width)})),this._updateGrouping()}_enableGroupingOnMaxWidthChange(t){t.on("change:maxWidth",(()=>{this._updateGrouping()}))}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new Bg),this.viewChildren.add(this.groupedItemsDropdown),this.viewFocusTracker.add(this.groupedItemsDropdown.element)),this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)),this.groupedItems.length||(this.viewChildren.remove(this.groupedItemsDropdown),this.viewChildren.remove(this.viewChildren.last),this.viewFocusTracker.remove(this.groupedItemsDropdown.element))}_createGroupedItemsDropdown(){const t=this.viewLocale,e=t.t,n=Xg(t);return n.class="ck-toolbar__grouped-dropdown",n.panelPosition="ltr"===t.uiLanguageDirection?"sw":"se",tm(n,this.groupedItems),n.buttonView.set({label:e("Show more items"),tooltip:!0,tooltipPosition:"rtl"===t.uiLanguageDirection?"se":"sw",icon:Rg}),n}_updateFocusCycleableItems(){this.viewFocusables.clear(),this.ungroupedItems.map((t=>{this.viewFocusables.add(t)})),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}var Wg=n(1046),qg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Wg.Z,qg);Wg.Z.locals;class Gg extends Fu{constructor(t){super(t);const e=this.bindTemplate;this.items=this.createCollection(),this.focusTracker=new dr,this.keystrokes=new hr,this._focusCycler=new Sg({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this.set("ariaLabel",void 0),this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"],"aria-label":e.to("ariaLabel")},children:this.items})}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}class $g extends Fu{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!0),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item",e.if("isVisible","ck-hidden",(t=>!t))]},children:this.children})}focus(){this.children.first.focus()}}class Yg extends Fu{constructor(t){super(t),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}var Kg=n(7339),Qg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Kg.Z,Qg);Kg.Z.locals;var Zg=n(3949),Jg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Zg.Z,Jg);Zg.Z.locals;function Xg(t,e=Eg){const n=new e(t),o=new Mg(t),i=new yg(t,n,o);return n.bind("isEnabled").to(i),n instanceof Tg?n.arrowView.bind("isOn").to(i,"isOpen"):n.bind("isOn").to(i,"isOpen"),function(t){(function(t){t.on("render",(()=>{Pu({emitter:t,activator:()=>t.isOpen,callback:()=>{t.isOpen=!1},contextElements:[t.element]})}))})(t),function(t){t.on("execute",(e=>{e.source instanceof kg||(t.isOpen=!1)}))}(t),function(t){t.focusTracker.on("change:isFocused",((e,n,o)=>{t.isOpen&&!o&&(t.isOpen=!1)}))}(t),function(t){t.keystrokes.set("arrowdown",((e,n)=>{t.isOpen&&(t.panelView.focus(),n())})),t.keystrokes.set("arrowup",((e,n)=>{t.isOpen&&(t.panelView.focusLast(),n())}))}(t),function(t){t.on("change:isOpen",((e,n,o)=>{if(o)return;const i=t.panelView.element;i&&i.contains(wi.document.activeElement)&&t.buttonView.focus()}))}(t),function(t){t.on("change:isOpen",((e,n,o)=>{o&&t.panelView.focus()}),{priority:"low"})}(t)}(i),i}function tm(t,e,n={}){t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),t.isOpen?em(t,e,n):t.once("change:isOpen",(()=>em(t,e,n)),{priority:"highest"}),n.enableActiveItemFocusOnDropdownOpen&&im(t,(()=>t.toolbarView.items.find((t=>t.isOn))))}function em(t,e,n){const o=t.locale,i=o.t,r=t.toolbarView=new Fg(o),s="function"==typeof e?e():e;r.ariaLabel=n.ariaLabel||i("Dropdown toolbar"),n.maxWidth&&(r.maxWidth=n.maxWidth),n.class&&(r.class=n.class),n.isCompact&&(r.isCompact=n.isCompact),n.isVertical&&(r.isVertical=!0),s instanceof Ou?r.items.bindTo(s).using((t=>t)):r.items.addMany(s),t.panelView.children.add(r),r.items.delegate("execute").to(t)}function nm(t,e,n={}){t.isOpen?om(t,e,n):t.once("change:isOpen",(()=>om(t,e,n)),{priority:"highest"}),im(t,(()=>t.listView.items.find((t=>t instanceof $g&&t.children.first.isOn))))}function om(t,e,n){const o=t.locale,i=t.listView=new Gg(o),r="function"==typeof e?e():e;i.ariaLabel=n.ariaLabel,i.items.bindTo(r).using((t=>{if("separator"===t.type)return new Yg(o);if("button"===t.type||"switchbutton"===t.type){const e=new $g(o);let n;return n="button"===t.type?new mg(o):new kg(o),n.bind(...Object.keys(t.model)).to(t.model),n.delegate("execute").to(e),e.children.add(n),e}return null})),t.panelView.children.add(i),i.items.delegate("execute").to(t)}function im(t,e){t.on("change:isOpen",(()=>{if(!t.isOpen)return;const n=e();n&&("function"==typeof n.focus?n.focus():w("ui-dropdown-focus-child-on-open-child-missing-focus",{view:n}))}),{priority:p.low-10})}var rm=n(8793),sm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(rm.Z,sm);rm.Z.locals;const am=Si("px"),cm=wi.document.body;class lm extends Fu{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class",void 0),this._pinWhenIsVisibleCallback=null,this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",(t=>`ck-balloon-panel_${t}`)),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",am),left:e.to("left",am)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(t){this.show();const e=lm.defaultPositions,n=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthMiddleWest,e.southArrowNorthMiddleEast,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthMiddleWest,e.northArrowSouthMiddleEast,e.northArrowSouthWest,e.northArrowSouthEast,e.viewportStickyNorth],limiter:cm,fitInViewport:!0},t),o=lm._getOptimalPosition(n),i=parseInt(o.left),r=parseInt(o.top),s=o.name,a=o.config||{},{withArrow:c=!0}=a;this.top=r,this.left=i,this.position=s,this.withArrow=c}pin(t){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(t):this._stopPinning()},this._startPinning(t),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(t){this.attachTo(t);const e=dm(t.target),n=t.limiter?dm(t.limiter):cm;this.listenTo(wi.document,"scroll",((o,i)=>{const r=i.target,s=e&&r.contains(e),a=n&&r.contains(n);!s&&!a&&e&&n||this.attachTo(t)}),{useCapture:!0}),this.listenTo(wi.window,"resize",(()=>{this.attachTo(t)}))}_stopPinning(){this.stopListening(wi.document,"scroll"),this.stopListening(wi.window,"resize")}}function dm(t){return ci(t)?t:Ci(t)?t.commonAncestorContainer:"function"==typeof t?dm(t()):null}function hm(t={}){const{sideOffset:e=lm.arrowSideOffset,heightOffset:n=lm.arrowHeightOffset,stickyVerticalOffset:o=lm.stickyVerticalOffset,config:i}=t;return{northWestArrowSouthWest:(t,n)=>({top:r(t,n),left:t.left-e,name:"arrow_sw",...i&&{config:i}}),northWestArrowSouthMiddleWest:(t,n)=>({top:r(t,n),left:t.left-.25*n.width-e,name:"arrow_smw",...i&&{config:i}}),northWestArrowSouth:(t,e)=>({top:r(t,e),left:t.left-e.width/2,name:"arrow_s",...i&&{config:i}}),northWestArrowSouthMiddleEast:(t,n)=>({top:r(t,n),left:t.left-.75*n.width+e,name:"arrow_sme",...i&&{config:i}}),northWestArrowSouthEast:(t,n)=>({top:r(t,n),left:t.left-n.width+e,name:"arrow_se",...i&&{config:i}}),northArrowSouthWest:(t,n)=>({top:r(t,n),left:t.left+t.width/2-e,name:"arrow_sw",...i&&{config:i}}),northArrowSouthMiddleWest:(t,n)=>({top:r(t,n),left:t.left+t.width/2-.25*n.width-e,name:"arrow_smw",...i&&{config:i}}),northArrowSouth:(t,e)=>({top:r(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s",...i&&{config:i}}),northArrowSouthMiddleEast:(t,n)=>({top:r(t,n),left:t.left+t.width/2-.75*n.width+e,name:"arrow_sme",...i&&{config:i}}),northArrowSouthEast:(t,n)=>({top:r(t,n),left:t.left+t.width/2-n.width+e,name:"arrow_se",...i&&{config:i}}),northEastArrowSouthWest:(t,n)=>({top:r(t,n),left:t.right-e,name:"arrow_sw",...i&&{config:i}}),northEastArrowSouthMiddleWest:(t,n)=>({top:r(t,n),left:t.right-.25*n.width-e,name:"arrow_smw",...i&&{config:i}}),northEastArrowSouth:(t,e)=>({top:r(t,e),left:t.right-e.width/2,name:"arrow_s",...i&&{config:i}}),northEastArrowSouthMiddleEast:(t,n)=>({top:r(t,n),left:t.right-.75*n.width+e,name:"arrow_sme",...i&&{config:i}}),northEastArrowSouthEast:(t,n)=>({top:r(t,n),left:t.right-n.width+e,name:"arrow_se",...i&&{config:i}}),southWestArrowNorthWest:t=>({top:s(t),left:t.left-e,name:"arrow_nw",...i&&{config:i}}),southWestArrowNorthMiddleWest:(t,n)=>({top:s(t),left:t.left-.25*n.width-e,name:"arrow_nmw",...i&&{config:i}}),southWestArrowNorth:(t,e)=>({top:s(t),left:t.left-e.width/2,name:"arrow_n",...i&&{config:i}}),southWestArrowNorthMiddleEast:(t,n)=>({top:s(t),left:t.left-.75*n.width+e,name:"arrow_nme",...i&&{config:i}}),southWestArrowNorthEast:(t,n)=>({top:s(t),left:t.left-n.width+e,name:"arrow_ne",...i&&{config:i}}),southArrowNorthWest:t=>({top:s(t),left:t.left+t.width/2-e,name:"arrow_nw",...i&&{config:i}}),southArrowNorthMiddleWest:(t,n)=>({top:s(t),left:t.left+t.width/2-.25*n.width-e,name:"arrow_nmw",...i&&{config:i}}),southArrowNorth:(t,e)=>({top:s(t),left:t.left+t.width/2-e.width/2,name:"arrow_n",...i&&{config:i}}),southArrowNorthMiddleEast:(t,n)=>({top:s(t),left:t.left+t.width/2-.75*n.width+e,name:"arrow_nme",...i&&{config:i}}),southArrowNorthEast:(t,n)=>({top:s(t),left:t.left+t.width/2-n.width+e,name:"arrow_ne",...i&&{config:i}}),southEastArrowNorthWest:t=>({top:s(t),left:t.right-e,name:"arrow_nw",...i&&{config:i}}),southEastArrowNorthMiddleWest:(t,n)=>({top:s(t),left:t.right-.25*n.width-e,name:"arrow_nmw",...i&&{config:i}}),southEastArrowNorth:(t,e)=>({top:s(t),left:t.right-e.width/2,name:"arrow_n",...i&&{config:i}}),southEastArrowNorthMiddleEast:(t,n)=>({top:s(t),left:t.right-.75*n.width+e,name:"arrow_nme",...i&&{config:i}}),southEastArrowNorthEast:(t,n)=>({top:s(t),left:t.right-n.width+e,name:"arrow_ne",...i&&{config:i}}),westArrowEast:(t,e)=>({top:t.top+t.height/2-e.height/2,left:t.left-e.width-n,name:"arrow_e",...i&&{config:i}}),eastArrowWest:(t,e)=>({top:t.top+t.height/2-e.height/2,left:t.right+n,name:"arrow_w",...i&&{config:i}}),viewportStickyNorth:(t,e,n)=>t.getIntersection(n)?{top:n.top+o,left:t.left+t.width/2-e.width/2,name:"arrowless",config:{withArrow:!1,...i}}:null};function r(t,e){return t.top-e.height-n}function s(t){return t.bottom+n}}lm.arrowSideOffset=25,lm.arrowHeightOffset=10,lm.stickyVerticalOffset=20,lm._getOptimalPosition=Li,lm.defaultPositions=hm();var um=n(3332),gm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(um.Z,gm);um.Z.locals;const mm="ck-tooltip";class pm extends(pi()){constructor(t){if(super(),pm._editors.add(t),pm._instance)return pm._instance;pm._instance=this,this.tooltipTextView=new Fu(t.locale),this.tooltipTextView.set("text",""),this.tooltipTextView.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:this.tooltipTextView.bindTemplate.to("text")}]}),this.balloonPanelView=new lm(t.locale),this.balloonPanelView.class=mm,this.balloonPanelView.content.add(this.tooltipTextView),this._resizeObserver=null,this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this._pinTooltipDebounced=Ic(this._pinTooltip,600),this.listenTo(wi.document,"mouseenter",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(wi.document,"mouseleave",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(wi.document,"focus",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(wi.document,"blur",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(wi.document,"scroll",this._onScroll.bind(this),{useCapture:!0}),this._watchdogExcluded=!0}destroy(t){const e=t.ui.view&&t.ui.view.body;pm._editors.delete(t),this.stopListening(t.ui),e&&e.has(this.balloonPanelView)&&e.remove(this.balloonPanelView),pm._editors.size||(this._unpinTooltip(),this.balloonPanelView.destroy(),this.stopListening(),pm._instance=null)}static getPositioningFunctions(t){const e=pm.defaultBalloonPositions;return{s:[e.southArrowNorth,e.southArrowNorthEast,e.southArrowNorthWest],n:[e.northArrowSouth],e:[e.eastArrowWest],w:[e.westArrowEast],sw:[e.southArrowNorthEast],se:[e.southArrowNorthWest]}[t]}_onEnterOrFocus(t,{target:e}){const n=fm(e);var o;n&&(n!==this._currentElementWithTooltip&&(this._unpinTooltip(),this._pinTooltipDebounced(n,{text:(o=n).dataset.ckeTooltipText,position:o.dataset.ckeTooltipPosition||"s",cssClass:o.dataset.ckeTooltipClass||""})))}_onLeaveOrBlur(t,{target:e,relatedTarget:n}){if("mouseleave"===t.name){if(!ci(e))return;if(this._currentElementWithTooltip&&e!==this._currentElementWithTooltip)return;const t=fm(e),o=fm(n);t&&t!==o&&this._unpinTooltip()}else{if(this._currentElementWithTooltip&&e!==this._currentElementWithTooltip)return;this._unpinTooltip()}}_onScroll(t,{target:e}){this._currentElementWithTooltip&&(e.contains(this.balloonPanelView.element)&&e.contains(this._currentElementWithTooltip)||this._unpinTooltip())}_pinTooltip(t,{text:e,position:n,cssClass:o}){const i=lr(pm._editors.values()).ui.view.body;i.has(this.balloonPanelView)||i.add(this.balloonPanelView),this.tooltipTextView.text=e,this.balloonPanelView.pin({target:t,positions:pm.getPositioningFunctions(n)}),this._resizeObserver=new Ti(t,(()=>{zi(t)||this._unpinTooltip()})),this.balloonPanelView.class=[mm,o].filter((t=>t)).join(" ");for(const t of pm._editors)this.listenTo(t.ui,"update",this._updateTooltipPosition.bind(this),{priority:"low"});this._currentElementWithTooltip=t,this._currentTooltipPosition=n}_unpinTooltip(){this._pinTooltipDebounced.cancel(),this.balloonPanelView.unpin();for(const t of pm._editors)this.stopListening(t.ui,"update");this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this._resizeObserver&&this._resizeObserver.destroy()}_updateTooltipPosition(){zi(this._currentElementWithTooltip)?this.balloonPanelView.pin({target:this._currentElementWithTooltip,positions:pm.getPositioningFunctions(this._currentTooltipPosition)}):this._unpinTooltip()}}function fm(t){return ci(t)?t.closest("[data-cke-tooltip-text]:not([data-cke-tooltip-disabled])"):null}pm.defaultBalloonPositions=hm({heightOffset:5,sideOffset:13}),pm._editors=new Set,pm._instance=null;class km extends(W()){constructor(t){super(),this.editor=t,this.componentFactory=new _g(t),this.focusTracker=new dr,this.tooltipManager=new pm(t),this.set("viewportOffset",this._readViewportOffsetFromConfig()),this.isReady=!1,this.once("ready",(()=>{this.isReady=!0})),this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[],this.listenTo(t.editing.view.document,"layoutChanged",(()=>this.update())),this._initFocusTracking()}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy(),this.tooltipManager.destroy(this.editor);for(const t of this._editableElementsMap.values())t.ckeditorInstance=null;this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[]}setEditableElement(t,e){this._editableElementsMap.set(t,e),e.ckeditorInstance||(e.ckeditorInstance=this.editor),this.focusTracker.add(e);const n=()=>{this.editor.editing.view.getDomRoot(t)||this.editor.keystrokes.listenTo(e)};this.isReady?n():this.once("ready",n)}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}addToolbar(t,e={}){t.isRendered?(this.focusTracker.add(t.element),this.editor.keystrokes.listenTo(t.element)):t.once("render",(()=>{this.focusTracker.add(t.element),this.editor.keystrokes.listenTo(t.element)})),this._focusableToolbarDefinitions.push({toolbarView:t,options:e})}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}_readViewportOffsetFromConfig(){const t=this.editor,e=t.config.get("ui.viewportOffset");if(e)return e;const n=t.config.get("toolbar.viewportTopOffset");return n?(console.warn("editor-ui-deprecated-viewport-offset-config: The `toolbar.vieportTopOffset` configuration option is deprecated. It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead."),{top:n}):{top:0}}_initFocusTracking(){const t=this.editor,e=t.editing.view;let n,o;t.keystrokes.set("Alt+F10",((t,i)=>{const r=this.focusTracker.focusedElement;Array.from(this._editableElementsMap.values()).includes(r)&&!Array.from(e.domRoots.values()).includes(r)&&(n=r);const s=this._getCurrentFocusedToolbarDefinition();s&&o||(o=this._getFocusableCandidateToolbarDefinitions());for(let t=0;t{const i=this._getCurrentFocusedToolbarDefinition();i&&(n?(n.focus(),n=null):t.editing.view.focus(),i.options.afterBlur&&i.options.afterBlur(),o())}))}_getFocusableCandidateToolbarDefinitions(){const t=[];for(const e of this._focusableToolbarDefinitions){const{toolbarView:n,options:o}=e;(zi(n.element)||o.beforeFocus)&&t.push(e)}return t.sort(((t,e)=>bm(t)-bm(e))),t}_getCurrentFocusedToolbarDefinition(){for(const t of this._focusableToolbarDefinitions)if(t.toolbarView.element&&t.toolbarView.element.contains(this.focusTracker.focusedElement))return t;return null}_focusFocusableCandidateToolbar(t){const{toolbarView:e,options:{beforeFocus:n}}=t;return n&&n(),!!zi(e.element)&&(e.focus(),!0)}}function bm(t){const{toolbarView:e,options:n}=t;let o=10;return zi(e.element)&&o--,n.isContextual&&o--,o}var wm=n(9688),_m={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(wm.Z,_m);wm.Z.locals;class Am extends Fu{constructor(t){super(t),this.body=new cg(t)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}var Cm=n(3662),vm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Cm.Z,vm);Cm.Z.locals;class ym extends Fu{constructor(t){super(t),this.set("text",void 0),this.set("for",void 0),this.id=`ck-editor__label_${m()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class xm extends Fu{constructor(t,e,n){super(t),this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}}),this.name=null,this.set("isFocused",!1),this._editableElement=n,this._hasExternalElement=!!this._editableElement,this._editingView=e}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",(()=>this._updateIsFocusedClasses())),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}_updateIsFocusedClasses(){const t=this._editingView;function e(e){t.change((n=>{const o=t.document.getRoot(e.name);n.addClass(e.isFocused?"ck-focused":"ck-blurred",o),n.removeClass(e.isFocused?"ck-blurred":"ck-focused",o)}))}t.isRenderingInProgress?function n(o){t.once("change:isRenderingInProgress",((t,i,r)=>{r?n(o):e(o)}))}(this):e(this)}}class Em extends xm{constructor(t,e,n,o={}){super(t,e,n);const i=t.t;this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}}),this._generateLabel=o.label||(()=>i("Editor editing area: %0",this.name))}render(){super.render();const t=this._editingView;t.change((e=>{const n=t.document.getRoot(this.name);e.setAttribute("aria-label",this._generateLabel(this),n)}))}}var Dm=n(8847),Im={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Dm.Z,Im);Dm.Z.locals;var Tm=n(4879),Mm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Tm.Z,Mm);Tm.Z.locals;class Sm extends Fu{constructor(t){super(t),this.set("value",void 0),this.set("id",void 0),this.set("placeholder",void 0),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById",void 0),this.focusTracker=new dr,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0),this.set("inputMode","text");const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck","ck-input",e.if("isFocused","ck-input_focused"),e.if("isEmpty","ck-input-text_empty"),e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),readonly:e.to("isReadOnly"),inputmode:e.to("inputMode"),"aria-invalid":e.if("hasError",!0),"aria-describedby":e.to("ariaDescribedById")},on:{input:e.to(((...t)=>{this.fire("input",...t),this._updateIsEmpty()})),change:e.to(this._updateIsEmpty.bind(this))}})}render(){super.render(),this.focusTracker.add(this.element),this._setDomElementValue(this.value),this._updateIsEmpty(),this.on("change:value",((t,e,n)=>{this._setDomElementValue(n),this._updateIsEmpty()}))}destroy(){super.destroy(),this.focusTracker.destroy()}select(){this.element.select()}focus(){this.element.focus()}_updateIsEmpty(){this.isEmpty=!this.element.value}_setDomElementValue(t){this.element.value=t||0===t?t:""}}class Nm extends Sm{constructor(t){super(t),this.extendTemplate({attributes:{type:"text",class:["ck-input-text"]}})}}var Bm=n(2577),Pm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Bm.Z,Pm);Bm.Z.locals;class zm extends Fu{constructor(t,e){super(t);const n=`ck-labeled-field-view-${m()}`,o=`ck-labeled-field-view-status-${m()}`;this.fieldView=e(this,n,o),this.set("label",void 0),this.set("isEnabled",!0),this.set("isEmpty",!0),this.set("isFocused",!1),this.set("errorText",null),this.set("infoText",null),this.set("class",void 0),this.set("placeholder",void 0),this.labelView=this._createLabelView(n),this.statusView=this._createStatusView(o),this.fieldWrapperChildren=this.createCollection([this.fieldView,this.labelView]),this.bind("_statusText").to(this,"errorText",this,"infoText",((t,e)=>t||e));const i=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",i.to("class"),i.if("isEnabled","ck-disabled",(t=>!t)),i.if("isEmpty","ck-labeled-field-view_empty"),i.if("isFocused","ck-labeled-field-view_focused"),i.if("placeholder","ck-labeled-field-view_placeholder"),i.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:this.fieldWrapperChildren},this.statusView]})}_createLabelView(t){const e=new ym(this.locale);return e.for=t,e.bind("text").to(this,"label"),e}_createStatusView(t){const e=new Fu(this.locale),n=this.bindTemplate;return e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",n.if("errorText","ck-labeled-field-view__status_error"),n.if("_statusText","ck-hidden",(t=>!t))],id:t,role:n.if("errorText","alert")},children:[{text:n.to("_statusText")}]}),e}focus(){this.fieldView.focus()}}function Lm(t,e,n){const o=new Nm(t.locale);return o.set({id:e,ariaDescribedById:n}),o.bind("isReadOnly").to(t,"isEnabled",(t=>!t)),o.bind("hasError").to(t,"errorText",(t=>!!t)),o.on("input",(()=>{t.errorText=null})),t.bind("isEmpty","isFocused","placeholder").to(o),o}class Om extends xr{static get pluginName(){return"Notification"}init(){this.on("show:warning",((t,e)=>{window.alert(e.message)}),{priority:"lowest"})}showSuccess(t,e={}){this._showNotification({message:t,type:"success",namespace:e.namespace,title:e.title})}showInfo(t,e={}){this._showNotification({message:t,type:"info",namespace:e.namespace,title:e.title})}showWarning(t,e={}){this._showNotification({message:t,type:"warning",namespace:e.namespace,title:e.title})}_showNotification(t){const e=t.namespace?`show:${t.type}:${t.namespace}`:`show:${t.type}`;this.fire(e,{message:t.message,type:t.type,title:t.title||""})}}class Rm extends(W()){constructor(t,e){super(),e&&dc(this,e),t&&this.set(t)}}var jm=n(4650),Fm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(jm.Z,Fm);jm.Z.locals;var Vm=n(7676),Hm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Vm.Z,Hm);Vm.Z.locals;const Um=Si("px");class Wm extends br{static get pluginName(){return"ContextualBalloon"}constructor(t){super(t),this._view=null,this._rotatorView=null,this._fakePanelsView=null,this.positionLimiter=()=>{const t=this.editor.editing.view,e=t.document.selection.editableElement;return e?t.domConverter.mapViewToDom(e.root):null},this.set("visibleView",null),this._viewToStack=new Map,this._idToStack=new Map,this.set("_numberOfStacks",0),this.set("_singleViewMode",!1),this._rotatorView=null,this._fakePanelsView=null}destroy(){super.destroy(),this._view&&this._view.destroy(),this._rotatorView&&this._rotatorView.destroy(),this._fakePanelsView&&this._fakePanelsView.destroy()}get view(){return this._view||this._createPanelView(),this._view}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this._view||this._createPanelView(),this.hasView(t.view))throw new b("contextualballoon-add-view-exist",[this,t]);const e=t.stackId||"main";if(!this._idToStack.has(e))return this._idToStack.set(e,new Map([[t.view,t]])),this._viewToStack.set(t.view,this._idToStack.get(e)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!t.singleViewMode||this.showStack(e));const n=this._idToStack.get(e);t.singleViewMode&&this.showStack(e),n.set(t.view,t),this._viewToStack.set(t.view,n),n===this._visibleStack&&this._showView(t)}remove(t){if(!this.hasView(t))throw new b("contextualballoon-remove-view-not-exist",[this,t]);const e=this._viewToStack.get(t);this._singleViewMode&&this.visibleView===t&&(this._singleViewMode=!1),this.visibleView===t&&(1===e.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(e.values())[e.size-2])),1===e.size?(this._idToStack.delete(this._getStackId(e)),this._numberOfStacks=this._idToStack.size):e.delete(t),this._viewToStack.delete(t)}updatePosition(t){t&&(this._visibleStack.get(this.visibleView).position=t),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e)throw new b("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==e&&this._showView(Array.from(e.values()).pop())}_createPanelView(){this._view=new lm(this.editor.locale),this.editor.ui.view.body.add(this._view),this.editor.ui.focusTracker.add(this._view.element),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){return Array.from(this._idToStack.entries()).find((e=>e[1]===t))[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;t[e]||(e=0),this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;t[e]||(e=t.length-1),this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new qm(this.editor.locale),e=this.editor.locale.t;return this.view.content.add(t),t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>1)),t.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"}),t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((t,n)=>{if(n<2)return"";const o=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("%0 of %1",[o,n])})),t.buttonNextView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()})),t.buttonPrevView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()})),t}_createFakePanelsView(){const t=new Gm(this.editor.locale,this.view);return t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>=2?Math.min(t-1,2):0)),t.listenTo(this.view,"change:top",(()=>t.updatePosition())),t.listenTo(this.view,"change:left",(()=>t.updatePosition())),this.editor.ui.view.body.add(t),t}_showView({view:t,balloonClassName:e="",withArrow:n=!0,singleViewMode:o=!1}){this.view.class=e,this.view.withArrow=n,this._rotatorView.showView(t),this.visibleView=t,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),o&&(this._singleViewMode=!0)}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;return t&&(t.limiter||(t=Object.assign({},t,{limiter:this.positionLimiter})),t=Object.assign({},t,{viewportOffsetConfig:this.editor.ui.viewportOffset})),t}}class qm extends Fu{constructor(t){super(t);const e=t.t,n=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new dr,this.buttonPrevView=this._createButtonView(e("Previous"),''),this.buttonNextView=this._createButtonView(e("Next"),''),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",n.to("isNavigationVisible",(t=>t?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:n.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}destroy(){super.destroy(),this.focusTracker.destroy()}showView(t){this.hideView(),this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const n=new mg(this.locale);return n.set({label:t,icon:e,tooltip:!0}),n}}class Gm extends Fu{constructor(t,e){super(t);const n=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=e,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",n.to("numberOfPanels",(t=>t?"":"ck-hidden"))],style:{top:n.to("top",Um),left:n.to("left",Um),width:n.to("width",Um),height:n.to("height",Um)}},children:this.content}),this.on("change:numberOfPanels",((t,e,n,o)=>{n>o?this._addPanels(n-o):this._removePanels(o-n),this.updatePosition()}))}_addPanels(t){for(;t--;){const t=new Fu;t.setTemplate({tag:"div"}),this.content.add(t),this.registerChild(t)}}_removePanels(t){for(;t--;){const t=this.content.last;this.content.remove(t),this.deregisterChild(t),t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView,{width:n,height:o}=new xi(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:n,height:o})}}}var $m=n(5868),Ym={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()($m.Z,Ym);$m.Z.locals,Si("px");Si("px");var Km=n(9695),Qm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Km.Z,Qm);Km.Z.locals,Si("px");Si("px");const{pilcrow:Zm}=Bu;class Jm extends km{constructor(t,e){super(t),this.view=e,this._toolbarConfig=zg(t.config.get("toolbar"))}get element(){return this.view.editable.element}init(){const t=this.editor,e=this.view,n=t.editing.view,o=e.editable,i=n.document.getRoot();o.name=i.rootName,e.render();const r=o.element;this.setEditableElement(o.name,r),o.bind("isFocused").to(this.focusTracker),n.attachDomRoot(r),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){super.destroy();const t=this.view;this.editor.editing.view.detachDomRoot(t.editable.name),t.destroy()}_initToolbar(){const t=this.editor,e=this.view,n=e.editable.element,o=e.toolbar;e.panel.bind("isVisible").to(this.focusTracker,"isFocused"),e.bind("viewportTopOffset").to(this,"viewportOffset",(({top:t})=>t||0)),e.listenTo(t.ui,"update",(()=>{e.panel.isVisible&&e.panel.pin({target:n,positions:e.panelPositions})})),o.fillFromConfig(this._toolbarConfig,this.componentFactory),this.addToolbar(o)}_initPlaceholder(){const t=this.editor,e=t.editing.view,n=e.document.getRoot(),o=t.sourceElement,i=t.config.get("placeholder")||o&&"textarea"===o.tagName.toLowerCase()&&o.getAttribute("placeholder");i&&Sr({view:e,element:n,text:i,isDirectHost:!1,keepOnFocus:!0})}}const Xm=Si("px");class tp extends Am{constructor(t,e,n,o={}){super(t);const i=t.t;this.toolbar=new Fg(t,{shouldGroupWhenFull:o.shouldToolbarGroupWhenFull,isFloating:!0}),this.set("viewportTopOffset",0),this.panel=new lm(t),this.panelPositions=this._getPanelPositions(),this.panel.extendTemplate({attributes:{class:"ck-toolbar-container"}}),this.editable=new Em(t,e,n,{label:t=>i("Rich Text Editor. Editing area: %0",t.name)}),this._resizeObserver=null}render(){super.render(),this.body.add(this.panel),this.registerChild(this.editable),this.panel.content.add(this.toolbar);if(this.toolbar.options.shouldGroupWhenFull){const t=this.editable.element;this._resizeObserver=new Ti(t,(()=>{this.toolbar.maxWidth=Xm(new xi(t).width)}))}}destroy(){super.destroy(),this._resizeObserver&&this._resizeObserver.destroy()}_getPanelPositionTop(t,e){let n;return n=t.top>e.height+this.viewportTopOffset?t.top-e.height:t.bottom>e.height+this.viewportTopOffset+50?this.viewportTopOffset:t.bottom,n}_getPanelPositions(){const t=[(t,e)=>({top:this._getPanelPositionTop(t,e),left:t.left,name:"toolbar_west",config:{withArrow:!1}}),(t,e)=>({top:this._getPanelPositionTop(t,e),left:t.left+t.width-e.width,name:"toolbar_east",config:{withArrow:!1}})];return"ltr"===this.locale.uiLanguageDirection?t:t.reverse()}}class ep extends(Mu(Su(Tu))){constructor(t,e={}){if(!np(t)&&void 0!==e.initialData)throw new b("editor-create-initial-data",null);super(e),void 0===this.config.get("initialData")&&this.config.set("initialData",function(t){return np(t)?(e=t,e instanceof HTMLTextAreaElement?e.value:e.innerHTML):t;var e}(t)),this.model.document.createRoot(),np(t)&&(this.sourceElement=t,function(t){const e=t.sourceElement;if(e){if(e.ckeditorInstance)throw new b("editor-source-element-already-used",t);e.ckeditorInstance=t,t.once("destroy",(()=>{delete e.ckeditorInstance}))}}(this));const n=!this.config.get("toolbar.shouldNotGroupWhenFull"),o=new tp(this.locale,this.editing.view,this.sourceElement,{shouldToolbarGroupWhenFull:n});this.ui=new Jm(this,o),function(t){if(!Gt(t.updateSourceElement))throw new b("attachtoform-missing-elementapi-interface",t);const e=t.sourceElement;if(function(t){return!!t&&"textarea"===t.tagName.toLowerCase()}(e)&&e.form){let n;const o=e.form,i=()=>t.updateSourceElement();Gt(o.submit)&&(n=o.submit,o.submit=()=>{i(),n.apply(o)}),o.addEventListener("submit",i),t.on("destroy",(()=>{o.removeEventListener("submit",i),n&&(o.submit=n)}))}}(this)}destroy(){const t=this.getData();return this.ui.destroy(),super.destroy().then((()=>{this.sourceElement&&this.updateSourceElement(t)}))}static create(t,e={}){return new Promise((n=>{if(np(t)&&"TEXTAREA"===t.tagName)throw new b("editor-wrong-element",null);const o=new this(t,e);n(o.initPlugins().then((()=>o.ui.init())).then((()=>o.data.init(o.config.get("initialData")))).then((()=>o.fire("ready"))).then((()=>o)))}))}}function np(t){return ci(t)}class op extends uc{constructor(t){super(t);const e=this.document;function n(t){return(n,o)=>{o.preventDefault();const i=o.dropRange?[o.dropRange]:null,r=new u(e,t);e.fire(r,{dataTransfer:o.dataTransfer,method:n.name,targetRanges:i,target:o.target}),r.stop.called&&o.stopPropagation()}}this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"],this.listenTo(e,"paste",n("clipboardInput"),{priority:"low"}),this.listenTo(e,"drop",n("clipboardInput"),{priority:"low"}),this.listenTo(e,"dragover",n("dragging"),{priority:"low"})}onDomEvent(t){const e="clipboardData"in t?t.clipboardData:t.dataTransfer,n="drop"==t.type||"paste"==t.type,o={dataTransfer:new _l(e,{cacheFiles:n})};"drop"!=t.type&&"dragover"!=t.type||(o.dropRange=function(t,e){const n=e.target.ownerDocument,o=e.clientX,i=e.clientY;let r;n.caretRangeFromPoint&&n.caretRangeFromPoint(o,i)?r=n.caretRangeFromPoint(o,i):e.rangeParent&&(r=n.createRange(),r.setStart(e.rangeParent,e.rangeOffset),r.collapse(!0));if(r)return t.domConverter.domRangeToView(r);return null}(this.view,t)),this.fire(t.type,t,o)}}const ip=["figcaption","li"];function rp(t){let e="";if(t.is("$text")||t.is("$textProxy"))e=t.data;else if(t.is("element","img")&&t.hasAttribute("alt"))e=t.getAttribute("alt");else if(t.is("element","br"))e="\n";else{let n=null;for(const o of t.getChildren()){const t=rp(o);n&&(n.is("containerElement")||o.is("containerElement"))&&(ip.includes(n.name)||ip.includes(o.name)?e+="\n":e+="\n\n"),e+=t,n=o}}return e}class sp extends br{static get pluginName(){return"ClipboardPipeline"}init(){this.editor.editing.view.addObserver(op),this._setupPasteDrop(),this._setupCopyCut()}_setupPasteDrop(){const t=this.editor,e=t.model,n=t.editing.view,o=n.document;this.listenTo(o,"clipboardInput",(e=>{t.isReadOnly&&e.stop()}),{priority:"highest"}),this.listenTo(o,"clipboardInput",((t,e)=>{const o=e.dataTransfer;let i;if(e.content)i=e.content;else{let t="";o.getData("text/html")?t=function(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1==e.length?" ":e)).replace(//g,"")}(o.getData("text/html")):o.getData("text/plain")&&(((r=(r=o.getData("text/plain")).replace(//g,">").replace(/\r?\n\r?\n/g,"

    ").replace(/\r?\n/g,"
    ").replace(/\t/g,"    ").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g,"  ")).includes("

    ")||r.includes("
    "))&&(r=`

    ${r}

    `),t=r),i=this.editor.data.htmlProcessor.toView(t)}var r;const s=new u(this,"inputTransformation");this.fire(s,{content:i,dataTransfer:o,targetRanges:e.targetRanges,method:e.method}),s.stop.called&&t.stop(),n.scrollToTheSelection()}),{priority:"low"}),this.listenTo(this,"inputTransformation",((t,n)=>{if(n.content.isEmpty)return;const o=this.editor.data.toModel(n.content,"$clipboardHolder");0!=o.childCount&&(t.stop(),e.change((()=>{this.fire("contentInsertion",{content:o,method:n.method,dataTransfer:n.dataTransfer,targetRanges:n.targetRanges})})))}),{priority:"low"}),this.listenTo(this,"contentInsertion",((t,n)=>{n.resultRange=e.insertContent(n.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor,e=t.model.document,n=t.editing.view.document,o=(o,i)=>{const r=i.dataTransfer;i.preventDefault();const s=t.data.toView(t.model.getSelectedContent(e.selection));n.fire("clipboardOutput",{dataTransfer:r,content:s,method:o.name})};this.listenTo(n,"copy",o,{priority:"low"}),this.listenTo(n,"cut",((e,n)=>{t.isReadOnly?n.preventDefault():o(e,n)}),{priority:"low"}),this.listenTo(n,"clipboardOutput",((n,o)=>{o.content.isEmpty||(o.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(o.content)),o.dataTransfer.setData("text/plain",rp(o.content))),"cut"==o.method&&t.model.deleteContent(e.selection)}),{priority:"low"})}}class ap{constructor(t,e=20){this._batch=null,this.model=t,this._size=0,this.limit=e,this._isLocked=!1,this._changeCallback=(t,e)=>{e.isLocal&&e.isUndoable&&e!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch({isTyping:!0})),this._batch}get size(){return this._size}input(t){this._size+=t,this._size>=this.limit&&this._reset(!0)}get isLocked(){return this._isLocked}lock(){this._isLocked=!0}unlock(){this._isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t=!1){this.isLocked&&!t||(this._batch=null,this._size=0)}}class cp extends _r{constructor(t,e){super(t),this._buffer=new ap(t.model,e)}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(t={}){const e=this.editor.model,n=e.document,o=t.text||"",i=o.length;let r=n.selection;t.selection?r=t.selection:t.range&&(r=e.createSelection(t.range));const s=t.resultRange;e.enqueueChange(this._buffer.batch,(t=>{this._buffer.lock(),e.deleteContent(r),o&&e.insertContent(t.createText(o,n.selection.getAttributes()),r),s?t.setSelection(s):r.is("documentSelection")||t.setSelection(r),this._buffer.unlock(),this._buffer.input(i)}))}}const lp=["insertText","insertReplacementText"];class dp extends lc{constructor(t){super(t),i.isAndroid&&lp.push("insertCompositionText");const e=t.document;e.on("beforeinput",((n,o)=>{if(!this.isEnabled)return;const{data:i,targetRanges:r,inputType:s,domEvent:a}=o;if(!lp.includes(s))return;const c=new u(e,"insertText");e.fire(c,new hc(t,a,{text:i,selection:t.createSelection(r)})),c.stop.called&&n.stop()})),e.on("compositionend",((n,{data:o,domEvent:r})=>{this.isEnabled&&!i.isAndroid&&o&&e.fire("insertText",new hc(t,r,{text:o,selection:e.selection}))}),{priority:"lowest"})}observe(){}}class hp extends br{static get pluginName(){return"Input"}init(){const t=this.editor,e=t.model,n=t.editing.view,o=e.document.selection;n.addObserver(dp);const r=new cp(t,t.config.get("typing.undoStep")||20);t.commands.add("insertText",r),t.commands.add("input",r),this.listenTo(n.document,"insertText",((o,r)=>{n.document.isComposing||r.preventDefault();const{text:s,selection:a,resultRange:c}=r,l=Array.from(a.getRanges()).map((e=>t.editing.mapper.toModelRange(e)));let d=s;if(i.isAndroid){const t=Array.from(l[0].getItems()).reduce(((t,e)=>t+(e.is("$textProxy")?e.data:"")),"");t&&(t.length<=d.length?d.startsWith(t)&&(d=d.substring(t.length),l[0].start=l[0].start.getShiftedBy(t.length)):t.startsWith(d)&&(l[0].start=l[0].start.getShiftedBy(d.length),d=""))}const h={text:d,selection:e.createSelection(l)};c&&(h.resultRange=t.editing.mapper.toModelRange(c)),t.execute("insertText",h)})),i.isAndroid?this.listenTo(n.document,"keydown",((t,i)=>{!o.isCollapsed&&229==i.keyCode&&n.document.isComposing&&up(e,r)})):this.listenTo(n.document,"compositionstart",(()=>{o.isCollapsed||up(e,r)}))}}function up(t,e){if(!e.isEnabled)return;const n=e.buffer;n.lock(),t.enqueueChange(n.batch,(()=>{t.deleteContent(t.document.selection)})),n.unlock()}class gp extends _r{constructor(t,e){super(t),this.direction=e,this._buffer=new ap(t.model,t.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model,n=e.document;e.enqueueChange(this._buffer.batch,(o=>{this._buffer.lock();const i=o.createSelection(t.selection||n.selection),r=t.sequence||1,s=i.isCollapsed;if(i.isCollapsed&&e.modifySelection(i,{direction:this.direction,unit:t.unit,treatEmojiAsSingleUnit:!0}),this._shouldEntireContentBeReplacedWithParagraph(r))return void this._replaceEntireContentWithParagraph(o);if(this._shouldReplaceFirstBlockWithParagraph(i,r))return void this.editor.execute("paragraph",{selection:i});if(i.isCollapsed)return;let a=0;i.getFirstRange().getMinimalFlatRanges().forEach((t=>{a+=Q(t.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))})),e.deleteContent(i,{doNotResetEntireContent:s,direction:this.direction}),this._buffer.input(a),o.setSelection(i),this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1)return!1;const e=this.editor.model,n=e.document.selection,o=e.schema.getLimitElement(n);if(!(n.isCollapsed&&n.containsEntireContent(o)))return!1;if(!e.schema.checkChild(o,"paragraph"))return!1;const i=o.getChild(0);return!i||!i.is("element","paragraph")}_replaceEntireContentWithParagraph(t){const e=this.editor.model,n=e.document.selection,o=e.schema.getLimitElement(n),i=t.createElement("paragraph");t.remove(t.createRangeIn(o)),t.insert(i,o),t.setSelection(i,0)}_shouldReplaceFirstBlockWithParagraph(t,e){const n=this.editor.model;if(e>1||"backward"!=this.direction)return!1;if(!t.isCollapsed)return!1;const o=t.getFirstPosition(),i=n.schema.getLimitElement(o),r=i.getChild(0);return o.parent==r&&(!!t.containsEntireContent(r)&&(!!n.schema.checkChild(i,"paragraph")&&"paragraph"!=r.name))}}const mp="word",pp="selection",fp="backward",kp="forward",bp={deleteContent:{unit:pp,direction:fp},deleteContentBackward:{unit:"codePoint",direction:fp},deleteWordBackward:{unit:mp,direction:fp},deleteHardLineBackward:{unit:pp,direction:fp},deleteSoftLineBackward:{unit:pp,direction:fp},deleteContentForward:{unit:"character",direction:kp},deleteWordForward:{unit:mp,direction:kp},deleteHardLineForward:{unit:pp,direction:kp},deleteSoftLineForward:{unit:pp,direction:kp}};class wp extends lc{constructor(t){super(t);const e=t.document;let n=0;e.on("keydown",(()=>{n++})),e.on("keyup",(()=>{n=0})),e.on("beforeinput",((o,r)=>{if(!this.isEnabled)return;const{targetRanges:s,domEvent:a,inputType:c}=r,l=bp[c];if(!l)return;const d={direction:l.direction,unit:l.unit,sequence:n};d.unit==pp&&(d.selectionToRemove=t.createSelection(s[0])),i.isAndroid&&"deleteContentBackward"===c&&(d.sequence=1,1!=s.length||s[0].start.parent==s[0].end.parent&&s[0].start.offset+1==s[0].end.offset||(d.unit=pp,d.selectionToRemove=t.createSelection(s)));const h=new aa(e,"delete",s[0]);e.fire(h,new hc(t,a,d)),h.stop.called&&o.stop()})),i.isBlink&&function(t){const e=t.view,n=e.document;let o=null,i=!1;function r(t){return t==Zi.backspace||t==Zi.delete}function s(t){return t==Zi.backspace?fp:kp}n.on("keydown",((t,{keyCode:e})=>{o=e,i=!1})),n.on("keyup",((a,{keyCode:c,domEvent:l})=>{const d=n.selection,h=t.isEnabled&&c==o&&r(c)&&!d.isCollapsed&&!i;if(o=null,h){const t=d.getFirstRange(),o=new aa(n,"delete",t),i={unit:pp,direction:s(c),selectionToRemove:d};n.fire(o,new hc(e,l,i))}})),n.on("beforeinput",((t,{inputType:e})=>{const n=bp[e];r(o)&&n&&n.direction==s(o)&&(i=!0)}),{priority:"high"}),n.on("beforeinput",((t,{inputType:e,data:n})=>{o==Zi.delete&&"insertText"==e&&""==n&&t.stop()}),{priority:"high"})}(this)}observe(){}}class _p extends br{static get pluginName(){return"Delete"}init(){const t=this.editor,e=t.editing.view,n=e.document,o=t.model.document;e.addObserver(wp),this._undoOnBackspace=!1;const i=new gp(t,"forward");t.commands.add("deleteForward",i),t.commands.add("forwardDelete",i),t.commands.add("delete",new gp(t,"backward")),this.listenTo(n,"delete",((o,i)=>{n.isComposing||i.preventDefault();const{direction:r,sequence:s,selectionToRemove:a,unit:c}=i,l="forward"===r?"deleteForward":"delete",d={sequence:s};if("selection"==c){const e=Array.from(a.getRanges()).map((e=>t.editing.mapper.toModelRange(e)));d.selection=t.model.createSelection(e)}else d.unit=c;t.execute(l,d),e.scrollToTheSelection()}),{priority:"low"}),this.editor.plugins.has("UndoEditing")&&(this.listenTo(n,"delete",((e,n)=>{this._undoOnBackspace&&"backward"==n.direction&&1==n.sequence&&"codePoint"==n.unit&&(this._undoOnBackspace=!1,t.execute("undo"),n.preventDefault(),e.stop())}),{context:"$capture"}),this.listenTo(o,"change",(()=>{this._undoOnBackspace=!1})))}requestUndoOnBackspace(){this.editor.plugins.has("UndoEditing")&&(this._undoOnBackspace=!0)}}class Ap extends br{static get requires(){return[hp,_p]}static get pluginName(){return"Typing"}}function Cp(t,e){let n=t.start;return{text:Array.from(t.getItems()).reduce(((t,o)=>o.is("$text")||o.is("$textProxy")?t+o.data:(n=e.createPositionAfter(o),"")),""),range:e.createRange(n,t.end)}}class vp extends(W()){constructor(t,e){super(),this.model=t,this.testCallback=e,this._hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",(()=>{this.isEnabled?this._startListening():(this.stopListening(t.document.selection),this.stopListening(t.document))})),this._startListening()}get hasMatch(){return this._hasMatch}_startListening(){const t=this.model.document;this.listenTo(t.selection,"change:range",((e,{directChange:n})=>{n&&(t.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this._hasMatch=!1))})),this.listenTo(t,"change:data",((t,e)=>{!e.isUndo&&e.isLocal&&this._evaluateTextBeforeSelection("data",{batch:e})}))}_evaluateTextBeforeSelection(t,e={}){const n=this.model,o=n.document.selection,i=n.createRange(n.createPositionAt(o.focus.parent,0),o.focus),{text:r,range:s}=Cp(i,n),a=this.testCallback(r);if(!a&&this.hasMatch&&this.fire("unmatched"),this._hasMatch=!!a,a){const n=Object.assign(e,{text:r,range:s});"object"==typeof a&&Object.assign(n,a),this.fire(`matched:${t}`,n)}}}class yp extends br{static get pluginName(){return"TwoStepCaretMovement"}constructor(t){super(t),this.attributes=new Set,this._overrideUid=null}init(){const t=this.editor,e=t.model,n=t.editing.view,o=t.locale,i=e.document.selection;this.listenTo(n.document,"arrowKey",((t,e)=>{if(!i.isCollapsed)return;if(e.shiftKey||e.altKey||e.ctrlKey)return;const n=e.keyCode==Zi.arrowright,r=e.keyCode==Zi.arrowleft;if(!n&&!r)return;const s=o.contentLanguageDirection;let a=!1;a="ltr"===s&&n||"rtl"===s&&r?this._handleForwardMovement(e):this._handleBackwardMovement(e),!0===a&&t.stop()}),{context:"$text",priority:"highest"}),this._isNextGravityRestorationSkipped=!1,this.listenTo(i,"change:range",((t,e)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!e.directChange&&Ip(i.getFirstPosition(),this.attributes)||this._restoreGravity())}))}registerAttribute(t){this.attributes.add(t)}_handleForwardMovement(t){const e=this.attributes,n=this.editor.model.document.selection,o=n.getFirstPosition();return!this._isGravityOverridden&&((!o.isAtStart||!xp(n,e))&&(!!Ip(o,e)&&(Dp(t),this._overrideGravity(),!0)))}_handleBackwardMovement(t){const e=this.attributes,n=this.editor.model,o=n.document.selection,i=o.getFirstPosition();return this._isGravityOverridden?(Dp(t),this._restoreGravity(),Ep(n,e,i),!0):i.isAtStart?!!xp(o,e)&&(Dp(t),Ep(n,e,i),!0):!!function(t,e){const n=t.getShiftedBy(-1);return Ip(n,e)}(i,e)&&(i.isAtEnd&&!xp(o,e)&&Ip(i,e)?(Dp(t),Ep(n,e,i),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1))}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((t=>t.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((t=>{t.restoreSelectionGravity(this._overrideUid),this._overrideUid=null}))}}function xp(t,e){for(const n of e)if(t.hasAttribute(n))return!0;return!1}function Ep(t,e,n){const o=n.nodeBefore;t.change((t=>{o?t.setSelectionAttribute(o.getAttributes()):t.removeSelectionAttribute(e)}))}function Dp(t){t.preventDefault()}function Ip(t,e){const{nodeBefore:n,nodeAfter:o}=t;for(const t of e){const e=n?n.getAttribute(t):void 0;if((o?o.getAttribute(t):void 0)!==e)return!0}return!1}var Tp=/[\\^$.*+?()[\]{}|]/g,Mp=RegExp(Tp.source);const Sp=function(t){return(t=ls(t))&&Mp.test(t)?t.replace(Tp,"\\$&"):t},Np={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:/(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i,to:[null,"½",null]},oneThird:{from:/(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i,to:[null,"⅓",null]},twoThirds:{from:/(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i,to:[null,"⅔",null]},oneForth:{from:/(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i,to:[null,"¼",null]},threeQuarters:{from:/(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i,to:[null,"¾",null]},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:Rp('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:Rp("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:Rp("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:Rp('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:Rp('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:Rp("'"),to:[null,"‚",null,"’"]}},Bp={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},Pp=["symbols","mathematical","typography","quotes"];function zp(t){return"string"==typeof t?new RegExp(`(${Sp(t)})$`):t}function Lp(t){return"string"==typeof t?()=>[t]:t instanceof Array?()=>t:t}function Op(t){return(t.textNode?t.textNode:t.nodeAfter).getAttributes()}function Rp(t){return new RegExp(`(^|\\s)(${t})([^${t}]*)(${t})$`)}function jp(t,e,n,o){return o.createRange(Fp(t,e,n,!0,o),Fp(t,e,n,!1,o))}function Fp(t,e,n,o,i){let r=t.textNode||(o?t.nodeBefore:t.nodeAfter),s=null;for(;r&&r.getAttribute(e)==n;)s=r,r=o?r.previousSibling:r.nextSibling;return s?i.createPositionAt(s,o?"before":"after"):t}function*Vp(t,e){for(const n of e)n&&t.getAttributeProperties(n[0]).copyOnEnter&&(yield n)}class Hp extends _r{execute(){this.editor.model.change((t=>{this.enterBlock(t),this.fire("afterExecute",{writer:t})}))}enterBlock(t){const e=this.editor.model,n=e.document.selection,o=e.schema,i=n.isCollapsed,r=n.getFirstRange(),s=r.start.parent,a=r.end.parent;if(o.isLimit(s)||o.isLimit(a))return i||s!=a||e.deleteContent(n),!1;if(i){const e=Vp(t.model.schema,n.getAttributes());return Up(t,r.start),t.setSelectionAttribute(e),!0}{const o=!(r.start.isAtStart&&r.end.isAtEnd),i=s==a;if(e.deleteContent(n,{leaveUnmerged:o}),o){if(i)return Up(t,n.focus),!0;t.setSelection(a,0)}}return!1}}function Up(t,e){t.split(e),t.setSelection(e.parent.nextSibling,0)}const Wp={insertParagraph:{isSoft:!1},insertLineBreak:{isSoft:!0}};class qp extends lc{constructor(t){super(t);const e=this.document;e.on("beforeinput",((n,o)=>{if(!this.isEnabled)return;const i=o.domEvent,r=Wp[o.inputType];if(!r)return;const s=new aa(e,"enter",o.targetRanges[0]);e.fire(s,new hc(t,i,{isSoft:r.isSoft})),s.stop.called&&n.stop()}))}observe(){}}class Gp extends br{static get pluginName(){return"Enter"}init(){const t=this.editor,e=t.editing.view,n=e.document;e.addObserver(qp),t.commands.add("enter",new Hp(t)),this.listenTo(n,"enter",((o,i)=>{n.isComposing||i.preventDefault(),i.isSoft||(t.execute("enter"),e.scrollToTheSelection())}),{priority:"low"})}}class $p extends _r{execute(){const t=this.editor.model,e=t.document;t.change((n=>{!function(t,e,n){const o=n.isCollapsed,i=n.getFirstRange(),r=i.start.parent,s=i.end.parent,a=r==s;if(o){const o=Vp(t.schema,n.getAttributes());Yp(t,e,i.end),e.removeSelectionAttribute(n.getAttributeKeys()),e.setSelectionAttribute(o)}else{const o=!(i.start.isAtStart&&i.end.isAtEnd);t.deleteContent(n,{leaveUnmerged:o}),a?Yp(t,e,n.focus):o&&e.setSelection(s,0)}}(t,n,e.selection),this.fire("afterExecute",{writer:n})}))}refresh(){const t=this.editor.model,e=t.document;this.isEnabled=function(t,e){if(e.rangeCount>1)return!1;const n=e.anchor;if(!n||!t.checkChild(n,"softBreak"))return!1;const o=e.getFirstRange(),i=o.start.parent,r=o.end.parent;if((Kp(i,t)||Kp(r,t))&&i!==r)return!1;return!0}(t.schema,e.selection)}}function Yp(t,e,n){const o=e.createElement("softBreak");t.insertContent(o,n),e.setSelection(o,"after")}function Kp(t,e){return!t.is("rootElement")&&(e.isLimit(t)||Kp(t.parent,e))}class Qp extends br{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor,e=t.model.schema,n=t.conversion,o=t.editing.view,i=o.document;e.register("softBreak",{allowWhere:"$text",isInline:!0}),n.for("upcast").elementToElement({model:"softBreak",view:"br"}),n.for("downcast").elementToElement({model:"softBreak",view:(t,{writer:e})=>e.createEmptyElement("br")}),o.addObserver(qp),t.commands.add("shiftEnter",new $p(t)),this.listenTo(i,"enter",((e,n)=>{i.isComposing||n.preventDefault(),n.isSoft&&(t.execute("shiftEnter"),o.scrollToTheSelection())}),{priority:"low"})}}class Zp extends(T()){constructor(){super(),this._stack=[]}add(t,e){const n=this._stack,o=n[0];this._insertDescriptor(t);const i=n[0];o===i||Jp(o,i)||this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}remove(t,e){const n=this._stack,o=n[0];this._removeDescriptor(t);const i=n[0];o===i||Jp(o,i)||this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}_insertDescriptor(t){const e=this._stack,n=e.findIndex((e=>e.id===t.id));if(Jp(t,e[n]))return;n>-1&&e.splice(n,1);let o=0;for(;e[o]&&Xp(e[o],t);)o++;e.splice(o,0,t)}_removeDescriptor(t){const e=this._stack,n=e.findIndex((e=>e.id===t));n>-1&&e.splice(n,1)}}function Jp(t,e){return t&&e&&t.priority==e.priority&&tf(t.classes)==tf(e.classes)}function Xp(t,e){return t.priority>e.priority||!(t.prioritytf(e.classes)}function tf(t){return Array.isArray(t)?t.sort().join(","):t}const ef='',nf="ck-widget",of="ck-widget_selected";function rf(t){return!!t.is("element")&&!!t.getCustomProperty("widget")}function sf(t,e,n={}){if(!t.is("containerElement"))throw new b("widget-to-widget-wrong-element-type",null,{element:t});return e.setAttribute("contenteditable","false",t),e.addClass(nf,t),e.setCustomProperty("widget",!0,t),t.getFillerOffset=uf,e.setCustomProperty("widgetLabel",[],t),n.label&&function(t,e){const n=t.getCustomProperty("widgetLabel");n.push(e)}(t,n.label),n.hasSelectionHandle&&function(t,e){const n=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t),n=new hg;return n.set("content",ef),n.render(),e.appendChild(n.element),e}));e.insert(e.createPositionAt(t,0),n),e.addClass(["ck-widget_with-selection-handle"],t)}(t,e),lf(t,e),t}function af(t,e,n){if(e.classes&&n.addClass(or(e.classes),t),e.attributes)for(const o in e.attributes)n.setAttribute(o,e.attributes[o],t)}function cf(t,e,n){if(e.classes&&n.removeClass(or(e.classes),t),e.attributes)for(const o in e.attributes)n.removeAttribute(o,t)}function lf(t,e,n=af,o=cf){const i=new Zp;i.on("change:top",((e,i)=>{i.oldDescriptor&&o(t,i.oldDescriptor,i.writer),i.newDescriptor&&n(t,i.newDescriptor,i.writer)}));e.setCustomProperty("addHighlight",((t,e,n)=>i.add(e,n)),t),e.setCustomProperty("removeHighlight",((t,e,n)=>i.remove(e,n)),t)}function df(t,e,n={}){return e.addClass(["ck-editor__editable","ck-editor__nested-editable"],t),e.setAttribute("role","textbox",t),n.label&&e.setAttribute("aria-label",n.label,t),e.setAttribute("contenteditable",t.isReadOnly?"false":"true",t),t.on("change:isReadOnly",((n,o,i)=>{e.setAttribute("contenteditable",i?"false":"true",t)})),t.on("change:isFocused",((n,o,i)=>{i?e.addClass("ck-editor__nested-editable_focused",t):e.removeClass("ck-editor__nested-editable_focused",t)})),lf(t,e),t}function hf(t,e){const n=t.getSelectedElement();if(n){const o=pf(t);if(o)return e.createRange(e.createPositionAt(n,o))}return fu(t,e)}function uf(){return null}const gf="widget-type-around";function mf(t,e,n){return!!t&&rf(t)&&!n.isInline(e)}function pf(t){return t.getAttribute(gf)}var ff=n(4921),kf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(ff.Z,kf);ff.Z.locals;const bf=["before","after"],wf=(new DOMParser).parseFromString('',"image/svg+xml").firstChild,_f="ck-widget__type-around_disabled";class Af extends br{static get pluginName(){return"WidgetTypeAround"}static get requires(){return[Gp,_p]}constructor(t){super(t),this._currentFakeCaretModelElement=null}init(){const t=this.editor,e=t.editing.view;this.on("change:isEnabled",((n,o,i)=>{e.change((t=>{for(const n of e.document.roots)i?t.removeClass(_f,n):t.addClass(_f,n)})),i||t.model.change((t=>{t.removeSelectionAttribute(gf)}))})),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableInsertObjectIntegration(),this._enableDeleteContentIntegration()}destroy(){super.destroy(),this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const n=this.editor,o=n.editing.view,i=n.model.schema.getAttributesWithProperty(t,"copyOnReplace",!0);n.execute("insertParagraph",{position:n.model.createPositionAt(t,e),attributes:i}),o.focus(),o.scrollToTheSelection()}_listenToIfEnabled(t,e,n,o){this.listenTo(t,e,((...t)=>{this.isEnabled&&n(...t)}),o)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor.model.document.selection,e=pf(t);if(!e)return!1;const n=t.getSelectedElement();return this._insertParagraph(n,e),!0}_enableTypeAroundUIInjection(){const t=this.editor,e=t.model.schema,n=t.locale.t,o={before:n("Insert paragraph before block"),after:n("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,i,r)=>{const s=r.mapper.toViewElement(i.item);if(s&&mf(s,i.item,e)){!function(t,e,n){const o=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const n=this.toDomElement(t);return function(t,e){for(const n of bf){const o=new Vu({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${n}`],title:e[n],"aria-hidden":"true"},children:[t.ownerDocument.importNode(wf,!0)]});t.appendChild(o.render())}}(n,e),function(t){const e=new Vu({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}(n),n}));t.insert(t.createPositionAt(n,"end"),o)}(r.writer,o,s);s.getCustomProperty("widgetLabel").push((()=>this.isEnabled?n("Press Enter to type after or press Shift + Enter to type before the widget"):""))}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor,e=t.model,n=e.document.selection,o=e.schema,i=t.editing.view;function r(t){return`ck-widget_type-around_show-fake-caret_${t}`}this._listenToIfEnabled(i.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[rf,"$text"],priority:"high"}),this._listenToIfEnabled(n,"change:range",((e,n)=>{n.directChange&&t.model.change((t=>{t.removeSelectionAttribute(gf)}))})),this._listenToIfEnabled(e.document,"change:data",(()=>{const e=n.getSelectedElement();if(e){if(mf(t.editing.mapper.toViewElement(e),e,o))return}t.model.change((t=>{t.removeSelectionAttribute(gf)}))})),this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,n)=>{const i=n.writer;if(this._currentFakeCaretModelElement){const t=n.mapper.toViewElement(this._currentFakeCaretModelElement);t&&(i.removeClass(bf.map(r),t),this._currentFakeCaretModelElement=null)}const s=e.selection.getSelectedElement();if(!s)return;const a=n.mapper.toViewElement(s);if(!mf(a,s,o))return;const c=pf(e.selection);c&&(i.addClass(r(c),a),this._currentFakeCaretModelElement=s)})),this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,n,o)=>{o||t.model.change((t=>{t.removeSelectionAttribute(gf)}))}))}_handleArrowKeyPress(t,e){const n=this.editor,o=n.model,i=o.document.selection,r=o.schema,s=n.editing.view,a=function(t,e){const n=nr(t,e);return"down"===n||"right"===n}(e.keyCode,n.locale.contentLanguageDirection),c=s.document.selection.getSelectedElement();let l;mf(c,n.editing.mapper.toModelElement(c),r)?l=this._handleArrowKeyPressOnSelectedWidget(a):i.isCollapsed?l=this._handleArrowKeyPressWhenSelectionNextToAWidget(a):e.shiftKey||(l=this._handleArrowKeyPressWhenNonCollapsedSelection(a)),l&&(e.preventDefault(),t.stop())}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor.model,n=pf(e.document.selection);return e.change((e=>{if(!n)return e.setSelectionAttribute(gf,t?"after":"before"),!0;if(!(n===(t?"after":"before")))return e.removeSelectionAttribute(gf),!0;return!1}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor,n=e.model,o=n.schema,i=e.plugins.get("Widget"),r=i._getObjectElementNextToSelection(t);return!!mf(e.editing.mapper.toViewElement(r),r,o)&&(n.change((e=>{i._setSelectionOverElement(r),e.setSelectionAttribute(gf,t?"before":"after")})),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(t){const e=this.editor,n=e.model,o=n.schema,i=e.editing.mapper,r=n.document.selection,s=t?r.getLastPosition().nodeBefore:r.getFirstPosition().nodeAfter;return!!mf(i.toViewElement(s),s,o)&&(n.change((e=>{e.setSelection(s,"on"),e.setSelectionAttribute(gf,t?"after":"before")})),!0)}_enableInsertingParagraphsOnButtonClick(){const t=this.editor,e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((n,o)=>{const i=o.domTarget.closest(".ck-widget__type-around__button");if(!i)return;const r=function(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}(i),s=function(t,e){const n=t.closest(".ck-widget");return e.mapDomToView(n)}(i,e.domConverter),a=t.editing.mapper.toModelElement(s);this._insertParagraph(a,r),o.preventDefault(),n.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor,e=t.model.document.selection,n=t.editing.view;this._listenToIfEnabled(n.document,"enter",((n,o)=>{if("atTarget"!=n.eventPhase)return;const i=e.getSelectedElement(),r=t.editing.mapper.toViewElement(i),s=t.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:mf(r,i,s)&&(this._insertParagraph(i,o.isSoft?"before":"after"),a=!0),a&&(o.preventDefault(),n.stop())}),{context:rf})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor.editing.view.document;this._listenToIfEnabled(t,"insertText",((e,n)=>{this._insertParagraphAccordingToFakeCaretPosition()&&(n.selection=t.selection)}),{priority:"high"}),i.isAndroid?this._listenToIfEnabled(t,"keydown",((t,e)=>{229==e.keyCode&&this._insertParagraphAccordingToFakeCaretPosition()})):this._listenToIfEnabled(t,"compositionstart",(()=>{this._insertParagraphAccordingToFakeCaretPosition()}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor,e=t.editing.view,n=t.model,o=n.schema;this._listenToIfEnabled(e.document,"delete",((e,i)=>{if("atTarget"!=e.eventPhase)return;const r=pf(n.document.selection);if(!r)return;const s=i.direction,a=n.document.selection.getSelectedElement(),c="forward"==s;if("before"===r===c)t.execute("delete",{selection:n.createSelection(a,"on")});else{const e=o.getNearestSelectionRange(n.createPositionAt(a,r),s);if(e)if(e.isCollapsed){const i=n.createSelection(e.start);if(n.modifySelection(i,{direction:s}),i.focus.isEqual(e.start)){const t=function(t,e){let n=e;for(const o of e.getAncestors({parentFirst:!0})){if(o.childCount>1||t.isLimit(o))break;n=o}return n}(o,e.start.parent);n.deleteContent(n.createSelection(t,"on"),{doNotAutoparagraph:!0})}else n.change((n=>{n.setSelection(e),t.execute(c?"deleteForward":"delete")}))}else n.change((n=>{n.setSelection(e),t.execute(c?"deleteForward":"delete")}))}i.preventDefault(),e.stop()}),{context:rf})}_enableInsertContentIntegration(){const t=this.editor,e=this.editor.model,n=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[o,i])=>{if(i&&!i.is("documentSelection"))return;const r=pf(n);return r?(t.stop(),e.change((t=>{const i=n.getSelectedElement(),s=e.createPositionAt(i,r),a=t.createSelection(s),c=e.insertContent(o,a);return t.setSelection(a),c}))):void 0}),{priority:"high"})}_enableInsertObjectIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"insertObject",((t,n)=>{const[,o,,i={}]=n;if(o&&!o.is("documentSelection"))return;const r=pf(e);r&&(i.findOptimalPosition=r,n[3]=i)}),{priority:"high"})}_enableDeleteContentIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"deleteContent",((t,[n])=>{if(n&&!n.is("documentSelection"))return;pf(e)&&t.stop()}),{priority:"high"})}}function Cf(t){const e=t.model;return(n,o)=>{const i=o.keyCode==Zi.arrowup,r=o.keyCode==Zi.arrowdown,s=o.shiftKey,a=e.document.selection;if(!i&&!r)return;const c=r;if(s&&function(t,e){return!t.isCollapsed&&t.isBackward==e}(a,c))return;const l=function(t,e,n){const o=t.model;if(n){const t=e.isCollapsed?e.focus:e.getLastPosition(),n=vf(o,t,"forward");if(!n)return null;const i=o.createRange(t,n),r=yf(o.schema,i,"backward");return r?o.createRange(t,r):null}{const t=e.isCollapsed?e.focus:e.getFirstPosition(),n=vf(o,t,"backward");if(!n)return null;const i=o.createRange(n,t),r=yf(o.schema,i,"forward");return r?o.createRange(r,t):null}}(t,a,c);if(l){if(l.isCollapsed){if(a.isCollapsed)return;if(s)return}(l.isCollapsed||function(t,e,n){const o=t.model,i=t.view.domConverter;if(n){const t=o.createSelection(e.start);o.modifySelection(t),t.focus.isAtEnd||e.start.isEqual(t.focus)||(e=o.createRange(t.focus,e.end))}const r=t.mapper.toViewRange(e),s=i.viewRangeToDom(r),a=xi.getDomRangeRects(s);let c;for(const t of a)if(void 0!==c){if(Math.round(t.top)>=c)return!1;c=Math.max(c,Math.round(t.bottom))}else c=Math.round(t.bottom);return!0}(t,l,c))&&(e.change((t=>{const n=c?l.end:l.start;if(s){const o=e.createSelection(a.anchor);o.setFocus(n),t.setSelection(o)}else t.setSelection(n)})),n.stop(),o.preventDefault(),o.stopPropagation())}}}function vf(t,e,n){const o=t.schema,i=t.createRangeIn(e.root),r="forward"==n?"elementStart":"elementEnd";for(const{previousPosition:t,item:s,type:a}of i.getWalker({startPosition:e,direction:n})){if(o.isLimit(s)&&!o.isInline(s))return t;if(a==r&&o.isBlock(s))return null}return null}function yf(t,e,n){const o="backward"==n?e.end:e.start;if(t.checkChild(o,"$text"))return o;for(const{nextPosition:o}of e.getWalker({direction:n}))if(t.checkChild(o,"$text"))return o;return null}var xf=n(3488),Ef={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(xf.Z,Ef);xf.Z.locals;class Df extends br{static get pluginName(){return"Widget"}static get requires(){return[Af,_p]}init(){const t=this.editor,e=t.editing.view,n=e.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",((e,n,o)=>{const i=o.writer,r=n.selection;if(r.isCollapsed)return;const s=r.getSelectedElement();if(!s)return;const a=t.editing.mapper.toViewElement(s);var c;rf(a)&&(o.consumable.consume(r,"selection")&&i.setSelection(i.createRangeOn(a),{fake:!0,label:(c=a,c.getCustomProperty("widgetLabel").reduce(((t,e)=>"function"==typeof e?t?t+". "+e():e():t?t+". "+e:e),""))}))})),this.editor.editing.downcastDispatcher.on("selection",((t,e,n)=>{this._clearPreviouslySelectedWidgets(n.writer);const o=n.writer,i=o.document.selection;let r=null;for(const t of i.getRanges())for(const e of t){const t=e.item;rf(t)&&!If(t,r)&&(o.addClass(of,t),this._previouslySelected.add(t),r=t)}}),{priority:"low"}),e.addObserver(xu),this.listenTo(n,"mousedown",((...t)=>this._onMousedown(...t))),this.listenTo(n,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[rf,"$text"]}),this.listenTo(n,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"}),this.listenTo(n,"arrowKey",Cf(this.editor.editing),{context:"$text"}),this.listenTo(n,"delete",((t,e)=>{this._handleDelete("forward"==e.direction)&&(e.preventDefault(),t.stop())}),{context:"$root"})}_onMousedown(t,e){const n=this.editor,o=n.editing.view,r=o.document;let s=e.target;if(function(t){let e=t;for(;e;){if(e.is("editableElement")&&!e.is("rootElement"))return!0;if(rf(e))return!1;e=e.parent}return!1}(s)){if((i.isSafari||i.isGecko)&&e.domEvent.detail>=3){const t=n.editing.mapper,o=s.is("attributeElement")?s.findAncestor((t=>!t.is("attributeElement"))):s,i=t.toModelElement(o);e.preventDefault(),this.editor.model.change((t=>{t.setSelection(i,"in")}))}return}if(!rf(s)&&(s=s.findAncestor(rf),!s))return;i.isAndroid&&e.preventDefault(),r.isFocused||o.focus();const a=n.editing.mapper.toModelElement(s);this._setSelectionOverElement(a)}_handleSelectionChangeOnArrowKeyPress(t,e){const n=e.keyCode,o=this.editor.model,i=o.schema,r=o.document.selection,s=r.getSelectedElement(),a=nr(n,this.editor.locale.contentLanguageDirection),c="down"==a||"right"==a,l="up"==a||"down"==a;if(s&&i.isObject(s)){const n=c?r.getLastPosition():r.getFirstPosition(),s=i.getNearestSelectionRange(n,c?"forward":"backward");return void(s&&(o.change((t=>{t.setSelection(s)})),e.preventDefault(),t.stop()))}if(!r.isCollapsed&&!e.shiftKey){const n=r.getFirstPosition(),s=r.getLastPosition(),a=n.nodeAfter,l=s.nodeBefore;return void((a&&i.isObject(a)||l&&i.isObject(l))&&(o.change((t=>{t.setSelection(c?s:n)})),e.preventDefault(),t.stop()))}if(!r.isCollapsed)return;const d=this._getObjectElementNextToSelection(c);if(d&&i.isObject(d)){if(i.isInline(d)&&l)return;this._setSelectionOverElement(d),e.preventDefault(),t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const n=this.editor.model,o=n.schema,i=n.document.selection.getSelectedElement();i&&o.isObject(i)&&(e.preventDefault(),t.stop())}_handleDelete(t){if(this.editor.isReadOnly)return;const e=this.editor.model.document.selection;if(!e.isCollapsed)return;const n=this._getObjectElementNextToSelection(t);return n?(this.editor.model.change((t=>{let o=e.anchor.parent;for(;o.isEmpty;){const e=o;o=e.parent,t.remove(e)}this._setSelectionOverElement(n)})),!0):void 0}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model,n=e.schema,o=e.document.selection,i=e.createSelection(o);if(e.modifySelection(i,{direction:t?"forward":"backward"}),i.isEqual(o))return null;const r=t?i.focus.nodeBefore:i.focus.nodeAfter;return r&&n.isObject(r)?r:null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected)t.removeClass(of,e);this._previouslySelected.clear()}}function If(t,e){return!!e&&Array.from(t.getAncestors()).includes(e)}class Tf extends br{static get requires(){return[Wm]}static get pluginName(){return"WidgetToolbarRepository"}init(){const t=this.editor;if(t.plugins.has("BalloonToolbar")){const e=t.plugins.get("BalloonToolbar");this.listenTo(e,"show",(e=>{(function(t){const e=t.getSelectedElement();return!(!e||!rf(e))})(t.editing.view.document.selection)&&e.stop()}),{priority:"high"})}this._toolbarDefinitions=new Map,this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",(()=>{this._updateToolbarsVisibility()})),this.listenTo(t.ui,"update",(()=>{this._updateToolbarsVisibility()})),this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>{this._updateToolbarsVisibility()}),{priority:"low"})}destroy(){super.destroy();for(const t of this._toolbarDefinitions.values())t.view.destroy()}register(t,{ariaLabel:e,items:n,getRelatedElement:o,balloonClassName:i="ck-toolbar-container"}){if(!n.length)return void w("widget-toolbar-no-items",{toolbarId:t});const r=this.editor,s=r.t,a=new Fg(r.locale);if(a.ariaLabel=e||s("Widget toolbar"),this._toolbarDefinitions.has(t))throw new b("widget-toolbar-duplicated",this,{toolbarId:t});const c={view:a,getRelatedElement:o,balloonClassName:i,itemsConfig:n,initialized:!1};r.ui.addToolbar(a,{isContextual:!0,beforeFocus:()=>{const t=o(r.editing.view.document.selection);t&&this._showToolbar(c,t)},afterBlur:()=>{this._hideToolbar(c)}}),this._toolbarDefinitions.set(t,c)}_updateToolbarsVisibility(){let t=0,e=null,n=null;for(const o of this._toolbarDefinitions.values()){const i=o.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&i)if(this.editor.ui.focusTracker.isFocused){const r=i.getAncestors().length;r>t&&(t=r,e=i,n=o)}else this._isToolbarVisible(o)&&this._hideToolbar(o);else this._isToolbarInBalloon(o)&&this._hideToolbar(o)}n&&this._showToolbar(n,e)}_hideToolbar(t){this._balloon.remove(t.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(t,e){this._isToolbarVisible(t)?Mf(this.editor,e):this._isToolbarInBalloon(t)||(t.initialized||(t.initialized=!0,t.view.fillFromConfig(t.itemsConfig,this.editor.ui.componentFactory)),this._balloon.add({view:t.view,position:Sf(this.editor,e),balloonClassName:t.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",(()=>{for(const t of this._toolbarDefinitions.values())if(this._isToolbarVisible(t)){const e=t.getRelatedElement(this.editor.editing.view.document.selection);Mf(this.editor,e)}})))}_isToolbarVisible(t){return this._balloon.visibleView===t.view}_isToolbarInBalloon(t){return this._balloon.hasView(t.view)}}function Mf(t,e){const n=t.plugins.get("ContextualBalloon"),o=Sf(t,e);n.updatePosition(o)}function Sf(t,e){const n=t.editing.view,o=lm.defaultPositions;return{target:n.domConverter.mapViewToDom(e),positions:[o.northArrowSouth,o.northArrowSouthWest,o.northArrowSouthEast,o.southArrowNorth,o.southArrowNorthWest,o.southArrowNorthEast,o.viewportStickyNorth]}}class Nf extends(W()){constructor(t){super(),this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=t,this._referenceCoordinates=null}get originalWidth(){return this._originalWidth}get originalHeight(){return this._originalHeight}get originalWidthPercents(){return this._originalWidthPercents}get aspectRatio(){return this._aspectRatio}begin(t,e,n){const o=new Rect(e);this.activeHandlePosition=function(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const n of e)if(t.classList.contains(getResizerHandleClass(n)))return n}(t),this._referenceCoordinates=function(t,e){const n=new Rect(t),o=e.split("-"),i={x:"right"==o[1]?n.right:n.left,y:"bottom"==o[0]?n.bottom:n.top};return i.x+=t.ownerDocument.defaultView.scrollX,i.y+=t.ownerDocument.defaultView.scrollY,i}(e,function(t){const e=t.split("-"),n={top:"bottom",bottom:"top",left:"right",right:"left"};return`${n[e[0]]}-${n[e[1]]}`}(this.activeHandlePosition)),this._originalWidth=o.width,this._originalHeight=o.height,this._aspectRatio=o.width/o.height;const i=n.style.width;i&&i.match(/^\d+(\.\d*)?%$/)?this._originalWidthPercents=parseFloat(i):this._originalWidthPercents=function(t,e){const n=t.parentElement,o=parseFloat(n.ownerDocument.defaultView.getComputedStyle(n).width);return e.width/o*100}(n,o)}update(t){this.proposedWidth=t.width,this.proposedHeight=t.height,this.proposedWidthPercents=t.widthPercents,this.proposedHandleHostWidth=t.handleHostWidth,this.proposedHandleHostHeight=t.handleHostHeight}}class Bf extends(W()){constructor(t){super(),this._options=t,this._viewResizerWrapper=null,this.set("isEnabled",!0),this.set("isSelected",!1),this.bind("isVisible").to(this,"isEnabled",this,"isSelected",((t,e)=>t&&e)),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",(t=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),t.stop())}),{priority:"high"})}get state(){return this._state}show(){this._options.editor.editing.view.change((t=>{t.removeClass("ck-hidden",this._viewResizerWrapper)}))}hide(){this._options.editor.editing.view.change((t=>{t.addClass("ck-hidden",this._viewResizerWrapper)}))}attach(){const t=this,e=this._options.viewElement;this._options.editor.editing.view.change((n=>{const o=n.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(e){const n=this.toDomElement(e);return t._appendHandles(n),t._appendSizeUI(n),n}));n.insert(n.createPositionAt(e,"end"),o),n.addClass("ck-widget_with-resizer",e),this._viewResizerWrapper=o,this.isVisible||this.hide()})),this.on("change:isVisible",(()=>{this.isVisible?(this.show(),this.redraw()):this.hide()}))}begin(t){this._state=new ResizeState(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(t,this._getHandleHost(),this._getResizeHost())}updateSize(t){const e=this._proposeNewSize(t);this._options.editor.editing.view.change((t=>{const n=this._options.unit||"%",o=("%"===n?e.widthPercents:e.width)+n;t.setStyle("width",o,this._options.viewElement)}));const n=this._getHandleHost(),o=new Rect(n),i=Math.round(o.width),r=Math.round(o.height),s=new Rect(n);e.width=Math.round(s.width),e.height=Math.round(s.height),this.redraw(o),this.state.update({...e,handleHostWidth:i,handleHostHeight:r})}commit(){const t=this._options.unit||"%",e=("%"===t?this.state.proposedWidthPercents:this.state.proposedWidth)+t;this._options.editor.editing.view.change((()=>{this._cleanup(),this._options.onCommit(e)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(t){const e=this._domResizerWrapper;if(!(e&&n.ownerDocument&&n.ownerDocument.contains(n)))return;var n;const o=e.parentElement,i=this._getHandleHost(),r=this._viewResizerWrapper,s=[r.getStyle("width"),r.getStyle("height"),r.getStyle("left"),r.getStyle("top")];let a;if(o.isSameNode(i)){const e=t||new Rect(i);[e.width+"px",e.height+"px",void 0,void 0]}else[i.offsetWidth+"px",i.offsetHeight+"px",i.offsetLeft+"px",i.offsetTop+"px"];"same"!==compareArrays(s,a)&&this._options.editor.editing.view.change((t=>{t.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},r)}))}containsHandle(t){return this._domResizerWrapper.contains(t)}static isResizeHandle(t){return t.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change((t=>{t.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(t){const e=this.state,n={x:t.pageX,y:o.pageY};var o;const i=!this._options.isCentered||this._options.isCentered(this),r={x:e._referenceCoordinates.x-(n.x+e.originalWidth),y:n.y-e.originalHeight-e._referenceCoordinates.y};i&&e.activeHandlePosition.endsWith("-right")&&(r.x=n.x-(e._referenceCoordinates.x+e.originalWidth)),i&&(r.x*=2);let s=Math.abs(e.originalWidth+r.x),a=Math.abs(e.originalHeight+r.y);return"width"==(s/e.aspectRatio>a?"width":"height")?s/e.aspectRatio:a*e.aspectRatio,{width:Math.round(s),height:Math.round(a),widthPercents:Math.min(Math.round(e.originalWidthPercents/e.originalWidth*s*100)/100,100)}}_getResizeHost(){const t=this._domResizerWrapper.parentElement;return this._options.getResizeHost(t)}_getHandleHost(){const t=this._domResizerWrapper.parentElement;return this._options.getHandleHost(t)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(t){const e=["top-left","top-right","bottom-right","bottom-left"];for(const o of e)t.appendChild(new Template({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(o,`ck-widget__resizer__handle-${n}`)}}).render());var n}_appendSizeUI(t){this._sizeView=new SizeView,this._sizeView.render(),t.appendChild(this._sizeView.element)}}var Pf=n(8506),zf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Pf.Z,zf);Pf.Z.locals;var Lf="Expected a function";const Of=function(t,e,n){var o=!0,i=!0;if("function"!=typeof t)throw new TypeError(Lf);return O(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),Ic(t,e,{leading:o,maxWait:e,trailing:i})};var Rf=n(903),jf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Rf.Z,jf);Rf.Z.locals;class Ff extends br{static get pluginName(){return"DragDrop"}static get requires(){return[sp,Df]}init(){const t=this.editor,e=t.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,this._updateDropMarkerThrottled=Of((t=>this._updateDropMarker(t)),40),this._removeDropMarkerDelayed=Uf((()=>this._removeDropMarker()),40),this._clearDraggableAttributesDelayed=Uf((()=>this._clearDraggableAttributes()),40),e.addObserver(op),e.addObserver(xu),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDropMarker(),this._setupDraggableAttributeHandling(),this.listenTo(t,"change:isReadOnly",((t,e,n)=>{n?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})),this.on("change:isEnabled",((t,e,n)=>{n||this._finalizeDragging(!1)})),i.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._updateDropMarkerThrottled.cancel(),this._removeDropMarkerDelayed.cancel(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const t=this.editor,e=t.model,n=e.document,o=t.editing.view,r=o.document;this.listenTo(r,"dragstart",((o,i)=>{const s=n.selection;if(i.target&&i.target.is("editableElement"))return void i.preventDefault();const a=i.target?Wf(i.target):null;if(a){const n=t.editing.mapper.toModelElement(a);this._draggedRange=Jl.fromRange(e.createRangeOn(n)),t.plugins.has("WidgetToolbarRepository")&&t.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}else if(!r.selection.isCollapsed){const t=r.selection.getSelectedElement();t&&rf(t)||(this._draggedRange=Jl.fromRange(s.getFirstRange()))}if(!this._draggedRange)return void i.preventDefault();this._draggingUid=m(),i.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",i.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const c=e.createSelection(this._draggedRange.toRange()),l=t.data.toView(e.getSelectedContent(c));r.fire("clipboardOutput",{dataTransfer:i.dataTransfer,content:l,method:"dragstart"}),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")}),{priority:"low"}),this.listenTo(r,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&"move"==e.dataTransfer.dropEffect)}),{priority:"low"}),this.listenTo(r,"dragenter",(()=>{this.isEnabled&&o.focus()})),this.listenTo(r,"dragleave",(()=>{this._removeDropMarkerDelayed()})),this.listenTo(r,"dragging",((e,n)=>{if(!this.isEnabled)return void(n.dataTransfer.dropEffect="none");this._removeDropMarkerDelayed.cancel();const o=Vf(t,n.targetRanges,n.target);this._draggedRange||(n.dataTransfer.dropEffect="copy"),i.isGecko||("copy"==n.dataTransfer.effectAllowed?n.dataTransfer.dropEffect="copy":["all","copyMove"].includes(n.dataTransfer.effectAllowed)&&(n.dataTransfer.dropEffect="move")),o&&this._updateDropMarkerThrottled(o)}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"clipboardInput",((e,n)=>{if("drop"!=n.method)return;const o=Vf(t,n.targetRanges,n.target);if(this._removeDropMarker(),!o)return this._finalizeDragging(!1),void e.stop();this._draggedRange&&this._draggingUid!=n.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==Hf(n.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(o,!0))return this._finalizeDragging(!1),void e.stop();n.targetRanges=[t.editing.mapper.toViewRange(o)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get(sp);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const n=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(n)))}),{priority:"high"}),t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const n="move"==Hf(e.dataTransfer),o=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(o&&n)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor,e=t.editing.view,n=e.document;this.listenTo(n,"mousedown",((o,r)=>{if(i.isAndroid||!r)return;this._clearDraggableAttributesDelayed.cancel();let s=Wf(r.target);if(i.isBlink&&!t.isReadOnly&&!s&&!n.selection.isCollapsed){const t=n.selection.getSelectedElement();t&&rf(t)||(s=n.selection.editableElement)}s&&(e.change((t=>{t.setAttribute("draggable","true",s)})),this._draggableElement=t.editing.mapper.toModelElement(s))})),this.listenTo(n,"mouseup",(()=>{i.isAndroid||this._clearDraggableAttributesDelayed()}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement)),this._draggableElement=null}))}_setupDropMarker(){const t=this.editor;t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:n})=>{if(t.model.schema.checkChild(e.markerRange.start,"$text"))return n.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);return e.append("⁠",t.createElement("span"),"⁠"),e}))}})}_updateDropMarker(t){const e=this.editor,n=e.model.markers;e.model.change((e=>{n.has("drop-target")?n.get("drop-target").getRange().isEqual(t)||e.updateMarker("drop-target",{range:t}):e.addMarker("drop-target",{range:t,usingOperation:!1,affectsData:!1})}))}_removeDropMarker(){const t=this.editor.model;this._removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),t.markers.has("drop-target")&&t.change((t=>{t.removeMarker("drop-target")}))}_finalizeDragging(t){const e=this.editor,n=e.model;this._removeDropMarker(),this._clearDraggableAttributes(),e.plugins.has("WidgetToolbarRepository")&&e.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop"),this._draggingUid="",this._draggedRange&&(t&&this.isEnabled&&n.deleteContent(n.createSelection(this._draggedRange),{doNotAutoparagraph:!0}),this._draggedRange.detach(),this._draggedRange=null)}}function Vf(t,e,n){const o=t.model,r=t.editing.mapper;let s=null;const a=e?e[0].start:null;if(n.is("uiElement")&&(n=n.parent),s=function(t,e){const n=t.model,o=t.editing.mapper;if(rf(e))return n.createRangeOn(o.toModelElement(e));if(!e.is("editableElement")){const t=e.findAncestor((t=>rf(t)||t.is("editableElement")));if(rf(t))return n.createRangeOn(o.toModelElement(t))}return null}(t,n),s)return s;const c=function(t,e){const n=t.editing.mapper,o=t.editing.view,i=n.toModelElement(e);if(i)return i;const r=o.createPositionBefore(e),s=n.findMappedViewAncestor(r);return n.toModelElement(s)}(t,n),l=a?r.toModelPosition(a):null;return l?(s=function(t,e,n){const o=t.model;if(!o.schema.checkChild(n,"$block"))return null;const i=o.createPositionAt(n,0),r=e.path.slice(0,i.path.length),s=o.createPositionFromPath(e.root,r),a=s.nodeAfter;if(a&&o.schema.isObject(a))return o.createRangeOn(a);return null}(t,l,c),s||(s=o.schema.getNearestSelectionRange(l,i.isGecko?"forward":"backward"),s||function(t,e){const n=t.model;let o=e;for(;o;){if(n.schema.isObject(o))return n.createRangeOn(o);o=o.parent}return null}(t,l.parent))):function(t,e){const n=t.model,o=n.schema,i=n.createPositionAt(e,0);return o.getNearestSelectionRange(i,"forward")}(t,c)}function Hf(t){return i.isGecko?t.dropEffect:["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function Uf(t,e){let n;function o(...i){o.cancel(),n=setTimeout((()=>t(...i)),e)}return o.cancel=()=>{clearTimeout(n)},o}function Wf(t){if(t.is("editableElement"))return null;if(t.hasClass("ck-widget__selection-handle"))return t.findAncestor(rf);if(rf(t))return t;const e=t.findAncestor((t=>rf(t)||t.is("editableElement")));return rf(e)?e:null}class qf extends br{static get pluginName(){return"PastePlainText"}static get requires(){return[sp]}init(){const t=this.editor,e=t.model,n=t.editing.view,o=n.document,i=e.document.selection;let r=!1;n.addObserver(op),this.listenTo(o,"keydown",((t,e)=>{r=e.shiftKey})),t.plugins.get(sp).on("contentInsertion",((t,n)=>{(r||function(t,e){if(t.childCount>1)return!1;const n=t.getChild(0);if(e.isObject(n))return!1;return 0==Array.from(n.getAttributeKeys()).length}(n.content,e.schema))&&e.change((t=>{const o=Array.from(i.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));i.isCollapsed||e.deleteContent(i,{doNotAutoparagraph:!0}),o.push(...i.getAttributes());const r=t.createRangeIn(n.content);for(const e of r.getItems())e.is("$textProxy")&&t.setAttributes(o,e)}))}))}}class Gf extends br{static get pluginName(){return"Clipboard"}static get requires(){return[sp,Ff,qf]}}class $f extends _r{constructor(t){super(t),this.affectsData=!1}execute(){const t=this.editor.model,e=t.document.selection;let n=t.schema.getLimitElement(e);if(e.containsEntireContent(n)||!Yf(t.schema,n))do{if(n=n.parent,!n)return}while(!Yf(t.schema,n));t.change((t=>{t.setSelection(n,"in")}))}}function Yf(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const Kf=tr("Ctrl+A");class Qf extends br{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor,e=t.editing.view.document;t.commands.add("selectAll",new $f(t)),this.listenTo(e,"keydown",((e,n)=>{Xi(n)===Kf&&(t.execute("selectAll"),n.preventDefault())}))}}class Zf extends br{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(e=>{const n=t.commands.get("selectAll"),o=new mg(e),i=e.t;return o.set({label:i("Select all"),icon:'',keystroke:"Ctrl+A",tooltip:!0}),o.bind("isEnabled").to(n,"isEnabled"),this.listenTo(o,"execute",(()=>{t.execute("selectAll"),t.editing.view.focus()})),o}))}}class Jf extends br{static get requires(){return[Qf,Zf]}static get pluginName(){return"SelectAll"}}class Xf extends _r{constructor(t){super(t),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this.listenTo(t.data,"set",((t,e)=>{e[1]={...e[1]};const n=e[1];n.batchType||(n.batchType={isUndoable:!1})}),{priority:"high"}),this.listenTo(t.data,"set",((t,e)=>{e[1].batchType.isUndoable||this.clearStack()}))}refresh(){this.isEnabled=this._stack.length>0}addBatch(t){const e=this.editor.model.document.selection,n={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:n}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(t,e,n){const o=this.editor.model,i=o.document,r=[],s=t.map((t=>t.getTransformedByOperations(n))),a=s.flat();for(const t of s){const e=t.filter((t=>t.root!=i.graveyard)).filter((t=>!ek(t,a)));e.length&&(tk(e),r.push(e[0]))}r.length&&o.change((t=>{t.setSelection(r,{backward:e})}))}_undo(t,e){const n=this.editor.model,o=n.document;this._createdBatches.add(e);const i=t.operations.slice().filter((t=>t.isDocumentOperation));i.reverse();for(const t of i){const i=t.baseVersion+1,r=Array.from(o.history.getOperations(i)),s=Ih([t.getReversed()],r,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const i of s)e.addOperation(i),n.applyOperation(i),o.history.setOperationAsUndone(t,i)}}}function tk(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;ee!==t&&e.containsRange(t,!0)))}class nk extends Xf{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1,n=this._stack.splice(e,1)[0],o=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(o,(()=>{this._undo(n.batch,o);const t=this.editor.model.document.history.getOperations(n.batch.baseVersion);this._restoreSelection(n.selection.ranges,n.selection.isBackward,t),this.fire("revert",n.batch,o)})),this.refresh()}}class ok extends Xf{execute(){const t=this._stack.pop(),e=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(e,(()=>{const n=t.batch.operations[t.batch.operations.length-1].baseVersion+1,o=this.editor.model.document.history.getOperations(n);this._restoreSelection(t.selection.ranges,t.selection.isBackward,o),this._undo(t.batch,e)})),this.refresh()}}class ik extends br{static get pluginName(){return"UndoEditing"}constructor(t){super(t),this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new nk(t),this._redoCommand=new ok(t),t.commands.add("undo",this._undoCommand),t.commands.add("redo",this._redoCommand),this.listenTo(t.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation)return;const o=n.batch,i=this._redoCommand._createdBatches.has(o),r=this._undoCommand._createdBatches.has(o);this._batchRegistry.has(o)||(this._batchRegistry.add(o),o.isUndoable&&(i?this._undoCommand.addBatch(o):r||(this._undoCommand.addBatch(o),this._redoCommand.clearStack())))}),{priority:"highest"}),this.listenTo(this._undoCommand,"revert",((t,e,n)=>{this._redoCommand.addBatch(n)})),t.keystrokes.set("CTRL+Z","undo"),t.keystrokes.set("CTRL+Y","redo"),t.keystrokes.set("CTRL+SHIFT+Z","redo")}}const rk='',sk='';class ak extends br{static get pluginName(){return"UndoUI"}init(){const t=this.editor,e=t.locale,n=t.t,o="ltr"==e.uiLanguageDirection?rk:sk,i="ltr"==e.uiLanguageDirection?sk:rk;this._addButton("undo",n("Undo"),"CTRL+Z",o),this._addButton("redo",n("Redo"),"CTRL+Y",i)}_addButton(t,e,n,o){const i=this.editor;i.ui.componentFactory.add(t,(r=>{const s=i.commands.get(t),a=new mg(r);return a.set({label:e,icon:o,keystroke:n,tooltip:!0}),a.bind("isEnabled").to(s,"isEnabled"),this.listenTo(a,"execute",(()=>{i.execute(t),i.editing.view.focus()})),a}))}}class ck extends br{static get requires(){return[ik,ak]}static get pluginName(){return"Undo"}}class lk extends(W()){constructor(){super();const t=new window.FileReader;this._reader=t,this._data=void 0,this.set("loaded",0),t.onprogress=t=>{this.loaded=t.loaded}}get error(){return this._reader.error}get data(){return this._data}read(t){const e=this._reader;return this.total=t.size,new Promise(((n,o)=>{e.onload=()=>{const t=e.result;this._data=t,n(t)},e.onerror=()=>{o("error")},e.onabort=()=>{o("aborted")},this._reader.readAsDataURL(t)}))}abort(){this._reader.abort()}}class dk extends br{static get pluginName(){return"FileRepository"}static get requires(){return[Nu]}init(){this.loaders=new cr,this.loaders.on("change",(()=>this._updatePendingAction())),this._loadersMap=new Map,this._pendingAction=null,this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0))}getLoader(t){return this._loadersMap.get(t)||null}createLoader(t){if(!this.createUploadAdapter)return w("filerepository-no-upload-adapter"),null;const e=new hk(Promise.resolve(t),this.createUploadAdapter);return this.loaders.add(e),this._loadersMap.set(t,e),t instanceof Promise&&e.file.then((t=>{this._loadersMap.set(t,e)})).catch((()=>{})),e.on("change:uploaded",(()=>{let t=0;for(const e of this.loaders)t+=e.uploaded;this.uploaded=t})),e.on("change:uploadTotal",(()=>{let t=0;for(const e of this.loaders)e.uploadTotal&&(t+=e.uploadTotal);this.uploadTotal=t})),e}destroyLoader(t){const e=t instanceof hk?t:this.getLoader(t);e._destroy(),this.loaders.remove(e),this._loadersMap.forEach(((t,n)=>{t===e&&this._loadersMap.delete(n)}))}_updatePendingAction(){const t=this.editor.plugins.get(Nu);if(this.loaders.length){if(!this._pendingAction){const e=this.editor.t,n=t=>`${e("Upload in progress")} ${parseInt(t)}%.`;this._pendingAction=t.add(n(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",n)}}else t.remove(this._pendingAction),this._pendingAction=null}}class hk extends(W()){constructor(t,e){super(),this.id=m(),this._filePromiseWrapper=this._createFilePromiseWrapper(t),this._adapter=e(this),this._reader=new lk,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0)),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then((t=>this._filePromiseWrapper?t:null)):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new b("filerepository-read-wrong-status",this);return this.status="reading",this.file.then((t=>this._reader.read(t))).then((t=>{if("reading"!==this.status)throw this.status;return this.status="idle",t})).catch((t=>{if("aborted"===t)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:t}))}upload(){if("idle"!=this.status)throw new b("filerepository-upload-wrong-status",this);return this.status="uploading",this.file.then((()=>this._adapter.upload())).then((t=>(this.uploadResponse=t,this.status="idle",t))).catch((t=>{if("aborted"===this.status)throw"aborted";throw this.status="error",t}))}abort(){const t=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==t?this._reader.abort():"uploading"==t&&this._adapter.abort&&this._adapter.abort():(this._filePromiseWrapper.promise.catch((()=>{})),this._filePromiseWrapper.rejecter("aborted")),this._destroy()}_destroy(){this._filePromiseWrapper=void 0,this._reader=void 0,this._adapter=void 0,this.uploadResponse=void 0}_createFilePromiseWrapper(t){const e={};return e.promise=new Promise(((n,o)=>{e.rejecter=o,e.isFulfilled=!1,t.then((t=>{e.isFulfilled=!0,n(t)})).catch((t=>{e.isFulfilled=!0,o(t)}))})),e}}class uk extends Fu{constructor(t){super(t),this.buttonView=new mg(t),this._fileInputView=new gk(t),this._fileInputView.bind("acceptedType").to(this),this._fileInputView.bind("allowMultipleFiles").to(this),this._fileInputView.delegate("done").to(this),this.setTemplate({tag:"span",attributes:{class:"ck-file-dialog-button"},children:[this.buttonView,this._fileInputView]}),this.buttonView.on("execute",(()=>{this._fileInputView.open()}))}focus(){this.buttonView.focus()}}class gk extends Fu{constructor(t){super(t),this.set("acceptedType",void 0),this.set("allowMultipleFiles",!1);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:e.to("acceptedType"),multiple:e.to("allowMultipleFiles")},on:{change:e.to((()=>{this.element&&this.element.files&&this.element.files.length&&this.fire("done",this.element.files),this.element.value=""}))}})}open(){this.element.click()}}const mk="ckCsrfToken",pk=40,fk="abcdefghijklmnopqrstuvwxyz0123456789";function kk(){let t=function(t){t=t.toLowerCase();const e=document.cookie.split(";");for(const n of e){const e=n.split("=");if(decodeURIComponent(e[0].trim().toLowerCase())===t)return decodeURIComponent(e[1])}return null}(mk);var e,n;return t&&t.length==pk||(t=function(t){let e="";const n=new Uint8Array(t);window.crypto.getRandomValues(n);for(let t=0;t.5?o.toUpperCase():o}return e}(pk),e=mk,n=t,document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(n)+";path=/"),t}class bk{constructor(t,e,n){this.loader=t,this.url=e,this.t=n}upload(){return this.loader.file.then((t=>new Promise(((e,n)=>{this._initRequest(),this._initListeners(e,n,t),this._sendRequest(t)}))))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const t=this.xhr=new XMLHttpRequest;t.open("POST",this.url,!0),t.responseType="json"}_initListeners(t,e,n){const o=this.xhr,i=this.loader,r=(0,this.t)("Cannot upload file:")+` ${n.name}.`;o.addEventListener("error",(()=>e(r))),o.addEventListener("abort",(()=>e())),o.addEventListener("load",(()=>{const n=o.response;if(!n||!n.uploaded)return e(n&&n.error&&n.error.message?n.error.message:r);t({default:n.url})})),o.upload&&o.upload.addEventListener("progress",(t=>{t.lengthComputable&&(i.uploadTotal=t.total,i.uploaded=t.loaded)}))}_sendRequest(t){const e=new FormData;e.append("upload",t),e.append("ckCsrfToken",kk()),this.xhr.send(e)}}function wk(t,e,n,o){let i,r=null;"function"==typeof o?i=o:(r=t.commands.get(o),i=()=>{t.execute(o)}),t.model.document.on("change:data",((s,a)=>{if(r&&!r.isEnabled||!e.isEnabled)return;const c=lr(t.model.document.selection.getRanges());if(!c.isCollapsed)return;if(a.isUndo||!a.isLocal)return;const l=Array.from(t.model.document.differ.getChanges()),d=l[0];if(1!=l.length||"insert"!==d.type||"$text"!=d.name||1!=d.length)return;const h=d.position.parent;if(h.is("element","codeBlock"))return;if(h.is("element","listItem")&&"function"!=typeof o&&!["numberedList","bulletedList","todoList"].includes(o))return;if(r&&!0===r.value)return;const u=h.getChild(0),g=t.model.createRangeOn(u);if(!g.containsRange(c)&&!c.end.isEqual(g.end))return;const m=n.exec(u.data.substr(0,c.end.offset));m&&t.model.enqueueChange((e=>{const n=e.createPositionAt(h,0),o=e.createPositionAt(h,m[0].length),r=new Jl(n,o);if(!1!==i({match:m})){e.remove(r);const n=t.model.document.selection.getFirstRange(),o=e.createRangeIn(h);!h.isEmpty||o.isEqual(n)||o.containsRange(n,!0)||e.remove(h)}r.detach(),t.model.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function _k(t,e,n,o){let i,r;n instanceof RegExp?i=n:r=n,r=r||(t=>{let e;const n=[],o=[];for(;null!==(e=i.exec(t))&&!(e&&e.length<4);){let{index:t,1:i,2:r,3:s}=e;const a=i+r+s;t+=e[0].length-a.length;const c=[t,t+i.length],l=[t+i.length+r.length,t+i.length+r.length+s.length];n.push(c),n.push(l),o.push([t+i.length,t+i.length+r.length])}return{remove:n,format:o}}),t.model.document.on("change:data",((n,i)=>{if(i.isUndo||!i.isLocal||!e.isEnabled)return;const s=t.model,a=s.document.selection;if(!a.isCollapsed)return;const c=Array.from(s.document.differ.getChanges()),l=c[0];if(1!=c.length||"insert"!==l.type||"$text"!=l.name||1!=l.length)return;const d=a.focus,h=d.parent,{text:u,range:g}=function(t,e){let n=t.start;const o=Array.from(t.getItems()).reduce(((t,o)=>!o.is("$text")&&!o.is("$textProxy")||o.getAttribute("code")?(n=e.createPositionAfter(o),""):t+o.data),"");return{text:o,range:e.createRange(n,t.end)}}(s.createRange(s.createPositionAt(h,0),d),s),m=r(u),p=Ak(g.start,m.format,s),f=Ak(g.start,m.remove,s);p.length&&f.length&&s.enqueueChange((e=>{if(!1!==o(e,p)){for(const t of f.reverse())e.remove(t);s.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function Ak(t,e,n){return e.filter((t=>void 0!==t[0]&&void 0!==t[1])).map((e=>n.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1]))))}function Ck(t,e){return(n,o)=>{if(!t.commands.get(e).isEnabled)return!1;const i=t.model.schema.getValidRanges(o,e);for(const t of i)n.setAttribute(e,!0,t);n.removeSelectionAttribute(e)}}class vk extends _r{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,n=e.document.selection,o=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(n.isCollapsed)o?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const i=e.schema.getValidRanges(n.getRanges(),this.attributeKey);for(const e of i)o?t.setAttribute(this.attributeKey,o,e):t.removeAttribute(this.attributeKey,e)}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,n=t.document.selection;if(n.isCollapsed)return n.hasAttribute(this.attributeKey);for(const t of n.getRanges())for(const n of t.getItems())if(e.checkAttribute(n,this.attributeKey))return n.hasAttribute(this.attributeKey);return!1}}const yk="bold";class xk extends br{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:yk}),t.model.schema.setAttributeProperties(yk,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:yk,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e&&("bold"==e||Number(e)>=600)?{name:!0,styles:["font-weight"]}:null}]}),t.commands.add(yk,new vk(t,yk)),t.keystrokes.set("CTRL+B",yk)}}const Ek="bold";class Dk extends br{static get pluginName(){return"BoldUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Ek,(n=>{const o=t.commands.get(Ek),i=new mg(n);return i.set({label:e("Bold"),icon:Bu.bold,keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute(Ek),t.editing.view.focus()})),i}))}}const Ik="italic";class Tk extends br{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:Ik}),t.model.schema.setAttributeProperties(Ik,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:Ik,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(Ik,new vk(t,Ik)),t.keystrokes.set("CTRL+I",Ik)}}const Mk="italic";class Sk extends br{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add(Mk,(n=>{const o=t.commands.get(Mk),i=new mg(n);return i.set({label:e("Italic"),icon:'',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute(Mk),t.editing.view.focus()})),i}))}}class Nk extends _r{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,n=e.schema,o=e.document.selection,i=Array.from(o.getSelectedBlocks()),r=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(r){const e=i.filter((t=>Bk(t)||zk(n,t)));this._applyQuote(t,e)}else this._removeQuote(t,i.filter(Bk))}))}_getValue(){const t=lr(this.editor.model.document.selection.getSelectedBlocks());return!(!t||!Bk(t))}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,n=lr(t.getSelectedBlocks());return!!n&&zk(e,n)}_removeQuote(t,e){Pk(t,e).reverse().forEach((e=>{if(e.start.isAtStart&&e.end.isAtEnd)return void t.unwrap(e.start.parent);if(e.start.isAtStart){const n=t.createPositionBefore(e.start.parent);return void t.move(e,n)}e.end.isAtEnd||t.split(e.end);const n=t.createPositionAfter(e.end.parent);t.move(e,n)}))}_applyQuote(t,e){const n=[];Pk(t,e).reverse().forEach((e=>{let o=Bk(e.start);o||(o=t.createElement("blockQuote"),t.wrap(e,o)),n.push(o)})),n.reverse().reduce(((e,n)=>e.nextSibling==n?(t.merge(t.createPositionAfter(e)),e):n))}}function Bk(t){return"blockQuote"==t.parent.name?t.parent:null}function Pk(t,e){let n,o=0;const i=[];for(;o{const o=t.model.document.differ.getChanges();for(const t of o)if("insert"==t.type){const o=t.position.nodeAfter;if(!o)continue;if(o.is("element","blockQuote")&&o.isEmpty)return n.remove(o),!0;if(o.is("element","blockQuote")&&!e.checkChild(t.position,o))return n.unwrap(o),!0;if(o.is("element")){const t=n.createRangeIn(o);for(const o of t.getItems())if(o.is("element","blockQuote")&&!e.checkChild(n.createPositionBefore(o),o))return n.unwrap(o),!0}}else if("remove"==t.type){const e=t.position.parent;if(e.is("element","blockQuote")&&e.isEmpty)return n.remove(e),!0}return!1}));const n=this.editor.editing.view.document,o=t.model.document.selection,i=t.commands.get("blockQuote");this.listenTo(n,"enter",((e,n)=>{if(!o.isCollapsed||!i.value)return;o.getLastPosition().parent.isEmpty&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),n.preventDefault(),e.stop())}),{context:"blockquote"}),this.listenTo(n,"delete",((e,n)=>{if("backward"!=n.direction||!o.isCollapsed||!i.value)return;const r=o.getLastPosition().parent;r.isEmpty&&!r.previousSibling&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),n.preventDefault(),e.stop())}),{context:"blockquote"})}}var Ok=n(3062),Rk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Ok.Z,Rk);Ok.Z.locals;class jk extends br{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("blockQuote",(n=>{const o=t.commands.get("blockQuote"),i=new mg(n);return i.set({label:e("Block quote"),icon:Bu.quote,tooltip:!0,isToggleable:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(i,"execute",(()=>{t.execute("blockQuote"),t.editing.view.focus()})),i}))}}class Fk extends br{static get pluginName(){return"CKBoxUI"}afterInit(){const t=this.editor;if(!t.commands.get("ckbox"))return;const e=t.t;t.ui.componentFactory.add("ckbox",(n=>{const o=t.commands.get("ckbox"),i=new mg(n);return i.set({label:e("Open file manager"),icon:'',tooltip:!0}),i.bind("isOn","isEnabled").to(o,"value","isEnabled"),i.on("execute",(()=>{t.execute("ckbox")})),i}))}}const Vk=4e3,Hk=80,Uk=10;function Wk({token:t,id:e,origin:n,width:o,extension:i}){const r=qk(t),s=function(t){const e=[t*Uk/100,Hk],n=Math.floor(Math.max(...e)),o=[Math.min(t,Vk)];let i=o[0];for(;i-n>=n;)i-=n,o.unshift(i);return o}(o),a=function(t){if("bmp"===t||"tiff"===t||"jpg"===t)return"jpeg";return t}(i);return{imageFallbackUrl:Gk({environmentId:r,id:e,origin:n,width:o,extension:a}),imageSources:[{srcset:s.map((t=>`${Gk({environmentId:r,id:e,origin:n,width:t,extension:"webp"})} ${t}w`)).join(","),sizes:`(max-width: ${o}px) 100vw, ${o}px`,type:"image/webp"}]}}function qk(t){const[,e]=t.value.split(".");return JSON.parse(atob(e)).aud}function Gk({environmentId:t,id:e,origin:n,width:o,extension:i}){return new URL(`${t}/assets/${e}/images/${o}.${i}`,n).toString()}class $k extends _r{constructor(t){super(t),this._chosenAssets=new Set,this._wrapper=null,this._initListeners()}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(){this.fire("ckbox:open")}_getValue(){return null!==this._wrapper}_checkEnabled(){const t=this.editor.commands.get("insertImage"),e=this.editor.commands.get("link");return!(!t.isEnabled&&!e.isEnabled)}_prepareOptions(){const t=this.editor.config.get("ckbox");return{theme:t.theme,language:t.language,tokenUrl:t.tokenUrl,serviceOrigin:t.serviceOrigin,assetsOrigin:t.assetsOrigin,dialog:{onClose:()=>this.fire("ckbox:close")},assets:{onChoose:t=>this.fire("ckbox:choose",t)}}}_initListeners(){const t=this.editor,e=t.model,n=!t.config.get("ckbox.ignoreDataId");this.on("ckbox",(()=>{this.refresh()}),{priority:"low"}),this.on("ckbox:open",(()=>{this.isEnabled&&!this.value&&(this._wrapper=bt(document,"div",{class:"ck ckbox-wrapper"}),document.body.appendChild(this._wrapper),window.CKBox.mount(this._wrapper,this._prepareOptions()))})),this.on("ckbox:close",(()=>{this.value&&(this._wrapper.remove(),this._wrapper=null)})),this.on("ckbox:choose",((o,i)=>{if(!this.isEnabled)return;const r=t.commands.get("insertImage"),s=t.commands.get("link"),a=t.plugins.get("CKBoxEditing"),c=function({assets:t,origin:e,token:n,isImageAllowed:o,isLinkAllowed:i}){return t.map((t=>({id:t.data.id,type:Kk(t)?"image":"link",attributes:Yk(t,n,e)}))).filter((t=>"image"===t.type?o:i))}({assets:i,origin:t.config.get("ckbox.assetsOrigin"),token:a.getToken(),isImageAllowed:r.isEnabled,isLinkAllowed:s.isEnabled});0!==c.length&&e.change((t=>{for(const e of c){const o=e===c[c.length-1];this._insertAsset(e,o,t),n&&(setTimeout((()=>this._chosenAssets.delete(e)),1e3),this._chosenAssets.add(e))}}))})),this.listenTo(t,"destroy",(()=>{this.fire("ckbox:close"),this._chosenAssets.clear()}))}_insertAsset(t,e,n){const o=this.editor.model.document.selection;n.removeSelectionAttribute("linkHref"),"image"===t.type?this._insertImage(t):this._insertLink(t,n),e||n.setSelection(o.getLastPosition())}_insertImage(t){const e=this.editor,{imageFallbackUrl:n,imageSources:o,imageTextAlternative:i}=t.attributes;e.execute("insertImage",{source:{src:n,sources:o,alt:i}})}_insertLink(t,e){const n=this.editor,o=n.model,i=o.document.selection,{linkName:r,linkHref:s}=t.attributes;if(i.isCollapsed){const t=ur(i.getAttributes()),n=e.createText(r,t),s=o.insertContent(n);e.setSelection(s)}n.execute("link",s)}}function Yk(t,e,n){if(Kk(t)){const{imageFallbackUrl:o,imageSources:i}=Wk({token:e,origin:n,id:t.data.id,width:t.data.metadata.width,extension:t.data.extension});return{imageFallbackUrl:o,imageSources:i,imageTextAlternative:t.data.metadata.description||""}}return{linkName:t.data.name,linkHref:Qk(t,e,n)}}function Kk(t){const e=t.data.metadata;return!!e&&(e.width&&e.height)}function Qk(t,e,n){const o=qk(e),i=new URL(`${o}/assets/${t.data.id}/file`,n);return i.searchParams.set("download","true"),i.toString()}class Zk extends br{static get requires(){return["ImageUploadEditing","ImageUploadProgress",dk,tb]}static get pluginName(){return"CKBoxUploadAdapter"}async afterInit(){const t=this.editor,e=!!t.config.get("ckbox"),n=!!window.CKBox;if(!e&&!n)return;const o=t.plugins.get(dk),i=t.plugins.get(tb);o.createUploadAdapter=e=>new Jk(e,i.getToken(),t);const r=!t.config.get("ckbox.ignoreDataId"),s=t.plugins.get("ImageUploadEditing");r&&s.on("uploadComplete",((e,{imageElement:n,data:o})=>{t.model.change((t=>{t.setAttribute("ckboxImageId",o.ckboxImageId,n)}))}))}}class Jk{constructor(t,e,n){this.loader=t,this.token=e,this.editor=n,this.controller=new AbortController,this.serviceOrigin=n.config.get("ckbox.serviceOrigin"),this.assetsOrigin=n.config.get("ckbox.assetsOrigin")}async getAvailableCategories(t=0){const e=new URL("categories",this.serviceOrigin);return e.searchParams.set("limit",50..toString()),e.searchParams.set("offset",t.toString()),this._sendHttpRequest({url:e}).then((async e=>{if(e.totalCount-(t+50)>0){const n=await this.getAvailableCategories(t+50);return[...e.items,...n]}return e.items})).catch((()=>{this.controller.signal.throwIfAborted(),_("ckbox-fetch-category-http-error")}))}async getCategoryIdForFile(t){const e=Xk(t.name),n=await this.getAvailableCategories();if(!n)return null;const o=this.editor.config.get("ckbox.defaultUploadCategories");if(o){const t=Object.keys(o).find((t=>o[t].includes(e)));if(t){const e=n.find((e=>e.id===t||e.name===t));return e?e.id:null}}const i=n.find((t=>t.extensions.includes(e)));return i?i.id:null}async upload(){const t=this.editor.t,e=t("Cannot determine a category for the uploaded file."),n=await this.loader.file,o=await this.getCategoryIdForFile(n);if(!o)return Promise.reject(e);const i=new URL("assets",this.serviceOrigin),r=new FormData;r.append("categoryId",o),r.append("file",n);const s={method:"POST",url:i,data:r,onUploadProgress:t=>{t.lengthComputable&&(this.loader.uploadTotal=t.total,this.loader.uploaded=t.loaded)}};return this._sendHttpRequest(s).then((async t=>{const e=await this._getImageWidth(),o=Xk(n.name),i=Wk({token:this.token,id:t.id,origin:this.assetsOrigin,width:e,extension:o});return{ckboxImageId:t.id,default:i.imageFallbackUrl,sources:i.imageSources}})).catch((()=>{const e=t("Cannot upload file:")+` ${n.name}.`;return Promise.reject(e)}))}abort(){this.controller.abort()}_sendHttpRequest(t){const{url:e,data:n,onUploadProgress:o}=t,i=t.method||"GET",r=this.controller.signal,s=new XMLHttpRequest;s.open(i,e.toString(),!0),s.setRequestHeader("Authorization",this.token.value),s.setRequestHeader("CKBox-Version","CKEditor 5"),s.responseType="json";const a=()=>{s.abort()};return new Promise(((t,e)=>{r.addEventListener("abort",a),s.addEventListener("loadstart",(()=>{r.addEventListener("abort",a)})),s.addEventListener("loadend",(()=>{r.removeEventListener("abort",a)})),s.addEventListener("error",(()=>{e()})),s.addEventListener("abort",(()=>{e()})),s.addEventListener("load",(async()=>{const n=s.response;return!n||n.statusCode>=400?e(n&&n.message):t(n)})),o&&s.upload.addEventListener("progress",(t=>{o(t)})),s.send(n)}))}_getImageWidth(){return new Promise((t=>{const e=new Image;e.onload=()=>{URL.revokeObjectURL(e.src),t(e.width)},e.src=this.loader.data}))}}function Xk(t){return t.match(/\.(?[^.]+)$/).groups.ext}class tb extends br{static get pluginName(){return"CKBoxEditing"}static get requires(){return["CloudServices","LinkEditing","PictureEditing",Zk]}async init(){const t=this.editor,e=!!t.config.get("ckbox"),n=!!window.CKBox;if(!e&&!n)return;this._initConfig();const o=t.plugins.get("CloudServicesCore"),i=t.config.get("ckbox.tokenUrl"),r=t.config.get("cloudServices.tokenUrl");this._token=i===r?t.plugins.get("CloudServices").token:await o.createToken(i).init(),t.config.get("ckbox.ignoreDataId")||(this._initSchema(),this._initConversion(),this._initFixers()),n&&t.commands.add("ckbox",new $k(t))}getToken(){return this._token}_initConfig(){const t=this.editor;t.config.define("ckbox",{serviceOrigin:"https://api.ckbox.io",assetsOrigin:"https://ckbox.cloud",defaultUploadCategories:null,ignoreDataId:!1,language:t.locale.uiLanguage,theme:"default",tokenUrl:t.config.get("cloudServices.tokenUrl")});if(!t.config.get("ckbox.tokenUrl"))throw new b("ckbox-plugin-missing-token-url",this);t.plugins.has("ImageBlockEditing")||t.plugins.has("ImageInlineEditing")||_("ckbox-plugin-image-feature-missing",t)}_initSchema(){const t=this.editor.model.schema;t.extend("$text",{allowAttributes:"ckboxLinkId"}),t.isRegistered("imageBlock")&&t.extend("imageBlock",{allowAttributes:["ckboxImageId","ckboxLinkId"]}),t.isRegistered("imageInline")&&t.extend("imageInline",{allowAttributes:["ckboxImageId","ckboxLinkId"]}),t.addAttributeCheck(((t,e)=>{if(!!!t.last.getAttribute("linkHref")&&"ckboxLinkId"===e)return!1}))}_initConversion(){const t=this.editor;t.conversion.for("downcast").add((t=>{t.on("attribute:ckboxLinkId:imageBlock",((t,e,n)=>{const{writer:o,mapper:i,consumable:r}=n;if(!r.consume(e.item,t.name))return;const s=[...i.toViewElement(e.item).getChildren()].find((t=>"a"===t.name));s&&(e.item.hasAttribute("ckboxLinkId")?o.setAttribute("data-ckbox-resource-id",e.item.getAttribute("ckboxLinkId"),s):o.removeAttribute("data-ckbox-resource-id",s))}),{priority:"low"}),t.on("attribute:ckboxLinkId",((t,e,n)=>{const{writer:o,mapper:i,consumable:r}=n;if(r.consume(e.item,t.name)){if(e.attributeOldValue){const t=nb(o,e.attributeOldValue);o.unwrap(i.toViewRange(e.range),t)}if(e.attributeNewValue){const t=nb(o,e.attributeNewValue);if(e.item.is("selection")){const e=o.document.selection;o.wrap(e.getFirstRange(),t)}else o.wrap(i.toViewRange(e.range),t)}}}),{priority:"low"})})),t.conversion.for("upcast").add((t=>{t.on("element:a",((t,e,n)=>{const{writer:o,consumable:i}=n;if(!e.viewItem.getAttribute("href"))return;if(!i.consume(e.viewItem,{attributes:["data-ckbox-resource-id"]}))return;const r=e.viewItem.getAttribute("data-ckbox-resource-id");if(r)if(e.modelRange)for(let t of e.modelRange.getItems())t.is("$textProxy")&&(t=t.textNode),ob(t)&&o.setAttribute("ckboxLinkId",r,t);else{const t=e.modelCursor.nodeBefore||e.modelCursor.parent;o.setAttribute("ckboxLinkId",r,t)}}),{priority:"low"})})),t.conversion.for("downcast").attributeToAttribute({model:"ckboxImageId",view:"data-ckbox-resource-id"}),t.conversion.for("upcast").elementToAttribute({model:{key:"ckboxImageId",value:t=>t.getAttribute("data-ckbox-resource-id")},view:{attributes:{"data-ckbox-resource-id":/[\s\S]+/}}})}_initFixers(){const t=this.editor,e=t.model,n=e.document.selection;e.document.registerPostFixer(function(t){return e=>{let n=!1;const o=t.model,i=t.commands.get("ckbox");if(!i)return n;for(const t of o.document.differ.getChanges()){if("insert"!==t.type&&"attribute"!==t.type)continue;const o="insert"===t.type?new Fl(t.position,t.position.getShiftedBy(t.length)):t.range,r="attribute"===t.type&&"linkHref"===t.attributeKey&&null===t.attributeNewValue;for(const t of o.getItems()){if(r&&t.hasAttribute("ckboxLinkId")){e.removeAttribute("ckboxLinkId",t),n=!0;continue}const o=eb(t,i._chosenAssets);for(const i of o){const o="image"===i.type?"ckboxImageId":"ckboxLinkId";i.id!==t.getAttribute(o)&&(e.setAttribute(o,i.id,t),n=!0)}}}return n}}(t)),e.document.registerPostFixer(function(t){return e=>{!t.hasAttribute("linkHref")&&t.hasAttribute("ckboxLinkId")&&e.removeSelectionAttribute("ckboxLinkId")}}(n))}}function eb(t,e){const n=t.is("element","imageInline")||t.is("element","imageBlock"),o=t.hasAttribute("linkHref");return[...e].filter((e=>"image"===e.type&&n?e.attributes.imageFallbackUrl===t.getAttribute("src"):"link"===e.type&&o?e.attributes.linkHref===t.getAttribute("linkHref"):void 0))}function nb(t,e){const n=t.createAttributeElement("a",{"data-ckbox-resource-id":e},{priority:5});return t.setCustomProperty("link",!0,n),n}function ob(t){return!!t.is("$text")||!(!t.is("element","imageInline")&&!t.is("element","imageBlock"))}class ib extends br{static get pluginName(){return"CKFinderUI"}init(){const t=this.editor,e=t.ui.componentFactory,n=t.t;e.add("ckfinder",(e=>{const o=t.commands.get("ckfinder"),i=new mg(e);return i.set({label:n("Insert image or file"),icon:'',tooltip:!0}),i.bind("isEnabled").to(o),i.on("execute",(()=>{t.execute("ckfinder"),t.editing.view.focus()})),i}))}}class rb extends _r{constructor(t){super(t),this._affectsData=!1,this.stopListening(this.editor.model.document,"change"),this.listenTo(this.editor.model.document,"change",(()=>this.refresh()),{priority:"low"})}refresh(){const t=this.editor.commands.get("insertImage"),e=this.editor.commands.get("link");this.isEnabled=t.isEnabled||e.isEnabled}execute(){const t=this.editor,e=this.editor.config.get("ckfinder.openerMethod")||"modal";if("popup"!=e&&"modal"!=e)throw new b("ckfinder-unknown-openermethod",t);const n=this.editor.config.get("ckfinder.options")||{};n.chooseFiles=!0;const o=n.onInit;n.language||(n.language=t.locale.uiLanguage),n.onInit=e=>{o&&o(e),e.on("files:choose",(n=>{const o=n.data.files.toArray(),i=o.filter((t=>!t.isImage())),r=o.filter((t=>t.isImage()));for(const e of i)t.execute("link",e.getUrl());const s=[];for(const t of r){const n=t.getUrl();s.push(n||e.request("file:getProxyUrl",{file:t}))}s.length&&sb(t,s)})),e.on("file:choose:resizedImage",(e=>{const n=e.data.resizedUrl;if(n)sb(t,[n]);else{const e=t.plugins.get("Notification"),n=t.locale.t;e.showWarning(n("Could not obtain resized image URL."),{title:n("Selecting resized image failed"),namespace:"ckfinder"})}}))},window.CKFinder[e](n)}}function sb(t,e){if(t.commands.get("insertImage").isEnabled)t.execute("insertImage",{source:e});else{const e=t.plugins.get("Notification"),n=t.locale.t;e.showWarning(n("Could not insert image at the current position."),{title:n("Inserting image failed"),namespace:"ckfinder"})}}class ab extends br{static get pluginName(){return"CKFinderEditing"}static get requires(){return[Om,"LinkEditing"]}init(){const t=this.editor;if(!t.plugins.has("ImageBlockEditing")&&!t.plugins.has("ImageInlineEditing"))throw new b("ckfinder-missing-image-plugin",t);t.commands.add("ckfinder",new rb(t))}}class cb extends br{static get pluginName(){return"CloudServicesUploadAdapter"}static get requires(){return["CloudServices",dk]}init(){const t=this.editor,e=t.plugins.get("CloudServices"),n=e.token,o=e.uploadUrl;n&&(this._uploadGateway=t.plugins.get("CloudServicesCore").createUploadGateway(n,o),t.plugins.get(dk).createUploadAdapter=t=>new lb(this._uploadGateway,t))}}class lb{constructor(t,e){this.uploadGateway=t,this.loader=e}upload(){return this.loader.file.then((t=>(this.fileUploader=this.uploadGateway.upload(t),this.fileUploader.on("progress",((t,e)=>{this.loader.uploadTotal=e.total,this.loader.uploaded=e.uploaded})),this.fileUploader.send())))}abort(){this.fileUploader.abort()}}class db extends _r{refresh(){const t=this.editor.model,e=lr(t.document.selection.getSelectedBlocks());this.value=!!e&&e.is("element","paragraph"),this.isEnabled=!!e&&hb(e,t.schema)}execute(t={}){const e=this.editor.model,n=e.document;e.change((o=>{const i=(t.selection||n.selection).getSelectedBlocks();for(const t of i)!t.is("element","paragraph")&&hb(t,e.schema)&&o.rename(t,"paragraph")}))}}function hb(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class ub extends _r{execute(t){const e=this.editor.model,n=t.attributes;let o=t.position;e.change((t=>{const i=t.createElement("paragraph");if(n&&e.schema.setAllowedAttributes(i,n,t),!e.schema.checkChild(o.parent,i)){const n=e.schema.findAllowedParent(o,i);if(!n)return;o=t.split(o,n).position}e.insertContent(i,o),t.setSelection(i,"in")}))}}class gb extends br{static get pluginName(){return"Paragraph"}init(){const t=this.editor,e=t.model;t.commands.add("paragraph",new db(t)),t.commands.add("insertParagraph",new ub(t)),e.schema.register("paragraph",{inheritAllFrom:"$block"}),t.conversion.elementToElement({model:"paragraph",view:"p"}),t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>gb.paragraphLikeElements.has(t.name)?t.isEmpty?null:e.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}gb.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);class mb extends _r{constructor(t,e){super(t),this.modelElements=e}refresh(){const t=lr(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name,this.isEnabled=!!t&&this.modelElements.some((e=>pb(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model,n=e.document,o=t.value;e.change((t=>{const i=Array.from(n.selection.getSelectedBlocks()).filter((t=>pb(t,o,e.schema)));for(const e of i)e.is("element",o)||t.rename(e,o)}))}}function pb(t,e,n){return n.checkChild(t.parent,e)&&!n.isObject(t)}const fb="paragraph";class kb extends br{static get pluginName(){return"HeadingEditing"}constructor(t){super(t),t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[gb]}init(){const t=this.editor,e=t.config.get("heading.options"),n=[];for(const o of e)"paragraph"!==o.model&&(t.model.schema.register(o.model,{inheritAllFrom:"$block"}),t.conversion.elementToElement(o),n.push(o.model));this._addDefaultH1Conversion(t),t.commands.add("heading",new mb(t,n))}afterInit(){const t=this.editor,e=t.commands.get("enter"),n=t.config.get("heading.options");e&&this.listenTo(e,"afterExecute",((e,o)=>{const i=t.model.document.selection.getFirstPosition().parent;n.some((t=>i.is("element",t.model)))&&!i.is("element",fb)&&0===i.childCount&&o.writer.rename(i,fb)}))}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:p.get("low")+1})}}var bb=n(8733),wb={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(bb.Z,wb);bb.Z.locals;class _b extends br{static get pluginName(){return"HeadingUI"}init(){const t=this.editor,e=t.t,n=function(t){const e=t.t,n={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=n[t.title];return e&&e!=t.title&&(t.title=e),t}))}(t),o=e("Choose heading"),i=e("Heading");t.ui.componentFactory.add("heading",(e=>{const r={},s=new cr,a=t.commands.get("heading"),c=t.commands.get("paragraph"),l=[a];for(const t of n){const e={type:"button",model:new Rm({label:t.title,class:t.class,withText:!0})};"paragraph"===t.model?(e.model.bind("isOn").to(c,"value"),e.model.set("commandName","paragraph"),l.push(c)):(e.model.bind("isOn").to(a,"value",(e=>e===t.model)),e.model.set({commandName:"heading",commandValue:t.model})),s.add(e),r[t.model]=t.title}const d=Xg(e);return nm(d,s),d.buttonView.set({isOn:!1,withText:!0,tooltip:i}),d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),d.bind("isEnabled").toMany(l,"isEnabled",((...t)=>t.some((t=>t)))),d.buttonView.bind("label").to(a,"value",c,"value",((t,e)=>{const n=t||e&&"paragraph";return"boolean"==typeof n?o:r[n]?r[n]:o})),this.listenTo(d,"execute",(e=>{const{commandName:n,commandValue:o}=e.source;t.execute(n,o?{value:o}:void 0),t.editing.view.focus()})),d}))}}class Ab extends _r{refresh(){const t=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!t,this.isEnabled&&t.hasAttribute("alt")?this.value=t.getAttribute("alt"):this.value=!1}execute(t){const e=this.editor,n=e.plugins.get("ImageUtils"),o=e.model,i=n.getClosestSelectedImageElement(o.document.selection);o.change((e=>{e.setAttribute("alt",t.newValue,i)}))}}function Cb(t){return t.createContainerElement("figure",{class:"image"},[t.createEmptyElement("img"),t.createSlot()])}function vb(t,e){const n=t.plugins.get("ImageUtils"),o=t.plugins.has("ImageInlineEditing")&&t.plugins.has("ImageBlockEditing");return t=>{if(!n.isInlineImageView(t))return null;if(!o)return i(t);return("block"==t.getStyle("display")||t.findAncestor(n.isBlockImageView)?"imageBlock":"imageInline")!==e?null:i(t)};function i(t){const e={name:!0};return t.hasAttribute("src")&&(e.attributes=["src"]),e}}function yb(t,e){const n=lr(e.getSelectedBlocks());return!n||t.isObject(n)||n.isEmpty&&"listItem"!=n.name?"imageBlock":"imageInline"}class xb extends br{static get pluginName(){return"ImageUtils"}isImage(t){return this.isInlineImage(t)||this.isBlockImage(t)}isInlineImageView(t){return!!t&&t.is("element","img")}isBlockImageView(t){return!!t&&t.is("element","figure")&&t.hasClass("image")}insertImage(t={},e=null,n=null){const o=this.editor,i=o.model,r=i.document.selection;n=Eb(o,e||r,n),t={...Object.fromEntries(r.getAttributes()),...t};for(const e in t)i.schema.checkAttribute(n,e)||delete t[e];return i.change((o=>{const r=o.createElement(n,t);return i.insertObject(r,e,null,{setSelection:"on",findOptimalPosition:!e&&"imageInline"!=n}),r.parent?r:null}))}getClosestSelectedImageWidget(t){const e=t.getFirstPosition();if(!e)return null;const n=t.getSelectedElement();if(n&&this.isImageWidget(n))return n;let o=e.parent;for(;o;){if(o.is("element")&&this.isImageWidget(o))return o;o=o.parent}return null}getClosestSelectedImageElement(t){const e=t.getSelectedElement();return this.isImage(e)?e:t.getFirstPosition().findAncestor("imageBlock")}isImageAllowed(){const t=this.editor.model.document.selection;return function(t,e){const n=Eb(t,e);if("imageBlock"==n){const n=function(t,e){const n=hf(t,e),o=n.start.parent;if(o.isEmpty&&!o.is("element","$root"))return o.parent;return o}(e,t.model);if(t.model.schema.checkChild(n,"imageBlock"))return!0}else if(t.model.schema.checkChild(e.focus,"imageInline"))return!0;return!1}(this.editor,t)&&function(t){return[...t.focus.getAncestors()].every((t=>!t.is("element","imageBlock")))}(t)}toImageWidget(t,e,n){e.setCustomProperty("image",!0,t);return sf(t,e,{label:()=>{const e=this.findViewImgElement(t).getAttribute("alt");return e?`${e} ${n}`:n}})}isImageWidget(t){return!!t.getCustomProperty("image")&&rf(t)}isBlockImage(t){return!!t&&t.is("element","imageBlock")}isInlineImage(t){return!!t&&t.is("element","imageInline")}findViewImgElement(t){if(this.isInlineImageView(t))return t;const e=this.editor.editing.view;for(const{item:n}of e.createRangeIn(t))if(this.isInlineImageView(n))return n}}function Eb(t,e,n){const o=t.model.schema,i=t.config.get("image.insert.type");return t.plugins.has("ImageBlockEditing")?t.plugins.has("ImageInlineEditing")?n||("inline"===i?"imageInline":"block"===i?"imageBlock":e.is("selection")?yb(o,e):o.checkChild(e,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}class Db extends br{static get requires(){return[xb]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new Ab(this.editor))}}var Ib=n(1905),Tb={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Ib.Z,Tb);Ib.Z.locals;var Mb=n(6764),Sb={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Mb.Z,Sb);Mb.Z.locals;class Nb extends Fu{constructor(t){super(t);const e=this.locale.t;this.focusTracker=new dr,this.keystrokes=new hr,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(e("Save"),Bu.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(e("Cancel"),Bu.cancel,"ck-button-cancel","cancel"),this._focusables=new Ou,this._focusCycler=new Sg({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]}),zu(this)}render(){super.render(),this.keystrokes.listenTo(this.element),Lu({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createButton(t,e,n,o){const i=new mg(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}_createLabeledInputView(){const t=this.locale.t,e=new zm(this.locale,Lm);return e.label=t("Text alternative"),e}}function Bb(t){const e=t.editing.view,n=lm.defaultPositions,o=t.plugins.get("ImageUtils");return{target:e.domConverter.mapViewToDom(o.getClosestSelectedImageWidget(e.document.selection)),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast,n.viewportStickyNorth]}}class Pb extends br{static get requires(){return[Wm]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton()}destroy(){super.destroy(),this._form&&this._form.destroy()}_createButton(){const t=this.editor,e=t.t;t.ui.componentFactory.add("imageTextAlternative",(n=>{const o=t.commands.get("imageTextAlternative"),i=new mg(n);return i.set({label:e("Change image text alternative"),icon:Bu.lowVision,tooltip:!0}),i.bind("isEnabled").to(o,"isEnabled"),i.bind("isOn").to(o,"value",(t=>!!t)),this.listenTo(i,"execute",(()=>{this._showForm()})),i}))}_createForm(){const t=this.editor,e=t.editing.view.document,n=t.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new Nb(t.locale),this._form.render(),this.listenTo(this._form,"submit",(()=>{t.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)})),this.listenTo(this._form,"cancel",(()=>{this._hideForm(!0)})),this._form.keystrokes.set("Esc",((t,e)=>{this._hideForm(!0),e()})),this.listenTo(t.ui,"update",(()=>{n.getClosestSelectedImageWidget(e.selection)?this._isVisible&&function(t){const e=t.plugins.get("ContextualBalloon");if(t.plugins.get("ImageUtils").getClosestSelectedImageWidget(t.editing.view.document.selection)){const n=Bb(t);e.updatePosition(n)}}(t):this._hideForm(!0)})),Pu({emitter:this._form,activator:()=>this._isVisible,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;this._form||this._createForm();const t=this.editor,e=t.commands.get("imageTextAlternative"),n=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:Bb(t)}),n.fieldView.value=n.fieldView.element.value=e.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(t){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),t&&this.editor.editing.view.focus())}get _isVisible(){return!!this._balloon&&this._balloon.visibleView===this._form}get _isInBalloon(){return!!this._balloon&&this._balloon.hasView(this._form)}}class zb extends br{static get requires(){return[Db,Pb]}static get pluginName(){return"ImageTextAlternative"}}function Lb(t,e){return t=>{t.on(`attribute:srcset:${e}`,n)};function n(e,n,o){if(!o.consumable.consume(n.item,e.name))return;const i=o.writer,r=o.mapper.toViewElement(n.item),s=t.findViewImgElement(r);if(null===n.attributeNewValue){const t=n.attributeOldValue;t.data&&(i.removeAttribute("srcset",s),i.removeAttribute("sizes",s),t.width&&i.removeAttribute("width",s))}else{const t=n.attributeNewValue;t.data&&(i.setAttribute("srcset",t.data,s),i.setAttribute("sizes","100vw",s),t.width&&i.setAttribute("width",t.width,s))}}}function Ob(t,e,n){return t=>{t.on(`attribute:${n}:${e}`,o)};function o(e,n,o){if(!o.consumable.consume(n.item,e.name))return;const i=o.writer,r=o.mapper.toViewElement(n.item),s=t.findViewImgElement(r);i.setAttribute(n.attributeKey,n.attributeNewValue||"",s)}}class Rb extends lc{observe(t){this.listenTo(t,"load",((t,e)=>{const n=e.target;this.checkShouldIgnoreEventFromTarget(n)||"IMG"==n.tagName&&this._fireEvents(e)}),{useCapture:!0})}_fireEvents(t){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",t))}}class jb extends _r{constructor(t){super(t);const e=t.config.get("image.insert.type");t.plugins.has("ImageBlockEditing")||"block"===e&&w("image-block-plugin-required"),t.plugins.has("ImageInlineEditing")||"inline"===e&&w("image-inline-plugin-required")}refresh(){this.isEnabled=this.editor.plugins.get("ImageUtils").isImageAllowed()}execute(t){const e=or(t.source),n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageUtils"),i=Object.fromEntries(n.getAttributes());e.forEach(((t,e)=>{const r=n.getSelectedElement();if("string"==typeof t&&(t={src:t}),e&&r&&o.isImage(r)){const e=this.editor.model.createPositionAfter(r);o.insertImage({...t,...i},e)}else o.insertImage({...t,...i})}))}}class Fb extends _r{refresh(){const t=this.editor.plugins.get("ImageUtils"),e=this.editor.model.document.selection.getSelectedElement();this.isEnabled=t.isImage(e),this.value=this.isEnabled?e.getAttribute("src"):null}execute(t){const e=this.editor.model.document.selection.getSelectedElement();this.editor.model.change((n=>{n.setAttribute("src",t.source,e),n.removeAttribute("srcset",e),n.removeAttribute("sizes",e)}))}}class Vb extends br{static get requires(){return[xb]}static get pluginName(){return"ImageEditing"}init(){const t=this.editor,e=t.conversion;t.editing.view.addObserver(Rb),e.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:t=>{const e={data:t.getAttribute("srcset")};return t.hasAttribute("width")&&(e.width=t.getAttribute("width")),e}}});const n=new jb(t),o=new Fb(t);t.commands.add("insertImage",n),t.commands.add("replaceImageSource",o),t.commands.add("imageInsert",n)}}class Hb extends _r{constructor(t,e){super(t),this._modelElementName=e}refresh(){const t=this.editor.plugins.get("ImageUtils"),e=t.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=t.isInlineImage(e):this.isEnabled=t.isBlockImage(e)}execute(){const t=this.editor,e=this.editor.model,n=t.plugins.get("ImageUtils"),o=n.getClosestSelectedImageElement(e.document.selection),i=Object.fromEntries(o.getAttributes());return i.src||i.uploadId?e.change((t=>{const r=Array.from(e.markers).filter((t=>t.getRange().containsItem(o))),s=n.insertImage(i,e.createSelection(o,"on"),this._modelElementName);if(!s)return null;const a=t.createRangeOn(s);for(const e of r){const n=e.getRange(),o="$graveyard"!=n.root.rootName?n.getJoined(a,!0):a;t.updateMarker(e,{range:o})}return{oldElement:o,newElement:s}})):null}}class Ub extends br{static get requires(){return[Vb,xb,sp]}static get pluginName(){return"ImageBlockEditing"}init(){const t=this.editor;t.model.schema.register("imageBlock",{inheritAllFrom:"$blockObject",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),t.plugins.has("ImageInlineEditing")&&(t.commands.add("imageTypeBlock",new Hb(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const t=this.editor,e=t.t,n=t.conversion,o=t.plugins.get("ImageUtils");n.for("dataDowncast").elementToStructure({model:"imageBlock",view:(t,{writer:e})=>Cb(e)}),n.for("editingDowncast").elementToStructure({model:"imageBlock",view:(t,{writer:n})=>o.toImageWidget(Cb(n),n,e("image widget"))}),n.for("downcast").add(Ob(o,"imageBlock","src")).add(Ob(o,"imageBlock","alt")).add(Lb(o,"imageBlock")),n.for("upcast").elementToElement({view:vb(t,"imageBlock"),model:(t,{writer:e})=>e.createElement("imageBlock",t.hasAttribute("src")?{src:t.getAttribute("src")}:null)}).add(function(t){return t=>{t.on("element:figure",e)};function e(e,n,o){if(!o.consumable.test(n.viewItem,{name:!0,classes:"image"}))return;const i=t.findViewImgElement(n.viewItem);if(!i||!o.consumable.test(i,{name:!0}))return;o.consumable.consume(n.viewItem,{name:!0,classes:"image"});const r=lr(o.convertItem(i,n.modelCursor).modelRange.getItems());r?(o.convertChildren(n.viewItem,r),o.updateConversionResult(r,n)):o.consumable.revert(n.viewItem,{name:!0,classes:"image"})}}(o))}_setupClipboardIntegration(){const t=this.editor,e=t.model,n=t.editing.view,o=t.plugins.get("ImageUtils");this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((i,r)=>{const s=Array.from(r.content.getChildren());let a;if(!s.every(o.isInlineImageView))return;a=r.targetRanges?t.editing.mapper.toModelRange(r.targetRanges[0]):e.document.selection.getFirstRange();const c=e.createSelection(a);if("imageBlock"===yb(e.schema,c)){const t=new Eu(n.document),e=s.map((e=>t.createElement("figure",{class:"image"},e)));r.content=t.createDocumentFragment(e)}}))}}var Wb=n(3508),qb={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Wb.Z,qb);Wb.Z.locals;class Gb extends br{static get requires(){return[Ub,Df,zb]}static get pluginName(){return"ImageBlock"}}class $b extends br{static get requires(){return[Vb,xb,sp]}static get pluginName(){return"ImageInlineEditing"}init(){const t=this.editor,e=t.model.schema;e.register("imageInline",{inheritAllFrom:"$inlineObject",allowAttributes:["alt","src","srcset"]}),e.addChildCheck(((t,e)=>{if(t.endsWith("caption")&&"imageInline"===e.name)return!1})),this._setupConversion(),t.plugins.has("ImageBlockEditing")&&(t.commands.add("imageTypeInline",new Hb(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const t=this.editor,e=t.t,n=t.conversion,o=t.plugins.get("ImageUtils");n.for("dataDowncast").elementToElement({model:"imageInline",view:(t,{writer:e})=>e.createEmptyElement("img")}),n.for("editingDowncast").elementToStructure({model:"imageInline",view:(t,{writer:n})=>o.toImageWidget(function(t){return t.createContainerElement("span",{class:"image-inline"},t.createEmptyElement("img"))}(n),n,e("image widget"))}),n.for("downcast").add(Ob(o,"imageInline","src")).add(Ob(o,"imageInline","alt")).add(Lb(o,"imageInline")),n.for("upcast").elementToElement({view:vb(t,"imageInline"),model:(t,{writer:e})=>e.createElement("imageInline",t.hasAttribute("src")?{src:t.getAttribute("src")}:null)})}_setupClipboardIntegration(){const t=this.editor,e=t.model,n=t.editing.view,o=t.plugins.get("ImageUtils");this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((i,r)=>{const s=Array.from(r.content.getChildren());let a;if(!s.every(o.isBlockImageView))return;a=r.targetRanges?t.editing.mapper.toModelRange(r.targetRanges[0]):e.document.selection.getFirstRange();const c=e.createSelection(a);if("imageInline"===yb(e.schema,c)){const t=new Eu(n.document),e=s.map((e=>1===e.childCount?(Array.from(e.getAttributes()).forEach((n=>t.setAttribute(...n,o.findViewImgElement(e)))),e.getChild(0)):e));r.content=t.createDocumentFragment(e)}}))}}class Yb extends br{static get requires(){return[$b,Df,zb]}static get pluginName(){return"ImageInline"}}class Kb extends _r{refresh(){const t=this.editor,e=t.plugins.get("ImageCaptionUtils");if(!t.plugins.has(Ub))return this.isEnabled=!1,void(this.value=!1);const n=t.model.document.selection,o=n.getSelectedElement();if(!o){const t=e.getCaptionFromModelSelection(n);return this.isEnabled=!!t,void(this.value=!!t)}this.isEnabled=this.editor.plugins.get("ImageUtils").isImage(o),this.isEnabled?this.value=!!e.getCaptionFromImageModelElement(o):this.value=!1}execute(t={}){const{focusCaptionOnShow:e}=t;this.editor.model.change((t=>{this.value?this._hideImageCaption(t):this._showImageCaption(t,e)}))}_showImageCaption(t,e){const n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageCaptionEditing");let i=n.getSelectedElement();const r=o._getSavedCaption(i);this.editor.plugins.get("ImageUtils").isInlineImage(i)&&(this.editor.execute("imageTypeBlock"),i=n.getSelectedElement());const s=r||t.createElement("caption");t.append(s,i),e&&t.setSelection(s,"in")}_hideImageCaption(t){const e=this.editor,n=e.model.document.selection,o=e.plugins.get("ImageCaptionEditing"),i=e.plugins.get("ImageCaptionUtils");let r,s=n.getSelectedElement();s?r=i.getCaptionFromImageModelElement(s):(r=i.getCaptionFromModelSelection(n),s=r.parent),o._saveCaption(s,r),t.setSelection(s,"on"),t.remove(r)}}class Qb extends br{static get pluginName(){return"ImageCaptionUtils"}static get requires(){return[xb]}getCaptionFromImageModelElement(t){for(const e of t.getChildren())if(e&&e.is("element","caption"))return e;return null}getCaptionFromModelSelection(t){const e=this.editor.plugins.get("ImageUtils"),n=t.getFirstPosition().findAncestor("caption");return n&&e.isBlockImage(n.parent)?n:null}matchImageCaptionViewElement(t){const e=this.editor.plugins.get("ImageUtils");return"figcaption"==t.name&&e.isBlockImageView(t.parent)?{name:!0}:null}}class Zb extends br{static get requires(){return[xb,Qb]}static get pluginName(){return"ImageCaptionEditing"}constructor(t){super(t),this._savedCaptionsMap=new WeakMap}init(){const t=this.editor,e=t.model.schema;e.isRegistered("caption")?e.extend("caption",{allowIn:"imageBlock"}):e.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),t.commands.add("toggleImageCaption",new Kb(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration(),this._registerCaptionReconversion()}_setupConversion(){const t=this.editor,e=t.editing.view,n=t.plugins.get("ImageUtils"),o=t.plugins.get("ImageCaptionUtils"),i=t.t;t.conversion.for("upcast").elementToElement({view:t=>o.matchImageCaptionViewElement(t),model:"caption"}),t.conversion.for("dataDowncast").elementToElement({model:"caption",view:(t,{writer:e})=>n.isBlockImage(t.parent)?e.createContainerElement("figcaption"):null}),t.conversion.for("editingDowncast").elementToElement({model:"caption",view:(t,{writer:o})=>{if(!n.isBlockImage(t.parent))return null;const r=o.createEditableElement("figcaption");o.setCustomProperty("imageCaption",!0,r),Sr({view:e,element:r,text:i("Enter image caption"),keepOnFocus:!0});const s=t.parent.getAttribute("alt");return df(r,o,{label:s?i("Caption for image: %0",[s]):i("Caption for the image")})}})}_setupImageTypeCommandsIntegration(){const t=this.editor,e=t.plugins.get("ImageUtils"),n=t.plugins.get("ImageCaptionUtils"),o=t.commands.get("imageTypeInline"),i=t.commands.get("imageTypeBlock"),r=t=>{if(!t.return)return;const{oldElement:o,newElement:i}=t.return;if(!o)return;if(e.isBlockImage(o)){const t=n.getCaptionFromImageModelElement(o);if(t)return void this._saveCaption(i,t)}const r=this._getSavedCaption(o);r&&this._saveCaption(i,r)};o&&this.listenTo(o,"execute",r,{priority:"low"}),i&&this.listenTo(i,"execute",r,{priority:"low"})}_getSavedCaption(t){const e=this._savedCaptionsMap.get(t);return e?Sl.fromJSON(e):null}_saveCaption(t,e){this._savedCaptionsMap.set(t,e.toJSON())}_registerCaptionReconversion(){const t=this.editor,e=t.model,n=t.plugins.get("ImageUtils"),o=t.plugins.get("ImageCaptionUtils");e.document.on("change:data",(()=>{const i=e.document.differ.getChanges();for(const e of i){if("alt"!==e.attributeKey)continue;const i=e.range.start.nodeAfter;if(n.isBlockImage(i)){const e=o.getCaptionFromImageModelElement(i);if(!e)return;t.editing.reconvertItem(e)}}}))}}class Jb extends br{static get requires(){return[Qb]}static get pluginName(){return"ImageCaptionUI"}init(){const t=this.editor,e=t.editing.view,n=t.plugins.get("ImageCaptionUtils"),o=t.t;t.ui.componentFactory.add("toggleImageCaption",(i=>{const r=t.commands.get("toggleImageCaption"),s=new mg(i);return s.set({icon:Bu.caption,tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),s.bind("label").to(r,"value",(t=>o(t?"Toggle caption off":"Toggle caption on"))),this.listenTo(s,"execute",(()=>{t.execute("toggleImageCaption",{focusCaptionOnShow:!0});const o=n.getCaptionFromModelSelection(t.model.document.selection);if(o){const n=t.editing.mapper.toViewElement(o);e.scrollToTheSelection(),e.change((t=>{t.addClass("image__caption_highlighted",n)}))}t.editing.view.focus()})),s}))}}var Xb=n(2640),tw={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Xb.Z,tw);Xb.Z.locals;class ew extends _r{constructor(t,e){super(t),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(e.map((t=>{if(t.isDefault)for(const e of t.modelElements)this._defaultStyles[e]=t.name;return[t.name,t]})))}refresh(){const t=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!t,this.isEnabled?t.hasAttribute("imageStyle")?this.value=t.getAttribute("imageStyle"):this.value=this._defaultStyles[t.name]:this.value=!1}execute(t={}){const e=this.editor,n=e.model,o=e.plugins.get("ImageUtils");n.change((e=>{const i=t.value;let r=o.getClosestSelectedImageElement(n.document.selection);i&&this.shouldConvertImageType(i,r)&&(this.editor.execute(o.isBlockImage(r)?"imageTypeInline":"imageTypeBlock"),r=o.getClosestSelectedImageElement(n.document.selection)),!i||this._styles.get(i).isDefault?e.removeAttribute("imageStyle",r):e.setAttribute("imageStyle",i,r)}))}shouldConvertImageType(t,e){return!this._styles.get(t).modelElements.includes(e.name)}}const{objectFullWidth:nw,objectInline:ow,objectLeft:iw,objectRight:rw,objectCenter:sw,objectBlockLeft:aw,objectBlockRight:cw}=Bu,lw={get inline(){return{name:"inline",title:"In line",icon:ow,modelElements:["imageInline"],isDefault:!0}},get alignLeft(){return{name:"alignLeft",title:"Left aligned image",icon:iw,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"}},get alignBlockLeft(){return{name:"alignBlockLeft",title:"Left aligned image",icon:aw,modelElements:["imageBlock"],className:"image-style-block-align-left"}},get alignCenter(){return{name:"alignCenter",title:"Centered image",icon:sw,modelElements:["imageBlock"],className:"image-style-align-center"}},get alignRight(){return{name:"alignRight",title:"Right aligned image",icon:rw,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"}},get alignBlockRight(){return{name:"alignBlockRight",title:"Right aligned image",icon:cw,modelElements:["imageBlock"],className:"image-style-block-align-right"}},get block(){return{name:"block",title:"Centered image",icon:sw,modelElements:["imageBlock"],isDefault:!0}},get side(){return{name:"side",title:"Side image",icon:rw,modelElements:["imageBlock"],className:"image-style-side"}}},dw={full:nw,left:aw,right:cw,center:sw,inlineLeft:iw,inlineRight:rw,inline:ow},hw=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function uw(t){w("image-style-configuration-definition-invalid",t)}const gw={normalizeStyles:function(t){return(t.configuredStyles.options||[]).map((t=>function(t){t="string"==typeof t?lw[t]?{...lw[t]}:{name:t}:function(t,e){const n={...e};for(const o in t)Object.prototype.hasOwnProperty.call(e,o)||(n[o]=t[o]);return n}(lw[t.name],t);"string"==typeof t.icon&&(t.icon=dw[t.icon]||t.icon);return t}(t))).filter((e=>function(t,{isBlockPluginLoaded:e,isInlinePluginLoaded:n}){const{modelElements:o,name:i}=t;if(!(o&&o.length&&i))return uw({style:t}),!1;{const i=[e?"imageBlock":null,n?"imageInline":null];if(!o.some((t=>i.includes(t))))return w("image-style-missing-dependency",{style:t,missingPlugins:o.map((t=>"imageBlock"===t?"ImageBlockEditing":"ImageInlineEditing"))}),!1}return!0}(e,t)))},getDefaultStylesConfiguration:function(t,e){return t&&e?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:t?{options:["block","side"]}:e?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(t){return t.has("ImageBlockEditing")&&t.has("ImageInlineEditing")?[...hw]:[]},warnInvalidStyle:uw,DEFAULT_OPTIONS:lw,DEFAULT_ICONS:dw,DEFAULT_DROPDOWN_DEFINITIONS:hw};function mw(t,e){for(const n of e)if(n.name===t)return n}class pw extends br{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[xb]}init(){const{normalizeStyles:t,getDefaultStylesConfiguration:e}=gw,n=this.editor,o=n.plugins.has("ImageBlockEditing"),i=n.plugins.has("ImageInlineEditing");n.config.define("image.styles",e(o,i)),this.normalizedStyles=t({configuredStyles:n.config.get("image.styles"),isBlockPluginLoaded:o,isInlinePluginLoaded:i}),this._setupConversion(o,i),this._setupPostFixer(),n.commands.add("imageStyle",new ew(n,this.normalizedStyles))}_setupConversion(t,e){const n=this.editor,o=n.model.schema,i=(r=this.normalizedStyles,(t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=mw(e.attributeNewValue,r),i=mw(e.attributeOldValue,r),s=n.mapper.toViewElement(e.item),a=n.writer;i&&a.removeClass(i.className,s),o&&a.addClass(o.className,s)});var r;const s=function(t){const e={imageInline:t.filter((t=>!t.isDefault&&t.modelElements.includes("imageInline"))),imageBlock:t.filter((t=>!t.isDefault&&t.modelElements.includes("imageBlock")))};return(t,n,o)=>{if(!n.modelRange)return;const i=n.viewItem,r=lr(n.modelRange.getItems());if(r&&o.schema.checkAttribute(r,"imageStyle"))for(const t of e[r.name])o.consumable.consume(i,{classes:t.className})&&o.writer.setAttribute("imageStyle",t.name,r)}}(this.normalizedStyles);n.editing.downcastDispatcher.on("attribute:imageStyle",i),n.data.downcastDispatcher.on("attribute:imageStyle",i),t&&(o.extend("imageBlock",{allowAttributes:"imageStyle"}),n.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),e&&(o.extend("imageInline",{allowAttributes:"imageStyle"}),n.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const t=this.editor,e=t.model.document,n=t.plugins.get(xb),o=new Map(this.normalizedStyles.map((t=>[t.name,t])));e.registerPostFixer((t=>{let i=!1;for(const r of e.differ.getChanges())if("insert"==r.type||"attribute"==r.type&&"imageStyle"==r.attributeKey){let e="insert"==r.type?r.position.nodeAfter:r.range.start.nodeAfter;if(e&&e.is("element","paragraph")&&e.childCount>0&&(e=e.getChild(0)),!n.isImage(e))continue;const s=e.getAttribute("imageStyle");if(!s)continue;const a=o.get(s);a&&a.modelElements.includes(e.name)||(t.removeAttribute("imageStyle",e),i=!0)}return i}))}}var fw=n(5083),kw={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(fw.Z,kw);fw.Z.locals;class bw extends br{static get requires(){return[pw]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const t=this.editor.t;return{"Wrap text":t("Wrap text"),"Break text":t("Break text"),"In line":t("In line"),"Full size image":t("Full size image"),"Side image":t("Side image"),"Left aligned image":t("Left aligned image"),"Centered image":t("Centered image"),"Right aligned image":t("Right aligned image")}}init(){const t=this.editor.plugins,e=this.editor.config.get("image.toolbar")||[],n=ww(t.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const t of n)this._createButton(t);const o=ww([...e.filter(O),...gw.getDefaultDropdownDefinitions(t)],this.localizedDefaultStylesTitles);for(const t of o)this._createDropdown(t,n)}_createDropdown(t,e){const n=this.editor.ui.componentFactory;n.add(t.name,(o=>{let i;const{defaultItem:r,items:s,title:a}=t,c=s.filter((t=>e.find((({name:e})=>_w(e)===t)))).map((t=>{const e=n.create(t);return t===r&&(i=e),e}));s.length!==c.length&&gw.warnInvalidStyle({dropdown:t});const l=Xg(o,Tg),d=l.buttonView,h=d.arrowView;return tm(l,c,{enableActiveItemFocusOnDropdownOpen:!0}),d.set({label:Aw(a,i.label),class:null,tooltip:!0}),h.unbind("label"),h.set({label:a}),d.bind("icon").toMany(c,"isOn",((...t)=>{const e=t.findIndex(Ds);return e<0?i.icon:c[e].icon})),d.bind("label").toMany(c,"isOn",((...t)=>{const e=t.findIndex(Ds);return Aw(a,e<0?i.label:c[e].label)})),d.bind("isOn").toMany(c,"isOn",((...t)=>t.some(Ds))),d.bind("class").toMany(c,"isOn",((...t)=>t.some(Ds)?"ck-splitbutton_flatten":null)),d.on("execute",(()=>{c.some((({isOn:t})=>t))?l.isOpen=!l.isOpen:i.fire("execute")})),l.bind("isEnabled").toMany(c,"isEnabled",((...t)=>t.some(Ds))),this.listenTo(l,"execute",(()=>{this.editor.editing.view.focus()})),l}))}_createButton(t){const e=t.name;this.editor.ui.componentFactory.add(_w(e),(n=>{const o=this.editor.commands.get("imageStyle"),i=new mg(n);return i.set({label:t.title,icon:t.icon,tooltip:!0,isToggleable:!0}),i.bind("isEnabled").to(o,"isEnabled"),i.bind("isOn").to(o,"value",(t=>t===e)),i.on("execute",this._executeCommand.bind(this,e)),i}))}_executeCommand(t){this.editor.execute("imageStyle",{value:t}),this.editor.editing.view.focus()}}function ww(t,e){for(const n of t)e[n.title]&&(n.title=e[n.title]);return t}function _w(t){return`imageStyle:${t}`}function Aw(t,e){return(t?t+": ":"")+e}function Cw(t){const e=t.map((t=>t.replace("+","\\+")));return new RegExp(`^image\\/(${e.join("|")})$`)}function vw(t){return new Promise(((e,n)=>{const o=t.getAttribute("src");fetch(o).then((t=>t.blob())).then((t=>{const n=yw(t,o),i=n.replace("image/",""),r=new File([t],`image.${i}`,{type:n});e(r)})).catch((t=>t&&"TypeError"===t.name?function(t){return function(t){return new Promise(((e,n)=>{const o=wi.document.createElement("img");o.addEventListener("load",(()=>{const t=wi.document.createElement("canvas");t.width=o.width,t.height=o.height;t.getContext("2d").drawImage(o,0,0),t.toBlob((t=>t?e(t):n()))})),o.addEventListener("error",(()=>n())),o.src=t}))}(t).then((e=>{const n=yw(e,t),o=n.replace("image/","");return new File([e],`image.${o}`,{type:n})}))}(o).then(e).catch(n):n(t)))}))}function yw(t,e){return t.type?t.type:e.match(/data:(image\/\w+);base64/)?e.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class xw extends br{static get pluginName(){return"ImageUploadUI"}init(){const t=this.editor,e=t.t,n=n=>{const o=new uk(n),i=t.commands.get("uploadImage"),r=t.config.get("image.upload.types"),s=Cw(r);return o.set({acceptedType:r.map((t=>`image/${t}`)).join(","),allowMultipleFiles:!0}),o.buttonView.set({label:e("Insert image"),icon:Bu.image,tooltip:!0}),o.buttonView.bind("isEnabled").to(i),o.on("done",((e,n)=>{const o=Array.from(n).filter((t=>s.test(t.type)));o.length&&(t.execute("uploadImage",{file:o}),t.editing.view.focus())})),o};t.ui.componentFactory.add("uploadImage",n),t.ui.componentFactory.add("imageUpload",n)}}var Ew=n(3689),Dw={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Ew.Z,Dw);Ew.Z.locals;var Iw=n(4036),Tw={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Iw.Z,Tw);Iw.Z.locals;var Mw=n(3773),Sw={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(Mw.Z,Sw);Mw.Z.locals;class Nw extends br{static get pluginName(){return"ImageUploadProgress"}constructor(t){super(t),this.placeholder="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="}init(){const t=this.editor;t.plugins.has("ImageBlockEditing")&&t.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",((...t)=>this.uploadStatusChange(...t))),t.plugins.has("ImageInlineEditing")&&t.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",((...t)=>this.uploadStatusChange(...t)))}uploadStatusChange(t,e,n){const o=this.editor,i=e.item,r=i.getAttribute("uploadId");if(!n.consumable.consume(e.item,t.name))return;const s=o.plugins.get("ImageUtils"),a=o.plugins.get(dk),c=r?e.attributeNewValue:null,l=this.placeholder,d=o.editing.mapper.toViewElement(i),h=n.writer;if("reading"==c)return Bw(d,h),void Pw(s,l,d,h);if("uploading"==c){const t=a.loaders.get(r);return Bw(d,h),void(t?(zw(d,h),function(t,e,n,o){const i=function(t){const e=t.createUIElement("div",{class:"ck-progress-bar"});return t.setCustomProperty("progressBar",!0,e),e}(e);e.insert(e.createPositionAt(t,"end"),i),n.on("change:uploadedPercent",((t,e,n)=>{o.change((t=>{t.setStyle("width",n+"%",i)}))}))}(d,h,t,o.editing.view),function(t,e,n,o){if(o.data){const i=t.findViewImgElement(e);n.setAttribute("src",o.data,i)}}(s,d,h,t)):Pw(s,l,d,h))}"complete"==c&&a.loaders.get(r)&&function(t,e,n){const o=e.createUIElement("div",{class:"ck-image-upload-complete-icon"});e.insert(e.createPositionAt(t,"end"),o),setTimeout((()=>{n.change((t=>t.remove(t.createRangeOn(o))))}),3e3)}(d,h,o.editing.view),function(t,e){Ow(t,e,"progressBar")}(d,h),zw(d,h),function(t,e){e.removeClass("ck-appear",t)}(d,h)}}function Bw(t,e){t.hasClass("ck-appear")||e.addClass("ck-appear",t)}function Pw(t,e,n,o){n.hasClass("ck-image-upload-placeholder")||o.addClass("ck-image-upload-placeholder",n);const i=t.findViewImgElement(n);i.getAttribute("src")!==e&&o.setAttribute("src",e,i),Lw(n,"placeholder")||o.insert(o.createPositionAfter(i),function(t){const e=t.createUIElement("div",{class:"ck-upload-placeholder-loader"});return t.setCustomProperty("placeholder",!0,e),e}(o))}function zw(t,e){t.hasClass("ck-image-upload-placeholder")&&e.removeClass("ck-image-upload-placeholder",t),Ow(t,e,"placeholder")}function Lw(t,e){for(const n of t.getChildren())if(n.getCustomProperty(e))return n}function Ow(t,e,n){const o=Lw(t,n);o&&e.remove(e.createRangeOn(o))}class Rw extends _r{refresh(){const t=this.editor,e=t.plugins.get("ImageUtils"),n=t.model.document.selection.getSelectedElement();this.isEnabled=e.isImageAllowed()||e.isImage(n)}execute(t){const e=or(t.file),n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageUtils"),i=Object.fromEntries(n.getAttributes());e.forEach(((t,e)=>{const r=n.getSelectedElement();if(e&&r&&o.isImage(r)){const e=this.editor.model.createPositionAfter(r);this._uploadImage(t,i,e)}else this._uploadImage(t,i)}))}_uploadImage(t,e,n){const o=this.editor,i=o.plugins.get(dk).createLoader(t),r=o.plugins.get("ImageUtils");i&&r.insertImage({...e,uploadId:i.id},n)}}class jw extends br{static get requires(){return[dk,Om,sp,xb]}static get pluginName(){return"ImageUploadEditing"}constructor(t){super(t),t.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const t=this.editor,e=t.model.document,n=t.conversion,o=t.plugins.get(dk),i=t.plugins.get("ImageUtils"),r=Cw(t.config.get("image.upload.types")),s=new Rw(t);t.commands.add("uploadImage",s),t.commands.add("imageUpload",s),n.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(t.editing.view.document,"clipboardInput",((e,n)=>{if(o=n.dataTransfer,Array.from(o.types).includes("text/html")&&""!==o.getData("text/html"))return;var o;const i=Array.from(n.dataTransfer.files).filter((t=>!!t&&r.test(t.type)));i.length&&(e.stop(),t.model.change((e=>{n.targetRanges&&e.setSelection(n.targetRanges.map((e=>t.editing.mapper.toModelRange(e)))),t.model.enqueueChange((()=>{t.execute("uploadImage",{file:i})}))})))})),this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",((e,n)=>{const r=Array.from(t.editing.view.createRangeIn(n.content)).filter((t=>function(t,e){return!(!t.isInlineImageView(e)||!e.getAttribute("src"))&&(e.getAttribute("src").match(/^data:image\/\w+;base64,/g)||e.getAttribute("src").match(/^blob:/g))}(i,t.item)&&!t.item.getAttribute("uploadProcessed"))).map((t=>({promise:vw(t.item),imageElement:t.item})));if(!r.length)return;const s=new Eu(t.editing.view.document);for(const t of r){s.setAttribute("uploadProcessed",!0,t.imageElement);const e=o.createLoader(t.promise);e&&(s.setAttribute("src","",t.imageElement),s.setAttribute("uploadId",e.id,t.imageElement))}})),t.editing.view.document.on("dragover",((t,e)=>{e.preventDefault()})),e.on("change",(()=>{const n=e.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),i=new Set;for(const e of n)if("insert"==e.type&&"$text"!=e.name){const n=e.position.nodeAfter,r="$graveyard"==e.position.root.rootName;for(const e of Fw(t,n)){const t=e.getAttribute("uploadId");if(!t)continue;const n=o.loaders.get(t);n&&(r?i.has(t)||n.abort():(i.add(t),this._uploadImageElements.set(t,e),"idle"==n.status&&this._readAndUpload(n)))}}})),this.on("uploadComplete",((t,{imageElement:e,data:n})=>{const o=n.urls?n.urls:n;this.editor.model.change((t=>{t.setAttribute("src",o.default,e),this._parseAndSetSrcsetAttributeOnImage(o,e,t)}))}),{priority:"low"})}afterInit(){const t=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&t.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&t.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(t){const e=this.editor,n=e.model,o=e.locale.t,r=e.plugins.get(dk),s=e.plugins.get(Om),a=e.plugins.get("ImageUtils"),c=this._uploadImageElements;return n.enqueueChange({isUndoable:!1},(e=>{e.setAttribute("uploadStatus","reading",c.get(t.id))})),t.read().then((()=>{const o=t.upload(),r=c.get(t.id);if(i.isSafari){const t=e.editing.mapper.toViewElement(r),n=a.findViewImgElement(t);e.editing.view.once("render",(()=>{if(!n.parent)return;const t=e.editing.view.domConverter.mapViewToDom(n.parent);if(!t)return;const o=t.style.display;t.style.display="none",t._ckHack=t.offsetHeight,t.style.display=o}))}return n.enqueueChange({isUndoable:!1},(t=>{t.setAttribute("uploadStatus","uploading",r)})),o})).then((e=>{n.enqueueChange({isUndoable:!1},(n=>{const o=c.get(t.id);n.setAttribute("uploadStatus","complete",o),this.fire("uploadComplete",{data:e,imageElement:o})})),l()})).catch((e=>{if("error"!==t.status&&"aborted"!==t.status)throw e;"error"==t.status&&e&&s.showWarning(e,{title:o("Upload failed"),namespace:"upload"}),n.enqueueChange({isUndoable:!1},(e=>{e.remove(c.get(t.id))})),l()}));function l(){n.enqueueChange({isUndoable:!1},(e=>{const n=c.get(t.id);e.removeAttribute("uploadId",n),e.removeAttribute("uploadStatus",n),c.delete(t.id)})),r.destroyLoader(t)}}_parseAndSetSrcsetAttributeOnImage(t,e,n){let o=0;const i=Object.keys(t).filter((t=>{const e=parseInt(t,10);if(!isNaN(e))return o=Math.max(o,e),!0})).map((e=>`${t[e]} ${e}w`)).join(", ");""!=i&&n.setAttribute("srcset",{data:i,width:o},e)}}function Fw(t,e){const n=t.plugins.get("ImageUtils");return Array.from(t.model.createRangeOn(e)).filter((t=>n.isImage(t.item))).map((t=>t.item))}class Vw extends br{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new Cr(t)),t.commands.add("outdent",new Cr(t))}}const Hw='',Uw='';class Ww extends br{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,n=t.t,o="ltr"==e.uiLanguageDirection?Hw:Uw,i="ltr"==e.uiLanguageDirection?Uw:Hw;this._defineButton("indent",n("Increase indent"),o),this._defineButton("outdent",n("Decrease indent"),i)}_defineButton(t,e,n){const o=this.editor;o.ui.componentFactory.add(t,(i=>{const r=o.commands.get(t),s=new mg(i);return s.set({label:e,icon:n,tooltip:!0}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),this.listenTo(s,"execute",(()=>{o.execute(t),o.editing.view.focus()})),s}))}}class qw{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){Array.isArray(t)?t.forEach((t=>this._definitions.add(t))):this._definitions.add(t)}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,n)=>{if(!n.consumable.test(e.item,"attribute:linkHref"))return;if(!e.item.is("selection")&&!n.schema.isInline(e.item))return;const o=n.writer,i=o.document.selection;for(const t of this._definitions){const r=o.createAttributeElement("a",t.attributes,{priority:5});t.classes&&o.addClass(t.classes,r);for(const e in t.styles)o.setStyle(e,t.styles[e],r);o.setCustomProperty("link",!0,r),t.callback(e.attributeNewValue)?e.item.is("selection")?o.wrap(i.getFirstRange(),r):o.wrap(n.mapper.toViewRange(e.range),r):o.unwrap(n.mapper.toViewRange(e.range),r)}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:imageBlock",((t,e,{writer:n,mapper:o})=>{const i=o.toViewElement(e.item),r=Array.from(i.getChildren()).find((t=>"a"===t.name));for(const t of this._definitions){const o=ur(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of o)"class"===t?n.addClass(e,r):n.setAttribute(t,e,r);t.classes&&n.addClass(t.classes,r);for(const e in t.styles)n.setStyle(e,t.styles[e],r)}else{for(const[t,e]of o)"class"===t?n.removeClass(e,r):n.removeAttribute(t,r);t.classes&&n.removeClass(t.classes,r);for(const e in t.styles)n.removeStyle(e,r)}}}))}}}const Gw=function(t,e,n){var o=t.length;return n=void 0===n?o:n,!e&&n>=o?t:ps(t,e,n)};var $w=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const Yw=function(t){return $w.test(t)};const Kw=function(t){return t.split("")};var Qw="\\ud800-\\udfff",Zw="["+Qw+"]",Jw="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Xw="\\ud83c[\\udffb-\\udfff]",t_="[^"+Qw+"]",e_="(?:\\ud83c[\\udde6-\\uddff]){2}",n_="[\\ud800-\\udbff][\\udc00-\\udfff]",o_="(?:"+Jw+"|"+Xw+")"+"?",i_="[\\ufe0e\\ufe0f]?",r_=i_+o_+("(?:\\u200d(?:"+[t_,e_,n_].join("|")+")"+i_+o_+")*"),s_="(?:"+[t_+Jw+"?",Jw,e_,n_,Zw].join("|")+")",a_=RegExp(Xw+"(?="+Xw+")|"+s_+r_,"g");const c_=function(t){return t.match(a_)||[]};const l_=function(t){return Yw(t)?c_(t):Kw(t)};const d_=function(t){return function(e){e=ls(e);var n=Yw(e)?l_(e):void 0,o=n?n[0]:e.charAt(0),i=n?Gw(n,1).join(""):e.slice(1);return o[t]()+i}}("toUpperCase"),h_=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,u_=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i,g_=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,m_=/^((\w+:(\/{2,})?)|(\W))/i,p_="Ctrl+K";function f_(t,{writer:e}){const n=e.createAttributeElement("a",{href:t},{priority:5});return e.setCustomProperty("link",!0,n),n}function k_(t){return function(t){const e=t.replace(h_,"");return e.match(u_)}(t=String(t))?t:"#"}function b_(t,e){return!!t&&e.checkAttribute(t.name,"linkHref")}function w_(t,e){const n=(o=t,g_.test(o)?"mailto:":e);var o;const i=!!n&&!__(t);return t&&i?n+t:t}function __(t){return m_.test(t)}function A_(t){window.open(t,"_blank","noopener")}class C_ extends _r{constructor(t){super(t),this.manualDecorators=new cr,this.automaticDecorators=new qw}restoreManualDecoratorStates(){for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}refresh(){const t=this.editor.model,e=t.document.selection,n=e.getSelectedElement()||lr(e.getSelectedBlocks());b_(n,t.schema)?(this.value=n.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttribute(n,"linkHref")):(this.value=e.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref"));for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}execute(t,e={}){const n=this.editor.model,o=n.document.selection,i=[],r=[];for(const t in e)e[t]?i.push(t):r.push(t);n.change((e=>{if(o.isCollapsed){const s=o.getFirstPosition();if(o.hasAttribute("linkHref")){const a=jp(s,"linkHref",o.getAttribute("linkHref"),n);e.setAttribute("linkHref",t,a),i.forEach((t=>{e.setAttribute(t,!0,a)})),r.forEach((t=>{e.removeAttribute(t,a)})),e.setSelection(e.createPositionAfter(a.end.nodeBefore))}else if(""!==t){const r=ur(o.getAttributes());r.set("linkHref",t),i.forEach((t=>{r.set(t,!0)}));const{end:a}=n.insertContent(e.createText(t,r),s);e.setSelection(a)}["linkHref",...i,...r].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const s=n.schema.getValidRanges(o.getRanges(),"linkHref"),a=[];for(const t of o.getSelectedBlocks())n.schema.checkAttribute(t,"linkHref")&&a.push(e.createRangeOn(t));const c=a.slice();for(const t of s)this._isRangeToUpdate(t,a)&&c.push(t);for(const n of c)e.setAttribute("linkHref",t,n),i.forEach((t=>{e.setAttribute(t,!0,n)})),r.forEach((t=>{e.removeAttribute(t,n)}))}}))}_getDecoratorStateFromModel(t){const e=this.editor.model,n=e.document.selection,o=n.getSelectedElement();return b_(o,e.schema)?o.getAttribute(t):n.getAttribute(t)}_isRangeToUpdate(t,e){for(const n of e)if(n.containsRange(t))return!1;return!0}}class v_ extends _r{refresh(){const t=this.editor.model,e=t.document.selection,n=e.getSelectedElement();b_(n,t.schema)?this.isEnabled=t.schema.checkAttribute(n,"linkHref"):this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref")}execute(){const t=this.editor,e=this.editor.model,n=e.document.selection,o=t.commands.get("link");e.change((t=>{const i=n.isCollapsed?[jp(n.getFirstPosition(),"linkHref",n.getAttribute("linkHref"),e)]:e.schema.getValidRanges(n.getRanges(),"linkHref");for(const e of i)if(t.removeAttribute("linkHref",e),o)for(const n of o.manualDecorators)t.removeAttribute(n.id,e)}))}}class y_{constructor({id:t,label:e,attributes:n,classes:o,styles:i,defaultValue:r}){this.id=t,this.set("value"),this.defaultValue=r,this.label=e,this.attributes=n,this.classes=o,this.styles=i}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}d(y_,W);var x_=n(9773),E_={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(x_.Z,E_);x_.Z.locals;const D_="automatic",I_=/^(https?:)?\/\//;class T_ extends br{static get pluginName(){return"LinkEditing"}static get requires(){return[yp,hp,sp]}constructor(t){super(t),t.config.define("link",{addTargetToExternalLinks:!1})}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"linkHref"}),t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:f_}),t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>f_(k_(t),e)}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:t=>t.getAttribute("href")}}),t.commands.add("link",new C_(t)),t.commands.add("unlink",new v_(t));const e=function(t,e){const n={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};return e.forEach((t=>(t.label&&n[t.label]&&(t.label=n[t.label]),t))),e}(t.t,function(t){const e=[];if(t)for(const[n,o]of Object.entries(t)){const t=Object.assign({},o,{id:`link${d_(n)}`});e.push(t)}return e}(t.config.get("link.decorators")));this._enableAutomaticDecorators(e.filter((t=>t.mode===D_))),this._enableManualDecorators(e.filter((t=>"manual"===t.mode)));t.plugins.get(yp).registerAttribute("linkHref"),function(t,e,n,o){const i=t.editing.view,r=new Set;i.document.registerPostFixer((i=>{const s=t.model.document.selection;let a=!1;if(s.hasAttribute(e)){const c=jp(s.getFirstPosition(),e,s.getAttribute(e),t.model),l=t.editing.mapper.toViewRange(c);for(const t of l.getItems())t.is("element",n)&&!t.hasClass(o)&&(i.addClass(o,t),r.add(t),a=!0)}return a})),t.conversion.for("editingDowncast").add((t=>{function e(){i.change((t=>{for(const e of r.values())t.removeClass(o,e),r.delete(e)}))}t.on("insert",e,{priority:"highest"}),t.on("remove",e,{priority:"highest"}),t.on("attribute",e,{priority:"highest"}),t.on("selection",e,{priority:"highest"})}))}(t,"linkHref","a","ck-link_selected"),this._enableLinkOpen(),this._enableInsertContentSelectionAttributesFixer(),this._enableClickingAfterLink(),this._enableTypingOverLink(),this._handleDeleteContentAfterLink(),this._enableClipboardIntegration()}_enableAutomaticDecorators(t){const e=this.editor,n=e.commands.get("link").automaticDecorators;e.config.get("link.addTargetToExternalLinks")&&n.add({id:"linkIsExternal",mode:D_,callback:t=>I_.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}}),n.add(t),n.length&&e.conversion.for("downcast").add(n.getDispatcher())}_enableManualDecorators(t){if(!t.length)return;const e=this.editor,n=e.commands.get("link").manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id}),t=new y_(t),n.add(t),e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,{writer:n,schema:o},{item:i})=>{if((i.is("selection")||o.isInline(i))&&e){const e=n.createAttributeElement("a",t.attributes,{priority:5});t.classes&&n.addClass(t.classes,e);for(const o in t.styles)n.setStyle(o,t.styles[o],e);return n.setCustomProperty("link",!0,e),e}}}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",...t._createPattern()},model:{key:t.id}})}))}_enableLinkOpen(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",((t,e)=>{if(!(i.isMac?e.domEvent.metaKey:e.domEvent.ctrlKey))return;let n=e.domTarget;if("a"!=n.tagName.toLowerCase()&&(n=n.closest("a")),!n)return;const o=n.getAttribute("href");o&&(t.stop(),e.preventDefault(),A_(o))}),{context:"$capture"}),this.listenTo(e,"keydown",((e,n)=>{const o=t.commands.get("link").value;o&&n.keyCode===Zi.enter&&n.altKey&&(e.stop(),A_(o))}))}_enableInsertContentSelectionAttributesFixer(){const t=this.editor.model,e=t.document.selection;this.listenTo(t,"insertContent",(()=>{const n=e.anchor.nodeBefore,o=e.anchor.nodeAfter;e.hasAttribute("linkHref")&&n&&n.hasAttribute("linkHref")&&(o&&o.hasAttribute("linkHref")||t.change((e=>{M_(e,N_(t.schema))})))}),{priority:"low"})}_enableClickingAfterLink(){const t=this.editor,e=t.model;t.editing.view.addObserver(xu);let n=!1;this.listenTo(t.editing.view.document,"mousedown",(()=>{n=!0})),this.listenTo(t.editing.view.document,"selectionChange",(()=>{if(!n)return;n=!1;const t=e.document.selection;if(!t.isCollapsed)return;if(!t.hasAttribute("linkHref"))return;const o=t.getFirstPosition(),i=jp(o,"linkHref",t.getAttribute("linkHref"),e);(o.isTouching(i.start)||o.isTouching(i.end))&&e.change((t=>{M_(t,N_(e.schema))}))}))}_enableTypingOverLink(){const t=this.editor,e=t.editing.view;let n,o;this.listenTo(e.document,"delete",(()=>{o=!0}),{priority:"high"}),this.listenTo(t.model,"deleteContent",(()=>{const e=t.model.document.selection;e.isCollapsed||(o?o=!1:S_(t)&&function(t){const e=t.document.selection,n=e.getFirstPosition(),o=e.getLastPosition(),i=n.nodeAfter;if(!i)return!1;if(!i.is("$text"))return!1;if(!i.hasAttribute("linkHref"))return!1;const r=o.textNode||o.nodeBefore;if(i===r)return!0;return jp(n,"linkHref",i.getAttribute("linkHref"),t).containsRange(t.createRange(n,o),!0)}(t.model)&&(n=e.getAttributes()))}),{priority:"high"}),this.listenTo(t.model,"insertContent",((e,[i])=>{o=!1,S_(t)&&n&&(t.model.change((t=>{for(const[e,o]of n)t.setAttribute(e,o,i)})),n=null)}),{priority:"high"})}_handleDeleteContentAfterLink(){const t=this.editor,e=t.model,n=e.document.selection,o=t.editing.view;let i=!1,r=!1;this.listenTo(o.document,"delete",((t,e)=>{r="backward"===e.direction}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{i=!1;const t=n.getFirstPosition(),o=n.getAttribute("linkHref");if(!o)return;const r=jp(t,"linkHref",o,e);i=r.containsPosition(t)||r.end.isEqual(t)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{r&&(r=!1,i||t.model.enqueueChange((t=>{M_(t,N_(e.schema))})))}),{priority:"low"})}_enableClipboardIntegration(){const t=this.editor,e=t.model,n=this.editor.config.get("link.defaultProtocol");n&&this.listenTo(t.plugins.get("ClipboardPipeline"),"contentInsertion",((t,o)=>{e.change((t=>{const e=t.createRangeIn(o.content);for(const o of e.getItems())if(o.hasAttribute("linkHref")){const e=w_(o.getAttribute("linkHref"),n);t.setAttribute("linkHref",e,o)}}))}))}}function M_(t,e){t.removeSelectionAttribute("linkHref");for(const n of e)t.removeSelectionAttribute(n)}function S_(t){return t.model.change((t=>t.batch)).isTyping}function N_(t){return t.getDefinition("$text").allowAttributes.filter((t=>t.startsWith("link")))}var B_=n(7754),P_={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(B_.Z,P_);B_.Z.locals;class z_ extends Fu{constructor(t,e){super(t);const n=t.t;this.focusTracker=new dr,this.keystrokes=new hr,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(n("Save"),Bu.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(n("Cancel"),Bu.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e),this.children=this._createFormChildren(e.manualDecorators),this._focusables=new Ou,this._focusCycler=new Sg({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];e.manualDecorators.length&&o.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children}),zu(this)}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>(t[e.name]=e.isOn,t)),{})}render(){super.render(),Lu({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t,e=new zm(this.locale,Lm);return e.label=t("Link URL"),e}_createButton(t,e,n,o){const i=new mg(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const n of t.manualDecorators){const o=new kg(this.locale);o.set({name:n.id,label:n.label,withText:!0}),o.bind("isOn").toMany([n,t],"value",((t,e)=>void 0===e&&void 0===t?n.defaultValue:t)),o.on("execute",(()=>{n.set("value",!o.isOn)})),e.add(o)}return e}_createFormChildren(t){const e=this.createCollection();if(e.add(this.urlInputView),t.length){const t=new Fu;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}}),e.add(t)}return e.add(this.saveButtonView),e.add(this.cancelButtonView),e}}var L_=n(2347),O_={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(L_.Z,O_);L_.Z.locals;class R_ extends Fu{constructor(t){super(t);const e=t.t;this.focusTracker=new dr,this.keystrokes=new hr,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(e("Unlink"),'',"unlink"),this.editButtonView=this._createButton(e("Edit link"),Bu.pencil,"edit"),this.set("href"),this._focusables=new Ou,this._focusCycler=new Sg({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createButton(t,e,n){const o=new mg(this.locale);return o.set({label:t,icon:e,tooltip:!0}),o.delegate("execute").to(this,n),o}_createPreviewButton(){const t=new mg(this.locale),e=this.bindTemplate,n=this.t;return t.set({withText:!0,tooltip:n("Open link in new tab")}),t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&k_(t))),target:"_blank",rel:"noopener noreferrer"}}),t.bind("label").to(this,"href",(t=>t||n("This link has no URL"))),t.bind("isEnabled").to(this,"href",(t=>!!t)),t.template.tag="a",t.template.eventListeners={},t}}const j_="link-ui";class F_ extends br{static get requires(){return[Wm]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(yu),this.actionsView=null,this.formView=null,this._balloon=t.plugins.get(Wm),this._createToolbarLinkButton(),this._enableBalloonActivators(),t.conversion.for("editingDowncast").markerToHighlight({model:j_,view:{classes:["ck-fake-link-selection"]}}),t.conversion.for("editingDowncast").markerToElement({model:j_,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}})}destroy(){super.destroy(),this.formView&&this.formView.destroy(),this.actionsView&&this.actionsView.destroy()}_createViews(){this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._enableUserBalloonInteractions()}_createActionsView(){const t=this.editor,e=new R_(t.locale),n=t.commands.get("link"),o=t.commands.get("unlink");return e.bind("href").to(n,"value"),e.editButtonView.bind("isEnabled").to(n),e.unlinkButtonView.bind("isEnabled").to(o),this.listenTo(e,"edit",(()=>{this._addFormView()})),this.listenTo(e,"unlink",(()=>{t.execute("unlink"),this._hideUI()})),e.keystrokes.set("Esc",((t,e)=>{this._hideUI(),e()})),e.keystrokes.set(p_,((t,e)=>{this._addFormView(),e()})),e}_createFormView(){const t=this.editor,e=t.commands.get("link"),n=t.config.get("link.defaultProtocol"),o=new z_(t.locale,e);return o.urlInputView.fieldView.bind("value").to(e,"value"),o.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t)),o.saveButtonView.bind("isEnabled").to(e),this.listenTo(o,"submit",(()=>{const{value:e}=o.urlInputView.fieldView.element,i=w_(e,n);t.execute("link",i,o.getDecoratorSwitchesState()),this._closeFormView()})),this.listenTo(o,"cancel",(()=>{this._closeFormView()})),o.keystrokes.set("Esc",((t,e)=>{this._closeFormView(),e()})),o}_createToolbarLinkButton(){const t=this.editor,e=t.commands.get("link"),n=t.t;t.ui.componentFactory.add("link",(t=>{const o=new mg(t);return o.isEnabled=!0,o.label=n("Link"),o.icon='',o.keystroke=p_,o.tooltip=!0,o.isToggleable=!0,o.bind("isEnabled").to(e,"isEnabled"),o.bind("isOn").to(e,"value",(t=>!!t)),this.listenTo(o,"execute",(()=>this._showUI(!0))),o}))}_enableBalloonActivators(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",(()=>{this._getSelectedLinkElement()&&this._showUI()})),t.keystrokes.set(p_,((e,n)=>{n(),t.commands.get("link").isEnabled&&this._showUI(!0)}))}_enableUserBalloonInteractions(){this.editor.keystrokes.set("Tab",((t,e)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),e())}),{priority:"high"}),this.editor.keystrokes.set("Esc",((t,e)=>{this._isUIVisible&&(this._hideUI(),e())})),Pu({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this.actionsView||this._createViews(),this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this.formView||this._createViews(),this._isFormInPanel)return;const t=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions(),this.formView.urlInputView.fieldView.element.value=t.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates(),void 0!==t.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(t=!1){this.formView||this._createViews(),this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),t&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),t&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const t=this.editor;this.stopListening(t.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),t.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor,e=t.editing.view.document;let n=this._getSelectedLinkElement(),o=r();const i=()=>{const t=this._getSelectedLinkElement(),e=r();n&&!t||!n&&e!==o?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),n=t,o=e};function r(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",i),this.listenTo(this._balloon,"change:visibleView",i)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){return this._balloon.visibleView==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view,e=this.editor.model,n=t.document;let o=null;if(e.markers.has(j_)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(j_)),n=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));o=t.domConverter.viewRangeToDom(n)}else o=()=>{const e=this._getSelectedLinkElement();return e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(n.selection.getFirstRange())};return{target:o}}_getSelectedLinkElement(){const t=this.editor.editing.view,e=t.document.selection,n=e.getSelectedElement();if(e.isCollapsed||n&&rf(n))return V_(e.getFirstPosition());{const n=e.getFirstRange().getTrimmed(),o=V_(n.start),i=V_(n.end);return o&&o==i&&t.createRangeIn(o).getTrimmed().isEqual(n)?o:null}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const n=t.document.selection.getFirstRange();if(t.markers.has(j_))e.updateMarker(j_,{range:n});else if(n.start.isAtEnd){const o=n.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:n});e.addMarker(j_,{usingOperation:!1,affectsData:!1,range:e.createRange(o,n.end)})}else e.addMarker(j_,{usingOperation:!1,affectsData:!1,range:n})}))}_hideFakeVisualSelection(){const t=this.editor.model;t.markers.has(j_)&&t.change((t=>{t.removeMarker(j_)}))}}function V_(t){return t.getAncestors().find((t=>{return(e=t).is("attributeElement")&&!!e.getCustomProperty("link");var e}))}const H_=4,U_=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i"),W_=2;class q_ extends br{static get requires(){return[_p]}static get pluginName(){return"AutoLink"}init(){const t=this.editor.model.document.selection;t.on("change:range",(()=>{this.isEnabled=!t.anchor.parent.is("element","codeBlock")})),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling()}_enableTypingHandling(){const t=this.editor,e=new vp(t.model,(t=>{if(!function(t){return t.length>H_&&" "===t[t.length-1]&&" "!==t[t.length-2]}(t))return;const e=G_(t.substr(0,t.length-1));return e?{url:e}:void 0}));e.on("matched:data",((e,n)=>{const{batch:o,range:i,url:r}=n;if(!o.isTyping)return;const s=i.end.getShiftedBy(-1),a=s.getShiftedBy(-r.length),c=t.model.createRange(a,s);this._applyAutoLink(r,c)})),e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor,e=t.model,n=t.commands.get("enter");n&&n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling)return;const n=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(n)}))}_enableShiftEnterHandling(){const t=this.editor,e=t.model,n=t.commands.get("shiftEnter");n&&n.on("execute",(()=>{const t=e.document.selection.getFirstPosition(),n=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(n)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model,{text:n,range:o}=Cp(t,e),i=G_(n);if(i){const t=e.createRange(o.end.getShiftedBy(-i.length),o.end);this._applyAutoLink(i,t)}}_applyAutoLink(t,e){const n=this.editor.model,o=w_(t,this.editor.config.get("link.defaultProtocol"));this.isEnabled&&function(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}(e,n)&&__(o)&&!function(t){const e=t.start.nodeAfter;return e&&e.hasAttribute("linkHref")}(e)&&this._persistAutoLink(o,e)}_persistAutoLink(t,e){const n=this.editor.model,o=this.editor.plugins.get("Delete");n.enqueueChange((i=>{i.setAttribute("linkHref",t,e),n.enqueueChange((()=>{o.requestUndoOnBackspace()}))}))}}function G_(t){const e=U_.exec(t);return e?e[W_]:null}class $_ extends _r{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,n=e.document,o=Array.from(n.selection.getSelectedBlocks()).filter((t=>K_(t,e.schema))),i=void 0!==t.forceValue?!t.forceValue:this.value;e.change((t=>{if(i){let e=o[o.length-1].nextSibling,n=Number.POSITIVE_INFINITY,i=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t=n;)r>i.getAttribute("listIndent")&&(r=i.getAttribute("listIndent")),i.getAttribute("listIndent")==r&&t[e?"unshift":"push"](i),i=i[e?"previousSibling":"nextSibling"]}}function K_(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class Q_ extends _r{constructor(t,e){super(t),this._indentBy="forward"==e?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document;let n=Array.from(e.selection.getSelectedBlocks());t.change((t=>{const e=n[n.length-1];let o=e.nextSibling;for(;o&&"listItem"==o.name&&o.getAttribute("listIndent")>e.getAttribute("listIndent");)n.push(o),o=o.nextSibling;this._indentBy<0&&(n=n.reverse());for(const e of n){const n=e.getAttribute("listIndent")+this._indentBy;n<0?t.rename(e,"paragraph"):t.setAttribute("listIndent",n,e)}this.fire("_executeCleanup",n)}))}_checkEnabled(){const t=lr(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("element","listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),n=t.getAttribute("listType");let o=t.previousSibling;for(;o&&o.is("element","listItem")&&o.getAttribute("listIndent")>=e;){if(o.getAttribute("listIndent")==e)return o.getAttribute("listType")==n;o=o.previousSibling}return!1}return!0}}function Z_(t,e){const n=e.mapper,o=e.writer,i="numbered"==t.getAttribute("listType")?"ol":"ul",r=function(t){const e=t.createContainerElement("li");return e.getFillerOffset=sA,e}(o),s=o.createContainerElement(i,null);return o.insert(o.createPositionAt(s,0),r),n.bindElements(t,r),r}function J_(t,e,n,o){const i=e.parent,r=n.mapper,s=n.writer;let a=r.toViewPosition(o.createPositionBefore(t));const c=eA(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),l=t.previousSibling;if(c&&c.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=r.toViewElement(c);a=s.breakContainer(s.createPositionAfter(t))}else if(l&&"listItem"==l.name){a=r.toViewPosition(o.createPositionAt(l,"end"));const t=r.findMappedViewAncestor(a),e=function(t){for(const e of t.getChildren())if("ul"==e.name||"ol"==e.name)return e;return null}(t);a=e?s.createPositionBefore(e):s.createPositionAt(t,"end")}else a=r.toViewPosition(o.createPositionBefore(t));if(a=tA(a),s.insert(a,i),l&&"listItem"==l.name){const t=r.toViewElement(l),n=s.createRange(s.createPositionAt(t,0),a).getWalker({ignoreElementEnd:!0});for(const t of n)if(t.item.is("element","li")){const o=s.breakContainer(s.createPositionBefore(t.item)),i=t.item.parent,r=s.createPositionAt(e,"end");X_(s,r.nodeBefore,r.nodeAfter),s.move(s.createRangeOn(i),r),n.position=o}}else{const n=i.nextSibling;if(n&&(n.is("element","ul")||n.is("element","ol"))){let o=null;for(const e of n.getChildren()){const n=r.toModelElement(e);if(!(n&&n.getAttribute("listIndent")>t.getAttribute("listIndent")))break;o=e}o&&(s.breakContainer(s.createPositionAfter(o)),s.move(s.createRangeOn(o.parent),s.createPositionAt(e,"end")))}}X_(s,i,i.nextSibling),X_(s,i.previousSibling,i)}function X_(t,e,n){return!e||!n||"ul"!=e.name&&"ol"!=e.name||e.name!=n.name||e.getAttribute("class")!==n.getAttribute("class")?null:t.mergeContainers(t.createPositionAfter(e))}function tA(t){return t.getLastMatchingPosition((t=>t.item.is("uiElement")))}function eA(t,e){const n=!!e.sameIndent,o=!!e.smallerIndent,i=e.listIndent;let r=t;for(;r&&"listItem"==r.name;){const t=r.getAttribute("listIndent");if(n&&i==t||o&&i>t)return r;r="forward"===e.direction?r.nextSibling:r.previousSibling}return null}function nA(t,e,n,o){t.ui.componentFactory.add(e,(i=>{const r=t.commands.get(e),s=new mg(i);return s.set({label:n,icon:o,tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),s.on("execute",(()=>{t.execute(e),t.editing.view.focus()})),s}))}function oA(t,e){const n=[],o=t.parent,i={ignoreElementEnd:!1,startPosition:t,shallow:!0,direction:e},r=o.getAttribute("listIndent"),s=[...new Nl(i)].filter((t=>t.item.is("element"))).map((t=>t.item));for(const t of s){if(!t.is("element","listItem"))break;if(t.getAttribute("listIndent")r)){if(t.getAttribute("listType")!==o.getAttribute("listType"))break;if(t.getAttribute("listStyle")!==o.getAttribute("listStyle"))break;if(t.getAttribute("listReversed")!==o.getAttribute("listReversed"))break;if(t.getAttribute("listStart")!==o.getAttribute("listStart"))break;"backward"===e?n.unshift(t):n.push(t)}}return n}const iA=["disc","circle","square"],rA=["decimal","decimal-leading-zero","lower-roman","upper-roman","lower-latin","upper-latin"];function sA(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:Zs.call(this)}class aA extends br{static get pluginName(){return"ListUtils"}getListTypeFromListStyleType(t){return function(t){return iA.includes(t)?"bulleted":rA.includes(t)?"numbered":null}(t)}getSelectedListItems(t){return function(t){let e=[...t.document.selection.getSelectedBlocks()].filter((t=>t.is("element","listItem"))).map((e=>{const n=t.change((t=>t.createPositionAt(e,0)));return[...oA(n,"backward"),...oA(n,"forward")]})).flat();return e=[...new Set(e)],e}(t)}getSiblingNodes(t,e){return oA(t,e)}}function cA(t){return(e,n,o)=>{const i=o.consumable;if(!i.test(n.item,"insert")||!i.test(n.item,"attribute:listType")||!i.test(n.item,"attribute:listIndent"))return;i.consume(n.item,"insert"),i.consume(n.item,"attribute:listType"),i.consume(n.item,"attribute:listIndent");const r=n.item;J_(r,Z_(r,o),o,t)}}const lA=(t,e,n)=>{if(!n.consumable.test(e.item,t.name))return;const o=n.mapper.toViewElement(e.item),i=n.writer;i.breakContainer(i.createPositionBefore(o)),i.breakContainer(i.createPositionAfter(o));const r=o.parent,s="numbered"==e.attributeNewValue?"ol":"ul";i.rename(s,r)},dA=(t,e,n)=>{n.consumable.consume(e.item,t.name);const o=n.mapper.toViewElement(e.item).parent,i=n.writer;X_(i,o,o.nextSibling),X_(i,o.previousSibling,o)};const hA=(t,e,n)=>{if(n.consumable.test(e.item,t.name)&&"listItem"!=e.item.name){let t=n.mapper.toViewPosition(e.range.start);const o=n.writer,i=[];for(;("ul"==t.parent.name||"ol"==t.parent.name)&&(t=o.breakContainer(t),"li"==t.parent.name);){const e=t,n=o.createPositionAt(t.parent,"end");if(!e.isEqual(n)){const t=o.remove(o.createRange(e,n));i.push(t)}t=o.createPositionAfter(t.parent)}if(i.length>0){for(let e=0;e0){const e=X_(o,n,n.nextSibling);e&&e.parent==n&&t.offset--}}X_(o,t.nodeBefore,t.nodeAfter)}}},uA=(t,e,n)=>{const o=n.mapper.toViewPosition(e.position),i=o.nodeBefore,r=o.nodeAfter;X_(n.writer,i,r)},gA=(t,e,n)=>{if(n.consumable.consume(e.viewItem,{name:!0})){const t=n.writer,o=t.createElement("listItem"),i=function(t){let e=0,n=t.parent;for(;n;){if(n.is("element","li"))e++;else{const t=n.previousSibling;t&&t.is("element","li")&&e++}n=n.parent}return e}(e.viewItem);t.setAttribute("listIndent",i,o);const r=e.viewItem.parent&&"ol"==e.viewItem.parent.name?"numbered":"bulleted";if(t.setAttribute("listType",r,o),!n.safeInsert(o,e.modelCursor))return;const s=function(t,e,n){const{writer:o,schema:i}=n;let r=o.createPositionAfter(t);for(const s of e)if("ul"==s.name||"ol"==s.name)r=n.convertItem(s,r).modelCursor;else{const e=n.convertItem(s,o.createPositionAt(t,"end")),a=e.modelRange.start.nodeAfter;a&&a.is("element")&&!i.checkChild(t,a.name)&&(t=e.modelCursor.parent.is("element","listItem")?e.modelCursor.parent:bA(e.modelCursor),r=o.createPositionAfter(t))}return r}(o,e.viewItem.getChildren(),n);e.modelRange=t.createRange(e.modelCursor,s),n.updateConversionResult(o,e)}},mA=(t,e,n)=>{if(n.consumable.test(e.viewItem,{name:!0})){const t=Array.from(e.viewItem.getChildren());for(const e of t){!(e.is("element","li")||_A(e))&&e._remove()}}},pA=(t,e,n)=>{if(n.consumable.test(e.viewItem,{name:!0})){if(0===e.viewItem.childCount)return;const t=[...e.viewItem.getChildren()];let n=!1;for(const e of t)n&&!_A(e)&&e._remove(),_A(e)&&(n=!0)}};function fA(t){return(e,n)=>{if(n.isPhantom)return;const o=n.modelPosition.nodeBefore;if(o&&o.is("element","listItem")){const e=n.mapper.toViewElement(o),i=e.getAncestors().find(_A),r=t.createPositionAt(e,0).getWalker();for(const t of r){if("elementStart"==t.type&&t.item.is("element","li")){n.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==i){n.viewPosition=t.nextPosition;break}}}}}const kA=function(t,[e,n,o]){const i=this;let r,s=e.is("documentFragment")?e.getChild(0):e;if(r=n?i.createSelection(n,o):i.document.selection,s&&s.is("element","listItem")){const t=r.getFirstPosition();let e=null;if(t.parent.is("element","listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("element","listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;s&&s.is("element","listItem");)s._setAttribute("listIndent",s.getAttribute("listIndent")+t),s=s.nextSibling}}};function bA(t){const e=new Nl({startPosition:t});let n;do{n=e.next()}while(!n.value.item.is("element","listItem"));return n.value.item}function wA(t,e,n,o,i,r){const s=eA(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t}),a=i.mapper,c=i.writer,l=s?s.getAttribute("listIndent"):null;let d;if(s)if(l==t){const t=a.toViewElement(s).parent;d=c.createPositionAfter(t)}else{const t=r.createPositionAt(s,"end");d=a.toViewPosition(t)}else d=n;d=tA(d);for(const t of[...o.getChildren()])_A(t)&&(d=c.move(c.createRangeOn(t),d).end,X_(c,t,t.nextSibling),X_(c,t.previousSibling,t))}function _A(t){return t.is("element","ol")||t.is("element","ul")}var AA=n(4564),CA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(AA.Z,CA);AA.Z.locals;class vA extends br{static get pluginName(){return"ListEditing"}static get requires(){return[Gp,_p,aA]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data,n=t.editing;var o;t.model.document.registerPostFixer((e=>function(t,e){const n=t.document.differ.getChanges(),o=new Map;let i=!1;for(const o of n)if("insert"==o.type&&"listItem"==o.name)r(o.position);else if("insert"==o.type&&"listItem"!=o.name){if("$text"!=o.name){const n=o.position.nodeAfter;n.hasAttribute("listIndent")&&(e.removeAttribute("listIndent",n),i=!0),n.hasAttribute("listType")&&(e.removeAttribute("listType",n),i=!0),n.hasAttribute("listStyle")&&(e.removeAttribute("listStyle",n),i=!0),n.hasAttribute("listReversed")&&(e.removeAttribute("listReversed",n),i=!0),n.hasAttribute("listStart")&&(e.removeAttribute("listStart",n),i=!0);for(const e of Array.from(t.createRangeIn(n)).filter((t=>t.item.is("element","listItem"))))r(e.previousPosition)}r(o.position.getShiftedBy(o.length))}else"remove"==o.type&&"listItem"==o.name?r(o.position):("attribute"==o.type&&"listIndent"==o.attributeKey||"attribute"==o.type&&"listType"==o.attributeKey)&&r(o.range.start);for(const t of o.values())s(t),a(t);return i;function r(t){const e=t.nodeBefore;if(e&&e.is("element","listItem")){let t=e;if(o.has(t))return;for(let e=t.previousSibling;e&&e.is("element","listItem");e=t.previousSibling)if(t=e,o.has(t))return;o.set(e,t)}else{const e=t.nodeAfter;e&&e.is("element","listItem")&&o.set(e,e)}}function s(t){let n=0,o=null;for(;t&&t.is("element","listItem");){const r=t.getAttribute("listIndent");if(r>n){let s;null===o?(o=r-n,s=n):(o>r&&(o=r),s=r-o),e.setAttribute("listIndent",s,t),i=!0}else o=null,n=t.getAttribute("listIndent")+1;t=t.nextSibling}}function a(t){let n=[],o=null;for(;t&&t.is("element","listItem");){const r=t.getAttribute("listIndent");if(o&&o.getAttribute("listIndent")>r&&(n=n.slice(0,r+1)),0!=r)if(n[r]){const o=n[r];t.getAttribute("listType")!=o&&(e.setAttribute("listType",o,t),i=!0)}else n[r]=t.getAttribute("listType");o=t,t=t.nextSibling}}}(t.model,e))),n.mapper.registerViewToModelLength("li",yA),e.mapper.registerViewToModelLength("li",yA),n.mapper.on("modelToViewPosition",fA(n.view)),n.mapper.on("viewToModelPosition",(o=t.model,(t,e)=>{const n=e.viewPosition,i=n.parent,r=e.mapper;if("ul"==i.name||"ol"==i.name){if(n.isAtEnd){const t=r.toModelElement(n.nodeBefore),i=r.getModelLength(n.nodeBefore);e.modelPosition=o.createPositionBefore(t).getShiftedBy(i)}else{const t=r.toModelElement(n.nodeAfter);e.modelPosition=o.createPositionBefore(t)}t.stop()}else if("li"==i.name&&n.nodeBefore&&("ul"==n.nodeBefore.name||"ol"==n.nodeBefore.name)){const s=r.toModelElement(i);let a=1,c=n.nodeBefore;for(;c&&_A(c);)a+=r.getModelLength(c),c=c.previousSibling;e.modelPosition=o.createPositionBefore(s).getShiftedBy(a),t.stop()}})),e.mapper.on("modelToViewPosition",fA(n.view)),t.conversion.for("editingDowncast").add((e=>{e.on("insert",hA,{priority:"high"}),e.on("insert:listItem",cA(t.model)),e.on("attribute:listType:listItem",lA,{priority:"high"}),e.on("attribute:listType:listItem",dA,{priority:"low"}),e.on("attribute:listIndent:listItem",function(t){return(e,n,o)=>{if(!o.consumable.consume(n.item,"attribute:listIndent"))return;const i=o.mapper.toViewElement(n.item),r=o.writer;r.breakContainer(r.createPositionBefore(i)),r.breakContainer(r.createPositionAfter(i));const s=i.parent,a=s.previousSibling,c=r.createRangeOn(s);r.remove(c),a&&a.nextSibling&&X_(r,a,a.nextSibling),wA(n.attributeOldValue+1,n.range.start,c.start,i,o,t),J_(n.item,i,o,t);for(const t of n.item.getChildren())o.consumable.consume(t,"insert")}}(t.model)),e.on("remove:listItem",function(t){return(e,n,o)=>{const i=o.mapper.toViewPosition(n.position).getLastMatchingPosition((t=>!t.item.is("element","li"))).nodeAfter,r=o.writer;r.breakContainer(r.createPositionBefore(i)),r.breakContainer(r.createPositionAfter(i));const s=i.parent,a=s.previousSibling,c=r.createRangeOn(s),l=r.remove(c);a&&a.nextSibling&&X_(r,a,a.nextSibling),wA(o.mapper.toModelElement(i).getAttribute("listIndent")+1,n.position,c.start,i,o,t);for(const t of r.createRangeIn(l).getItems())o.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",uA,{priority:"low"})})),t.conversion.for("dataDowncast").add((e=>{e.on("insert",hA,{priority:"high"}),e.on("insert:listItem",cA(t.model))})),t.conversion.for("upcast").add((t=>{t.on("element:ul",mA,{priority:"high"}),t.on("element:ol",mA,{priority:"high"}),t.on("element:li",pA,{priority:"high"}),t.on("element:li",gA)})),t.model.on("insertContent",kA,{priority:"high"}),t.commands.add("numberedList",new $_(t,"numbered")),t.commands.add("bulletedList",new $_(t,"bulleted")),t.commands.add("indentList",new Q_(t,"forward")),t.commands.add("outdentList",new Q_(t,"backward"));const i=n.view.document;this.listenTo(i,"enter",((t,e)=>{const n=this.editor.model.document,o=n.selection.getLastPosition().parent;n.selection.isCollapsed&&"listItem"==o.name&&o.isEmpty&&(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(i,"delete",((t,e)=>{if("backward"!==e.direction)return;const n=this.editor.model.document.selection;if(!n.isCollapsed)return;const o=n.getFirstPosition();if(!o.isAtStart)return;const i=o.parent;if("listItem"!==i.name)return;i.previousSibling&&"listItem"===i.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),{context:"li"}),this.listenTo(t.editing.view.document,"tab",((e,n)=>{const o=n.shiftKey?"outdentList":"indentList";this.editor.commands.get(o).isEnabled&&(t.execute(o),n.stopPropagation(),n.preventDefault(),e.stop())}),{context:"li"})}afterInit(){const t=this.editor.commands,e=t.get("indent"),n=t.get("outdent");e&&e.registerChildCommand(t.get("indentList")),n&&n.registerChildCommand(t.get("outdentList"))}}function yA(t){let e=1;for(const n of t.getChildren())if("ul"==n.name||"ol"==n.name)for(const t of n.getChildren())e+=yA(t);return e}class xA extends br{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;nA(this.editor,"numberedList",t("Numbered List"),''),nA(this.editor,"bulletedList",t("Bulleted List"),'')}}function EA(t,e){return t=>{t.on("attribute:url:media",n)};function n(n,o,i){if(!i.consumable.consume(o.item,n.name))return;const r=o.attributeNewValue,s=i.writer,a=i.mapper.toViewElement(o.item),c=[...a.getChildren()].find((t=>t.getCustomProperty("media-content")));s.remove(c);const l=t.getMediaViewElement(s,r,e);s.insert(s.createPositionAt(a,0),l)}}function DA(t,e,n,o){return t.createContainerElement("figure",{class:"media"},[e.getMediaViewElement(t,n,o),t.createSlot()])}function IA(t){const e=t.getSelectedElement();return e&&e.is("element","media")?e:null}function TA(t,e,n,o){t.change((i=>{const r=i.createElement("media",{url:e});t.insertObject(r,n,null,{setSelection:"on",findOptimalPosition:o})}))}class MA extends _r{refresh(){const t=this.editor.model,e=t.document.selection,n=IA(e);this.value=n?n.getAttribute("url"):null,this.isEnabled=function(t){const e=t.getSelectedElement();return!!e&&"media"===e.name}(e)||function(t,e){const n=hf(t,e);let o=n.start.parent;o.isEmpty&&!e.schema.isLimit(o)&&(o=o.parent);return e.schema.checkChild(o,"media")}(e,t)}execute(t){const e=this.editor.model,n=e.document.selection,o=IA(n);o?e.change((e=>{e.setAttribute("url",t,o)})):TA(e,t,n,!0)}}class SA{constructor(t,e){const n=e.providers,o=e.extraProviders||[],i=new Set(e.removeProviders),r=n.concat(o).filter((t=>{const e=t.name;return e?!i.has(e):(w("media-embed-no-provider-name",{provider:t}),!1)}));this.locale=t,this.providerDefinitions=r}hasMedia(t){return!!this._getMedia(t)}getMediaViewElement(t,e,n){return this._getMedia(e).getViewElement(t,n)}_getMedia(t){if(!t)return new NA(this.locale);t=t.trim();for(const e of this.providerDefinitions){const n=e.html,o=or(e.url);for(const e of o){const o=this._getUrlMatches(t,e);if(o)return new NA(this.locale,t,o,n)}}return null}_getUrlMatches(t,e){let n=t.match(e);if(n)return n;let o=t.replace(/^https?:\/\//,"");return n=o.match(e),n||(o=o.replace(/^www\./,""),n=o.match(e),n||null)}}class NA{constructor(t,e,n,o){this.url=this._getValidUrl(e),this._locale=t,this._match=n,this._previewRenderer=o}getViewElement(t,e){const n={};let o;if(e.renderForEditingView||e.renderMediaPreview&&this.url&&this._previewRenderer){this.url&&(n["data-oembed-url"]=this.url),e.renderForEditingView&&(n.class="ck-media__wrapper");const i=this._getPreviewHtml(e);o=t.createRawElement("div",n,((t,e)=>{e.setContentOf(t,i)}))}else this.url&&(n.url=this.url),o=t.createEmptyElement(e.elementName,n);return t.setCustomProperty("media-content",!0,o),o}_getPreviewHtml(t){return this._previewRenderer?this._previewRenderer(this._match):this.url&&t.renderForEditingView?this._getPlaceholderHtml():""}_getPlaceholderHtml(){const t=new hg,e=this._locale.t;t.content='',t.viewBox="0 0 64 42";return new Vu({tag:"div",attributes:{class:"ck ck-reset_all ck-media__placeholder"},children:[{tag:"div",attributes:{class:"ck-media__placeholder__icon"},children:[t]},{tag:"a",attributes:{class:"ck-media__placeholder__url",target:"_blank",rel:"noopener noreferrer",href:this.url,"data-cke-tooltip-text":e("Open media in new tab")},children:[{tag:"span",attributes:{class:"ck-media__placeholder__url__text"},children:[this.url]}]}]}).render().outerHTML}_getValidUrl(t){return t?t.match(/^https?/)?t:"https://"+t:null}}var BA=n(7442),PA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(BA.Z,PA);BA.Z.locals;class zA extends br{static get pluginName(){return"MediaEmbedEditing"}constructor(t){super(t),t.config.define("mediaEmbed",{elementName:"oembed",providers:[{name:"dailymotion",url:/^dailymotion\.com\/video\/(\w+)/,html:t=>`
    `},{name:"spotify",url:[/^open\.spotify\.com\/(artist\/\w+)/,/^open\.spotify\.com\/(album\/\w+)/,/^open\.spotify\.com\/(track\/\w+)/],html:t=>`
    `},{name:"youtube",url:[/^(?:m\.)?youtube\.com\/watch\?v=([\w-]+)(?:&t=(\d+))?/,/^(?:m\.)?youtube\.com\/v\/([\w-]+)(?:\?t=(\d+))?/,/^youtube\.com\/embed\/([\w-]+)(?:\?start=(\d+))?/,/^youtu\.be\/([\w-]+)(?:\?t=(\d+))?/],html:t=>{const e=t[1],n=t[2];return`
    `}},{name:"vimeo",url:[/^vimeo\.com\/(\d+)/,/^vimeo\.com\/[^/]+\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/album\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/channels\/[^/]+\/(\d+)/,/^vimeo\.com\/groups\/[^/]+\/videos\/(\d+)/,/^vimeo\.com\/ondemand\/[^/]+\/(\d+)/,/^player\.vimeo\.com\/video\/(\d+)/],html:t=>`
    `},{name:"instagram",url:/^instagram\.com\/p\/(\w+)/},{name:"twitter",url:/^twitter\.com/},{name:"googleMaps",url:[/^google\.com\/maps/,/^goo\.gl\/maps/,/^maps\.google\.com/,/^maps\.app\.goo\.gl/]},{name:"flickr",url:/^flickr\.com/},{name:"facebook",url:/^facebook\.com/}]}),this.registry=new SA(t.locale,t.config.get("mediaEmbed"))}init(){const t=this.editor,e=t.model.schema,n=t.t,o=t.conversion,i=t.config.get("mediaEmbed.previewsInData"),r=t.config.get("mediaEmbed.elementName"),s=this.registry;t.commands.add("mediaEmbed",new MA(t)),e.register("media",{inheritAllFrom:"$blockObject",allowAttributes:["url"]}),o.for("dataDowncast").elementToStructure({model:"media",view:(t,{writer:e})=>{const n=t.getAttribute("url");return DA(e,s,n,{elementName:r,renderMediaPreview:n&&i})}}),o.for("dataDowncast").add(EA(s,{elementName:r,renderMediaPreview:i})),o.for("editingDowncast").elementToStructure({model:"media",view:(t,{writer:e})=>{const o=t.getAttribute("url");return function(t,e,n){return e.setCustomProperty("media",!0,t),sf(t,e,{label:n})}(DA(e,s,o,{elementName:r,renderForEditingView:!0}),e,n("media widget"))}}),o.for("editingDowncast").add(EA(s,{elementName:r,renderForEditingView:!0})),o.for("upcast").elementToElement({view:t=>["oembed",r].includes(t.name)&&t.getAttribute("url")?{name:!0}:null,model:(t,{writer:e})=>{const n=t.getAttribute("url");if(s.hasMedia(n))return e.createElement("media",{url:n})}}).elementToElement({view:{name:"div",attributes:{"data-oembed-url":!0}},model:(t,{writer:e})=>{const n=t.getAttribute("data-oembed-url");if(s.hasMedia(n))return e.createElement("media",{url:n})}}).add((t=>{t.on("element:figure",(function(t,e,n){if(!n.consumable.consume(e.viewItem,{name:!0,classes:"media"}))return;const{modelRange:o,modelCursor:i}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=o,e.modelCursor=i;lr(o.getItems())||n.consumable.revert(e.viewItem,{name:!0,classes:"media"})}))}))}}const LA=/^(?:http(s)?:\/\/)?[\w-]+\.[\w-.~:/?#[\]@!$&'()*+,;=%]+$/;class OA extends br{static get requires(){return[Gf,_p,ck]}static get pluginName(){return"AutoMediaEmbed"}constructor(t){super(t),this._timeoutId=null,this._positionToInsert=null}init(){const t=this.editor,e=t.model.document;this.listenTo(t.plugins.get("ClipboardPipeline"),"inputTransformation",(()=>{const t=e.selection.getFirstRange(),n=zh.fromPosition(t.start);n.stickiness="toPrevious";const o=zh.fromPosition(t.end);o.stickiness="toNext",e.once("change:data",(()=>{this._embedMediaBetweenPositions(n,o),n.detach(),o.detach()}),{priority:"high"})})),t.commands.get("undo").on("execute",(()=>{this._timeoutId&&(wi.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)}),{priority:"high"})}_embedMediaBetweenPositions(t,e){const n=this.editor,o=n.plugins.get(zA).registry,i=new Jl(t,e),r=i.getWalker({ignoreElementEnd:!0});let s="";for(const t of r)t.item.is("$textProxy")&&(s+=t.item.data);if(s=s.trim(),!s.match(LA))return void i.detach();if(!o.hasMedia(s))return void i.detach();n.commands.get("mediaEmbed").isEnabled?(this._positionToInsert=zh.fromPosition(t),this._timeoutId=wi.window.setTimeout((()=>{n.model.change((t=>{let e;this._timeoutId=null,t.remove(i),i.detach(),"$graveyard"!==this._positionToInsert.root.rootName&&(e=this._positionToInsert),TA(n.model,s,e,!1),this._positionToInsert.detach(),this._positionToInsert=null})),n.plugins.get("Delete").requestUndoOnBackspace()}),100)):i.detach()}}var RA=n(9292),jA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(RA.Z,jA);RA.Z.locals;class FA extends Fu{constructor(t,e){super(e);const n=e.t;this.focusTracker=new dr,this.keystrokes=new hr,this.set("mediaURLInputValue",""),this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(n("Save"),Bu.check,"ck-button-save"),this.saveButtonView.type="submit",this.saveButtonView.bind("isEnabled").to(this,"mediaURLInputValue",(t=>!!t)),this.cancelButtonView=this._createButton(n("Cancel"),Bu.cancel,"ck-button-cancel","cancel"),this._focusables=new Ou,this._focusCycler=new Sg({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this._validators=t,this.setTemplate({tag:"form",attributes:{class:["ck","ck-media-form","ck-responsive-form"],tabindex:"-1"},children:[this.urlInputView,this.saveButtonView,this.cancelButtonView]}),zu(this)}render(){super.render(),Lu({view:this});[this.urlInputView,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element);const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(this.urlInputView.element,"selectstart",((t,e)=>{e.stopPropagation()}),{priority:"high"})}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}get url(){return this.urlInputView.fieldView.element.value.trim()}set url(t){this.urlInputView.fieldView.element.value=t.trim()}isValid(){this.resetFormStatus();for(const t of this._validators){const e=t(this);if(e)return this.urlInputView.errorText=e,!1}return!0}resetFormStatus(){this.urlInputView.errorText=null,this.urlInputView.infoText=this._urlInputViewInfoDefault}_createUrlInput(){const t=this.locale.t,e=new zm(this.locale,Lm),n=e.fieldView;return this._urlInputViewInfoDefault=t("Paste the media URL in the input."),this._urlInputViewInfoTip=t("Tip: Paste the URL into the content to embed faster."),e.label=t("Media URL"),e.infoText=this._urlInputViewInfoDefault,n.on("input",(()=>{e.infoText=n.element.value?this._urlInputViewInfoTip:this._urlInputViewInfoDefault,this.mediaURLInputValue=n.element.value.trim()})),e}_createButton(t,e,n,o){const i=new mg(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}}class VA extends br{static get requires(){return[zA]}static get pluginName(){return"MediaEmbedUI"}init(){const t=this.editor,e=t.commands.get("mediaEmbed");t.ui.componentFactory.add("mediaEmbed",(t=>{const n=Xg(t);return this._setUpDropdown(n,e),n}))}_setUpDropdown(t,e){const n=this.editor,o=n.t,i=t.buttonView,r=n.plugins.get(zA).registry;t.once("change:isOpen",(()=>{const o=new FA(function(t,e){return[e=>{if(!e.url.length)return t("The URL must not be empty.")},n=>{if(!e.hasMedia(n.url))return t("This media URL is not supported.")}]}(n.t,r),n.locale);t.panelView.children.add(o),i.on("open",(()=>{o.disableCssTransitions(),o.url=e.value||"",o.urlInputView.fieldView.select(),o.enableCssTransitions()}),{priority:"low"}),t.on("submit",(()=>{o.isValid()&&(n.execute("mediaEmbed",o.url),n.editing.view.focus())})),t.on("change:isOpen",(()=>o.resetFormStatus())),t.on("cancel",(()=>{n.editing.view.focus()})),o.delegate("submit","cancel").to(t),o.urlInputView.bind("value").to(e,"value"),o.urlInputView.bind("isReadOnly").to(e,"isEnabled",(t=>!t))})),t.bind("isEnabled").to(e),i.set({label:o("Insert media"),icon:'',tooltip:!0})}}var HA=n(4652),UA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};Dr()(HA.Z,UA);HA.Z.locals;function WA(t,e,n,{blockElements:o,inlineObjectElements:i}){let r=n.createPositionAt(t,"forward"==e?"after":"before");return r=r.getLastMatchingPosition((({item:t})=>t.is("element")&&!o.includes(t.name)&&!i.includes(t.name)),{direction:e}),"forward"==e?r.nodeAfter:r.nodeBefore}function qA(t,e){return!!t&&t.is("element")&&e.includes(t.name)}function GA(t,e){if(!t.childCount)return;const n=new Eu(t.document),o=function(t,e){const n=e.createRangeIn(t),o=new Hr({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),i=[];for(const t of n)if("elementStart"===t.type&&o.match(t.item)){const e=KA(t.item);i.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}return i}(t,n);if(!o.length)return;let i=null,r=1;o.forEach(((t,s)=>{const a=function(t,e){if(!t)return!0;if(t.id!==e.id)return e.indent-t.indent!=1;const n=e.element.previousSibling;if(!n)return!0;return o=n,!(o.is("element","ol")||o.is("element","ul"));var o}(o[s-1],t),c=a?null:o[s-1],l=(h=t,(d=c)?h.indent-d.indent:h.indent-1);var d,h;if(a&&(i=null,r=1),!i||0!==l){const o=function(t,e){const n=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi"),o=/mso-level-number-format:([^;]{0,100});/gi,i=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,r=n.exec(e);let s="decimal",a="ol",c=null;if(r&&r[1]){const e=o.exec(r[1]);if(e&&e[1]&&(s=e[1].trim(),a="bullet"!==s&&"image"!==s?"ol":"ul"),"bullet"===s){const e=function(t){const e=function(t){if(t.getChild(0).is("$text"))return null;for(const e of t.getChildren()){if(!e.is("element","span"))continue;const t=e.getChild(0);return t.is("$text")?t:t.getChild(0)}return null}(t);if(!e)return null;const n=e._data;if("o"===n)return"circle";if("·"===n)return"disc";if("§"===n)return"square";return null}(t.element);e&&(s=e)}else{const t=i.exec(r[1]);t&&t[1]&&(c=parseInt(t[1]))}}return{type:a,startIndex:c,style:$A(s)}}(t,e);if(i){if(t.indent>r){const t=i.getChild(i.childCount-1),e=t.getChild(t.childCount-1);i=YA(o,e,n),r+=1}else if(t.indent1&&n.setAttribute("start",t.startIndex,i),i}function KA(t){const e={},n=t.getStyle("mso-list");if(n){const t=n.match(/(^|\s{1,100})l(\d+)/i),o=n.match(/\s{0,100}lfo(\d+)/i),i=n.match(/\s{0,100}level(\d+)/i);t&&o&&i&&(e.id=t[2],e.order=o[1],e.indent=parseInt(i[1]))}return e}const QA=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class ZA{constructor(t){this.document=t}isActive(t){return QA.test(t)}execute(t){const e=new Eu(this.document),{body:n}=t._parsedData;!function(t,e){for(const n of t.getChildren())if(n.is("element","b")&&"normal"===n.getStyle("font-weight")){const o=t.getChildIndex(n);e.remove(n),e.insertChild(o,n.getChildren(),t)}}(n,e),function(t,e){for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","li")){const n=t.getChild(0);n&&n.is("element","p")&&e.unwrapElement(n)}}}(n,e),function(t,e){const n=new ma(e.document.stylesProcessor),o=new rc(n,{renderingMode:"data"}),i=o.blockElements,r=o.inlineObjectElements,s=[];for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","br")){const n=WA(t,"forward",e,{blockElements:i,inlineObjectElements:r}),o=WA(t,"backward",e,{blockElements:i,inlineObjectElements:r}),a=qA(n,i);(qA(o,i)||a)&&s.push(t)}}for(const t of s)t.hasClass("Apple-interchange-newline")?e.remove(t):e.replace(t,e.createElement("p"))}(n,e),t.content=n}}function JA(t,e){if(!t.childCount)return;const n=new Eu(t.document),o=function(t,e){const n=e.createRangeIn(t),o=new Hr({name:/v:(.+)/}),i=[];for(const t of n){if("elementStart"!=t.type)continue;const e=t.item,n=e.previousSibling,r=n&&n.is("element")?n.name:null;o.match(e)&&e.getAttribute("o:gfxdata")&&"v:shapetype"!==r&&i.push(t.item.getAttribute("id"))}return i}(t,n);!function(t,e,n){const o=n.createRangeIn(e),i=new Hr({name:"img"}),r=[];for(const e of o)if(e.item.is("element")&&i.match(e.item)){const n=e.item,o=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];o.length&&o.every((e=>t.indexOf(e)>-1))?r.push(n):n.getAttribute("src")||r.push(n)}for(const t of r)n.remove(t)}(o,t,n),function(t,e,n){const o=n.createRangeIn(e),i=[];for(const e of o)if("elementStart"==e.type&&e.item.is("element","v:shape")){const n=e.item.getAttribute("id");if(t.includes(n))continue;r(e.item.parent.getChildren(),n)||i.push(e.item)}for(const t of i){const e={src:s(t)};t.hasAttribute("alt")&&(e.alt=t.getAttribute("alt"));const o=n.createElement("img",e);n.insertChild(t.index+1,o,t.parent)}function r(t,e){for(const n of t)if(n.is("element")){if("img"==n.name&&n.getAttribute("v:shapes")==e)return!0;if(r(n.getChildren(),e))return!0}return!1}function s(t){for(const e of t.getChildren())if(e.is("element")&&e.getAttribute("src"))return e.getAttribute("src")}}(o,t,n),function(t,e){const n=e.createRangeIn(t),o=new Hr({name:/v:(.+)/}),i=[];for(const t of n)"elementStart"==t.type&&o.match(t.item)&&i.push(t.item);for(const t of i)e.remove(t)}(t,n);const i=function(t,e){const n=e.createRangeIn(t),o=new Hr({name:"img"}),i=[];for(const t of n)t.item.is("element")&&o.match(t.item)&&t.item.getAttribute("src").startsWith("file://")&&i.push(t.item);return i}(t,n);i.length&&function(t,e,n){if(t.length===e.length)for(let o=0;oString.fromCharCode(parseInt(t,16)))).join(""))}const tC=//i,eC=/xmlns:o="urn:schemas-microsoft-com/i;class nC{constructor(t){this.document=t}isActive(t){return tC.test(t)||eC.test(t)}execute(t){const{body:e,stylesString:n}=t._parsedData;GA(e,n),JA(e,t.dataTransfer.getData("text/rtf")),t.content=e}}function oC(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1===e.length?" ":Array(e.length+1).join("  ").substr(0,e.length)))}function iC(t,e){const n=new DOMParser,o=function(t){return oC(oC(t)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(t){const e="",n="",o=t.indexOf(e);if(o<0)return t;const i=t.indexOf(n,o+e.length);return t.substring(0,o+e.length)+(i>=0?t.substring(i):"")}(t=t.replace(/

    abc

    \n\t\t\t//\n\t\t\tif ( isAttribute && this._wrapAttributeElement( wrapElement, child ) ) {\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// Wrap the child if it is not an attribute element or if it is an attribute element that should be inside\n\t\t\t// `wrapElement` (due to priority).\n\t\t\t//\n\t\t\t//

    abc

    -->

    abc

    \n\t\t\t//

    abc

    -->

    abc

    \n\t\t\telse if ( isText || !isAttribute || shouldABeOutsideB( wrapElement, child ) ) {\n\t\t\t\t// Clone attribute.\n\t\t\t\tconst newAttribute = wrapElement._clone();\n\n\t\t\t\t// Wrap current node with new attribute.\n\t\t\t\tchild._remove();\n\t\t\t\tnewAttribute._appendChild( child );\n\n\t\t\t\tparent._insertChild( i, newAttribute );\n\t\t\t\tthis._addToClonedElementsGroup( newAttribute );\n\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// If other nested attribute is found and it wasn't wrapped (see above), continue wrapping inside it.\n\t\t\t//\n\t\t\t//

    abc

    -->

    abc

    \n\t\t\t//\n\t\t\telse /* if ( isAttribute ) */ {\n\t\t\t\tthis._wrapChildren( child, 0, child.childCount, wrapElement );\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each wrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of wrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Unwraps children from provided `unwrapElement`. Only children contained in `parent` element between\n\t * `startOffset` and `endOffset` will be unwrapped.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} parent\n\t * @param {Number} startOffset\n\t * @param {Number} endOffset\n\t * @param {module:engine/view/element~Element} unwrapElement\n\t */\n\tprivate _unwrapChildren( parent: Element, startOffset: number, endOffset: number, unwrapElement: AttributeElement ) {\n\t\tlet i = startOffset;\n\t\tconst unwrapPositions: Array = [];\n\n\t\t// Iterate over each element between provided offsets inside parent.\n\t\t// We don't use tree walker or range iterator because we will be removing and merging potentially multiple nodes,\n\t\t// so it could get messy. It is safer to it manually in this case.\n\t\twhile ( i < endOffset ) {\n\t\t\tconst child = parent.getChild( i )!;\n\n\t\t\t// Skip all text nodes. There should be no container element's here either.\n\t\t\tif ( !child.is( 'attributeElement' ) ) {\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// (In all examples, assume that `unwrapElement` is `` element.)\n\t\t\t//\n\t\t\t// If the child is similar to the given attribute element, unwrap it - it will be completely removed.\n\t\t\t//\n\t\t\t//

    abcxyz

    -->

    abcxyz

    \n\t\t\t//\n\t\t\tif ( child.isSimilar( unwrapElement ) ) {\n\t\t\t\tconst unwrapped = child.getChildren();\n\t\t\t\tconst count = child.childCount;\n\n\t\t\t\t// Replace wrapper element with its children\n\t\t\t\tchild._remove();\n\t\t\t\tparent._insertChild( i, unwrapped );\n\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\n\t\t\t\t// Save start and end position of moved items.\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + count )\n\t\t\t\t);\n\n\t\t\t\t// Skip elements that were unwrapped. Assuming there won't be another element to unwrap in child elements.\n\t\t\t\ti += count;\n\t\t\t\tendOffset += count - 1;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If the child is not similar but is an attribute element, try partial unwrapping - remove the same attributes/styles/classes.\n\t\t\t// Partial unwrapping will happen only if the elements have the same name.\n\t\t\t//\n\t\t\t//

    abcxyz

    -->

    abcxyz

    \n\t\t\t//

    abcxyz

    -->

    abcxyz

    \n\t\t\t//\n\t\t\tif ( this._unwrapAttributeElement( unwrapElement, child ) ) {\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + 1 )\n\t\t\t\t);\n\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If other nested attribute is found, look through it's children for elements to unwrap.\n\t\t\t//\n\t\t\t//

    abc

    -->

    abc

    \n\t\t\t//\n\t\t\tthis._unwrapChildren( child, 0, child.childCount, unwrapElement );\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each unwrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of unwrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset || position.offset == endOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Helper function for `view.writer.wrap`. Wraps range with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/range~Range} range\n\t * @param {module:engine/view/attributeelement~AttributeElement} attribute\n\t * @returns {module:engine/view/range~Range} New range after wrapping, spanning over wrapping attribute element.\n\t */\n\tprivate _wrapRange( range: Range, attribute: AttributeElement ): Range {\n\t\t// Break attributes at range start and end.\n\t\tconst { start: breakStart, end: breakEnd } = this._breakAttributesRange( range, true );\n\t\tconst parentContainer = breakStart.parent as Element;\n\n\t\t// Wrap all children with attribute.\n\t\tconst newRange = this._wrapChildren( parentContainer, breakStart.offset, breakEnd.offset, attribute );\n\n\t\t// Merge attributes at the both ends and return a new range.\n\t\tconst start = this.mergeAttributes( newRange.start );\n\n\t\t// If start position was merged - move end position back.\n\t\tif ( !start.isEqual( newRange.start ) ) {\n\t\t\tnewRange.end.offset--;\n\t\t}\n\t\tconst end = this.mergeAttributes( newRange.end );\n\n\t\treturn new Range( start, end );\n\t}\n\n\t/**\n\t * Helper function for {@link #wrap}. Wraps position with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/position~Position} position\n\t * @param {module:engine/view/attributeelement~AttributeElement} attribute\n\t * @returns {module:engine/view/position~Position} New position after wrapping.\n\t */\n\tprivate _wrapPosition( position: Position, attribute: AttributeElement ): Position {\n\t\t// Return same position when trying to wrap with attribute similar to position parent.\n\t\tif ( attribute.isSimilar( position.parent as any ) ) {\n\t\t\treturn movePositionToTextNode( position.clone() );\n\t\t}\n\n\t\t// When position is inside text node - break it and place new position between two text nodes.\n\t\tif ( position.parent.is( '$text' ) ) {\n\t\t\tposition = breakTextNode( position );\n\t\t}\n\n\t\t// Create fake element that will represent position, and will not be merged with other attributes.\n\t\tconst fakeElement = this.createAttributeElement( '_wrapPosition-fake-element' );\n\t\t( fakeElement as any )._priority = Number.POSITIVE_INFINITY;\n\t\tfakeElement.isSimilar = () => false;\n\n\t\t// Insert fake element in position location.\n\t\t( position.parent as Element )._insertChild( position.offset, fakeElement );\n\n\t\t// Range around inserted fake attribute element.\n\t\tconst wrapRange = new Range( position, position.getShiftedBy( 1 ) );\n\n\t\t// Wrap fake element with attribute (it will also merge if possible).\n\t\tthis.wrap( wrapRange, attribute );\n\n\t\t// Remove fake element and place new position there.\n\t\tconst newPosition = new Position( fakeElement.parent!, fakeElement.index! );\n\t\tfakeElement._remove();\n\n\t\t// If position is placed between text nodes - merge them and return position inside.\n\t\tconst nodeBefore = newPosition.nodeBefore;\n\t\tconst nodeAfter = newPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof Text && nodeAfter instanceof Text ) {\n\t\t\treturn mergeTextNodes( nodeBefore, nodeAfter );\n\t\t}\n\n\t\t// If position is next to text node - move position inside.\n\t\treturn movePositionToTextNode( newPosition );\n\t}\n\n\t/**\n\t * \tWraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by\n\t * \tmerging them if possible. When merging is possible - all attributes, styles and classes are moved from wrapper\n\t * \telement to element being wrapped.\n\t *\n\t * \t@private\n\t * \t@param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n\t * \t@param {module:engine/view/attributeelement~AttributeElement} toWrap AttributeElement to wrap using wrapper element.\n\t * \t@returns {Boolean} Returns `true` if elements are merged.\n\t */\n\tprivate _wrapAttributeElement( wrapper: AttributeElement, toWrap: AttributeElement ): boolean {\n\t\tif ( !canBeJoined( wrapper, toWrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't merge if name or priority differs.\n\t\tif ( wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if attributes can be merged.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are different we cannot wrap.\n\t\t\tif ( toWrap.hasAttribute( key ) && toWrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if styles can be merged.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( toWrap.hasStyle( key ) && toWrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Move all attributes/classes/styles from wrapper to wrapped AttributeElement.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Move only these attributes that are not present - other are similar.\n\t\t\tif ( !toWrap.hasAttribute( key ) ) {\n\t\t\t\tthis.setAttribute( key, wrapper.getAttribute( key )!, toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( !toWrap.hasStyle( key ) ) {\n\t\t\t\tthis.setStyle( key, wrapper.getStyle( key )!, toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getClassNames() ) {\n\t\t\tif ( !toWrap.hasClass( key ) ) {\n\t\t\t\tthis.addClass( key, toWrap );\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing\n\t * corresponding attributes, classes and styles. All attributes, classes and styles from wrapper should be present\n\t * inside element being unwrapped.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n\t * @param {module:engine/view/attributeelement~AttributeElement} toUnwrap AttributeElement to unwrap using wrapper element.\n\t * @returns {Boolean} Returns `true` if elements are unwrapped.\n\t **/\n\tprivate _unwrapAttributeElement( wrapper: AttributeElement, toUnwrap: AttributeElement ): boolean {\n\t\tif ( !canBeJoined( wrapper, toUnwrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't unwrap if name or priority differs.\n\t\tif ( wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper attributes.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasAttribute( key ) || toUnwrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper classes.\n\t\tif ( !toUnwrap.hasClass( ...wrapper.getClassNames() ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper styles.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\t// If some styles are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasStyle( key ) || toUnwrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Remove all wrapper's attributes from unwrapped element.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.removeAttribute( key, toUnwrap );\n\t\t}\n\n\t\t// Remove all wrapper's classes from unwrapped element.\n\t\tthis.removeClass( Array.from( wrapper.getClassNames() ), toUnwrap );\n\n\t\t// Remove all wrapper's styles from unwrapped element.\n\t\tthis.removeStyle( Array.from( wrapper.getStyleNames() ), toUnwrap );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at the boundaries of given range.\n\t *\n\t * @private\n\t * @param {module:engine/view/range~Range} range Range which `start` and `end` positions will be used to break attributes.\n\t * @param {Boolean} [forceSplitText=false] If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns {module:engine/view/range~Range} New range with located at break positions.\n\t */\n\tprivate _breakAttributesRange( range: Range, forceSplitText: boolean = false ) {\n\t\tconst rangeStart = range.start;\n\t\tconst rangeEnd = range.end;\n\n\t\tvalidateRangeContainer( range, this.document );\n\n\t\t// Break at the collapsed position. Return new collapsed range.\n\t\tif ( range.isCollapsed ) {\n\t\t\tconst position = this._breakAttributes( range.start, forceSplitText );\n\n\t\t\treturn new Range( position, position );\n\t\t}\n\n\t\tconst breakEnd = this._breakAttributes( rangeEnd, forceSplitText );\n\t\tconst count = ( breakEnd.parent as Element ).childCount;\n\t\tconst breakStart = this._breakAttributes( rangeStart, forceSplitText );\n\n\t\t// Calculate new break end offset.\n\t\tbreakEnd.offset += ( breakEnd.parent as Element ).childCount - count;\n\n\t\treturn new Range( breakStart, breakEnd );\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at given position.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position\n\t * is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position\n\t * is placed inside {@link module:engine/view/uielement~UIElement UIElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/position~Position} position Position where to break attributes.\n\t * @param {Boolean} [forceSplitText=false] If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns {module:engine/view/position~Position} New position after breaking the attributes.\n\t */\n\tprivate _breakAttributes( position: Position, forceSplitText: boolean = false ): Position {\n\t\tconst positionOffset = position.offset;\n\t\tconst positionParent = position.parent;\n\n\t\t// If position is placed inside EmptyElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'emptyElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break an `EmptyElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-empty-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-empty-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside UIElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'uiElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break a `UIElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-ui-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-ui-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside RawElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'rawElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break a `RawElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-raw-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-raw-element', this.document );\n\t\t}\n\n\t\t// There are no attributes to break and text nodes breaking is not forced.\n\t\tif ( !forceSplitText && positionParent.is( '$text' ) && isContainerOrFragment( positionParent.parent! ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Position's parent is container, so no attributes to break.\n\t\tif ( isContainerOrFragment( positionParent ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Break text and start again in new position.\n\t\tif ( positionParent.is( '$text' ) ) {\n\t\t\treturn this._breakAttributes( breakTextNode( position ), forceSplitText );\n\t\t}\n\n\t\tconst length = ( positionParent as any ).childCount;\n\n\t\t//

    foobar{}

    \n\t\t//

    foobar[]

    \n\t\t//

    foobar[]

    \n\t\tif ( positionOffset == length ) {\n\t\t\tconst newPosition = new Position( positionParent.parent as any, ( positionParent as any ).index + 1 );\n\n\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t} else {\n\t\t\t//

    foo{}bar

    \n\t\t\t//

    foo[]bar

    \n\t\t\t//

    foo{}bar

    \n\t\t\tif ( positionOffset === 0 ) {\n\t\t\t\tconst newPosition = new Position( positionParent.parent as Element, ( positionParent as any ).index );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t\t//

    foob{}ar

    \n\t\t\t//

    foob[]ar

    \n\t\t\t//

    foob[]ar

    \n\t\t\t//

    foob[]ar

    \n\t\t\telse {\n\t\t\t\tconst offsetAfter = ( positionParent as any ).index + 1;\n\n\t\t\t\t// Break element.\n\t\t\t\tconst clonedNode = ( positionParent as any )._clone();\n\n\t\t\t\t// Insert cloned node to position's parent node.\n\t\t\t\t( positionParent.parent as any )._insertChild( offsetAfter, clonedNode );\n\t\t\t\tthis._addToClonedElementsGroup( clonedNode );\n\n\t\t\t\t// Get nodes to move.\n\t\t\t\tconst count = ( positionParent as any ).childCount - positionOffset;\n\t\t\t\tconst nodesToMove = ( positionParent as any )._removeChildren( positionOffset, count );\n\n\t\t\t\t// Move nodes to cloned node.\n\t\t\t\tclonedNode._appendChild( nodesToMove );\n\n\t\t\t\t// Create new position to work on.\n\t\t\t\tconst newPosition = new Position( ( positionParent as any ).parent, offsetAfter );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Stores the information that an {@link module:engine/view/attributeelement~AttributeElement attribute element} was\n\t * added to the tree. Saves the reference to the group in the given element and updates the group, so other elements\n\t * from the group now keep a reference to the given attribute element.\n\t *\n\t * The clones group can be obtained using {@link module:engine/view/attributeelement~AttributeElement#getElementsWithSameId}.\n\t *\n\t * Does nothing if added element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} element Attribute element to save.\n\t */\n\tprivate _addToClonedElementsGroup( element: Node ): void {\n\t\t// Add only if the element is in document tree.\n\t\tif ( !element.root.is( 'rootElement' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Traverse the element's children recursively to find other attribute elements that also might got inserted.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._addToClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = ( element as any ).id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\tgroup = new Set();\n\t\t\tthis._cloneGroups.set( id, group );\n\t\t}\n\n\t\tgroup.add( element as AttributeElement );\n\t\t( element as any )._clonesGroup = group;\n\t}\n\n\t/**\n\t * Removes all the information about the given {@link module:engine/view/attributeelement~AttributeElement attribute element}\n\t * from its clones group.\n\t *\n\t * Keep in mind, that the element will still keep a reference to the group (but the group will not keep a reference to it).\n\t * This allows to reference the whole group even if the element was already removed from the tree.\n\t *\n\t * Does nothing if the element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} element Attribute element to remove.\n\t */\n\tprivate _removeFromClonedElementsGroup( element: Node ) {\n\t\t// Traverse the element's children recursively to find other attribute elements that also got removed.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = ( element as any ).id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\treturn;\n\t\t}\n\n\t\tgroup.delete( element as AttributeElement );\n\t\t// Not removing group from element on purpose!\n\t\t// If other parts of code have reference to this element, they will be able to get references to other elements from the group.\n\t}\n}\n\n// Helper function for `view.writer.wrap`. Checks if given element has any children that are not ui elements.\nfunction _hasNonUiChildren( parent: Element ): boolean {\n\treturn Array.from( parent.getChildren() ).some( child => !child.is( 'uiElement' ) );\n}\n\n/**\n * The `attribute` passed to {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`}\n * must be an instance of {@link module:engine/view/attributeelement~AttributeElement `AttributeElement`}.\n *\n * @error view-writer-wrap-invalid-attribute\n */\n\n// Returns first parent container of specified {@link module:engine/view/position~Position Position}.\n// Position's parent node is checked as first, then next parents are checked.\n// Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\n//\n// @param {module:engine/view/position~Position} position Position used as a start point to locate parent container.\n// @returns {module:engine/view/containerelement~ContainerElement|module:engine/view/documentfragment~DocumentFragment|undefined}\n// Parent container element or `undefined` if container is not found.\nfunction getParentContainer( position: Position ): ContainerElement | DocumentFragment | undefined {\n\tlet parent = position.parent;\n\n\twhile ( !isContainerOrFragment( parent ) ) {\n\t\tif ( !parent ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tparent = parent.parent as any;\n\t}\n\n\treturn ( parent as ContainerElement | DocumentFragment );\n}\n\n// Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function\n// can be wrapped outside second element. It is done by comparing elements'\n// {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority\n// {@link module:engine/view/element~Element#getIdentity identities} are compared.\n//\n// @param {module:engine/view/attributeelement~AttributeElement} a\n// @param {module:engine/view/attributeelement~AttributeElement} b\n// @returns {Boolean}\nfunction shouldABeOutsideB( a: AttributeElement, b: AttributeElement ): boolean {\n\tif ( a.priority < b.priority ) {\n\t\treturn true;\n\t} else if ( a.priority > b.priority ) {\n\t\treturn false;\n\t}\n\n\t// When priorities are equal and names are different - use identities.\n\treturn a.getIdentity() < b.getIdentity();\n}\n\n// Returns new position that is moved to near text node. Returns same position if there is no text node before of after\n// specified position.\n//\n//\t\t

    foo[]

    ->

    foo{}

    \n//\t\t

    []foo

    ->

    {}foo

    \n//\n// @param {module:engine/view/position~Position} position\n// @returns {module:engine/view/position~Position} Position located inside text node or same position if there is no text nodes\n// before or after position location.\nfunction movePositionToTextNode( position: Position ): Position {\n\tconst nodeBefore = position.nodeBefore;\n\n\tif ( nodeBefore && nodeBefore.is( '$text' ) ) {\n\t\treturn new Position( nodeBefore, nodeBefore.data.length );\n\t}\n\n\tconst nodeAfter = position.nodeAfter;\n\n\tif ( nodeAfter && nodeAfter.is( '$text' ) ) {\n\t\treturn new Position( nodeAfter, 0 );\n\t}\n\n\treturn position;\n}\n\n// Breaks text node into two text nodes when possible.\n//\n//\t\t

    foo{}bar

    ->

    foo[]bar

    \n//\t\t

    {}foobar

    ->

    []foobar

    \n//\t\t

    foobar{}

    ->

    foobar[]

    \n//\n// @param {module:engine/view/position~Position} position Position that need to be placed inside text node.\n// @returns {module:engine/view/position~Position} New position after breaking text node.\nfunction breakTextNode( position: Position ): Position {\n\tif ( position.offset == ( position.parent as Text ).data.length ) {\n\t\treturn new Position( position.parent.parent as any, ( position.parent as Text ).index! + 1 );\n\t}\n\n\tif ( position.offset === 0 ) {\n\t\treturn new Position( position.parent.parent as any, ( position.parent as Text ).index! );\n\t}\n\n\t// Get part of the text that need to be moved.\n\tconst textToMove = ( position.parent as Text ).data.slice( position.offset );\n\n\t// Leave rest of the text in position's parent.\n\t( position.parent as Text )._data = ( position.parent as Text ).data.slice( 0, position.offset );\n\n\t// Insert new text node after position's parent text node.\n\t( position.parent.parent as any )._insertChild(\n\t\t( position.parent as Text ).index! + 1,\n\t\tnew Text( position.root.document, textToMove )\n\t);\n\n\t// Return new position between two newly created text nodes.\n\treturn new Position( position.parent.parent as any, ( position.parent as Text ).index! + 1 );\n}\n\n// Merges two text nodes into first node. Removes second node and returns merge position.\n//\n// @param {module:engine/view/text~Text} t1 First text node to merge. Data from second text node will be moved at the end of\n// this text node.\n// @param {module:engine/view/text~Text} t2 Second text node to merge. This node will be removed after merging.\n// @returns {module:engine/view/position~Position} Position after merging text nodes.\nfunction mergeTextNodes( t1: Text, t2: Text ): Position {\n\t// Merge text data into first text node and remove second one.\n\tconst nodeBeforeLength = t1.data.length;\n\tt1._data += t2.data;\n\tt2._remove();\n\n\treturn new Position( t1, nodeBeforeLength );\n}\n\nconst validNodesToInsert = [ Text, AttributeElement, ContainerElement, EmptyElement, RawElement, UIElement ];\n\n// Checks if provided nodes are valid to insert.\n//\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\n// contains instances that are not supported ones (see error description for valid ones.\n//\n// @param Iterable. nodes\n// @param {Object} errorContext\nfunction validateNodesToInsert( nodes: Iterable, errorContext: Document ): void {\n\tfor ( const node of nodes ) {\n\t\tif ( !validNodesToInsert.some( ( validNode => node instanceof validNode ) ) ) { // eslint-disable-line no-use-before-define\n\t\t\t/**\n\t\t\t * One of the nodes to be inserted is of an invalid type.\n\t\t\t *\n\t\t\t * Nodes to be inserted with {@link module:engine/view/downcastwriter~DowncastWriter#insert `DowncastWriter#insert()`} should be\n\t\t\t * of the following types:\n\t\t\t *\n\t\t\t * * {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n\t\t\t * * {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n\t\t\t * * {@link module:engine/view/emptyelement~EmptyElement EmptyElement},\n\t\t\t * * {@link module:engine/view/uielement~UIElement UIElement},\n\t\t\t * * {@link module:engine/view/rawelement~RawElement RawElement},\n\t\t\t * * {@link module:engine/view/text~Text Text}.\n\t\t\t *\n\t\t\t * @error view-writer-insert-invalid-node-type\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-insert-invalid-node-type', errorContext );\n\t\t}\n\n\t\tif ( !node.is( '$text' ) ) {\n\t\t\tvalidateNodesToInsert( ( node as Element ).getChildren(), errorContext );\n\t\t}\n\t}\n}\n\n// Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way.\n//\n// @param {module:engine/view/node~Node} node\n// @returns {Boolean} Returns `true` if node is instance of ContainerElement or DocumentFragment.\nfunction isContainerOrFragment( node: Node | DocumentFragment ): boolean {\n\treturn node && ( node.is( 'containerElement' ) || node.is( 'documentFragment' ) );\n}\n\n// Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed\n// inside same {@link module:engine/view/containerelement~ContainerElement container element}.\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.\n//\n// @param {module:engine/view/range~Range} range\n// @param {Object} errorContext\nfunction validateRangeContainer( range: Range, errorContext: Document ) {\n\tconst startContainer = getParentContainer( range.start );\n\tconst endContainer = getParentContainer( range.end );\n\n\tif ( !startContainer || !endContainer || startContainer !== endContainer ) {\n\t\t/**\n\t\t * The container of the given range is invalid.\n\t\t *\n\t\t * This may happen if {@link module:engine/view/range~Range#start range start} and\n\t\t * {@link module:engine/view/range~Range#end range end} positions are not placed inside the same container element or\n\t\t * a parent container for these positions cannot be found.\n\t\t *\n\t\t * Methods like {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#remove()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#clean()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#unwrap()`} need to be called\n\t\t * on a range that has its start and end positions located in the same container element. Both positions can be\n\t\t * nested within other elements (e.g. an attribute element) but the closest container ancestor must be the same.\n\t\t *\n\t\t * @error view-writer-invalid-range-container\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-invalid-range-container', errorContext );\n\t}\n}\n\n// Checks if two attribute elements can be joined together. Elements can be joined together if, and only if\n// they do not have ids specified.\n//\n// @private\n// @param {module:engine/view/element~Element} a\n// @param {module:engine/view/element~Element} b\n// @returns {Boolean}\nfunction canBeJoined( a: AttributeElement, b: AttributeElement ) {\n\treturn a.id === null && b.id === null;\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { keyCodes, isText, type KeystrokeInfo } from '@ckeditor/ckeditor5-utils';\nimport type View from './view';\nimport type DomEventData from './observer/domeventdata';\n\n/**\n * Set of utilities related to handling block and inline fillers.\n *\n * Browsers do not allow to put caret in elements which does not have height. Because of it, we need to fill all\n * empty elements which should be selectable with elements or characters called \"fillers\". Unfortunately there is no one\n * universal filler, this is why two types are uses:\n *\n * * Block filler is an element which fill block elements, like `

    `. CKEditor uses `
    ` as a block filler during the editing,\n * as browsers do natively. So instead of an empty `

    ` there will be `


    `. The advantage of block filler is that\n * it is transparent for the selection, so when the caret is before the `
    ` and user presses right arrow he will be\n * moved to the next paragraph, not after the `
    `. The disadvantage is that it breaks a block, so it can not be used\n * in the middle of a line of text. The {@link module:engine/view/filler~BR_FILLER `
    ` filler} can be replaced with any other\n * character in the data output, for instance {@link module:engine/view/filler~NBSP_FILLER non-breaking space} or\n * {@link module:engine/view/filler~MARKED_NBSP_FILLER marked non-breaking space}.\n *\n * * Inline filler is a filler which does not break a line of text, so it can be used inside the text, for instance in the empty\n * `` surrendered by text: `foobar`, if we want to put the caret there. CKEditor uses a sequence of the zero-width\n * spaces as an {@link module:engine/view/filler~INLINE_FILLER inline filler} having the predetermined\n * {@link module:engine/view/filler~INLINE_FILLER_LENGTH length}. A sequence is used, instead of a single character to\n * avoid treating random zero-width spaces as the inline filler. Disadvantage of the inline filler is that it is not\n * transparent for the selection. The arrow key moves the caret between zero-width spaces characters, so the additional\n * code is needed to handle the caret.\n *\n * Both inline and block fillers are handled by the {@link module:engine/view/renderer~Renderer renderer} and are not present in the\n * view.\n *\n * @module engine/view/filler\n */\n\n/**\n * Non-breaking space filler creator. This function creates the ` ` text node.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\n * @see module:engine/view/filler~BR_FILLER\n * @function\n */\nexport const NBSP_FILLER = ( domDocument: Document ): Text => domDocument.createTextNode( '\\u00A0' );\n\n/**\n * Marked non-breaking space filler creator. This function creates the ` ` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @see module:engine/view/filler~BR_FILLER\n * @function\n */\nexport const MARKED_NBSP_FILLER = ( domDocument: Document ): HTMLSpanElement => {\n\tconst span = domDocument.createElement( 'span' );\n\tspan.dataset.ckeFiller = 'true';\n\tspan.innerText = '\\u00A0';\n\n\treturn span;\n};\n\n/**\n * `
    ` filler creator. This function creates the `
    ` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\n * @function\n */\nexport const BR_FILLER = ( domDocument: Document ): HTMLBRElement => {\n\tconst fillerBr = domDocument.createElement( 'br' );\n\tfillerBr.dataset.ckeFiller = 'true';\n\n\treturn fillerBr;\n};\n\n/**\n * Length of the {@link module:engine/view/filler~INLINE_FILLER INLINE_FILLER}.\n */\nexport const INLINE_FILLER_LENGTH = 7;\n\n/**\n * Inline filler which is a sequence of the word joiners.\n *\n * @type {String}\n */\nexport const INLINE_FILLER = '\\u2060'.repeat( INLINE_FILLER_LENGTH );\n\n/**\n * Checks if the node is a text node which starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n *\t\tstartsWithFiller( document.createTextNode( INLINE_FILLER ) ); // true\n *\t\tstartsWithFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // true\n *\t\tstartsWithFiller( document.createTextNode( 'foo' ) ); // false\n *\t\tstartsWithFiller( document.createElement( 'p' ) ); // false\n *\n * @param {Node} domNode DOM node.\n * @returns {Boolean} True if the text node starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function startsWithFiller( domNode: Node ): boolean {\n\treturn isText( domNode ) && ( domNode.data.substr( 0, INLINE_FILLER_LENGTH ) === INLINE_FILLER );\n}\n\n/**\n * Checks if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n *\t\tisInlineFiller( document.createTextNode( INLINE_FILLER ) ); // true\n *\t\tisInlineFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // false\n *\n * @param {Text} domText DOM text node.\n * @returns {Boolean} True if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function isInlineFiller( domText: Text ): boolean {\n\treturn domText.data.length == INLINE_FILLER_LENGTH && startsWithFiller( domText );\n}\n\n/**\n * Get string data from the text node, removing an {@link module:engine/view/filler~INLINE_FILLER inline filler} from it,\n * if text node contains it.\n *\n *\t\tgetDataWithoutFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ) == 'foo' // true\n *\t\tgetDataWithoutFiller( document.createTextNode( 'foo' ) ) == 'foo' // true\n *\n * @param {Text} domText DOM text node, possible with inline filler.\n * @returns {String} Data without filler.\n */\nexport function getDataWithoutFiller( domText: Text ): string {\n\tif ( startsWithFiller( domText ) ) {\n\t\treturn domText.data.slice( INLINE_FILLER_LENGTH );\n\t} else {\n\t\treturn domText.data;\n\t}\n}\n\n/**\n * Assign key observer which move cursor from the end of the inline filler to the beginning of it when\n * the left arrow is pressed, so the filler does not break navigation.\n *\n * @param {module:engine/view/view~View} view View controller instance we should inject quirks handling on.\n */\nexport function injectQuirksHandling( view: View ): void {\n\tview.document.on( 'arrowKey', jumpOverInlineFiller, { priority: 'low' } );\n}\n\n// Move cursor from the end of the inline filler to the beginning of it when, so the filler does not break navigation.\nfunction jumpOverInlineFiller( evt: unknown, data: DomEventData & KeystrokeInfo ) {\n\tif ( data.keyCode == keyCodes.arrowleft ) {\n\t\tconst domSelection = data.domTarget.ownerDocument.defaultView!.getSelection()!;\n\n\t\tif ( domSelection.rangeCount == 1 && domSelection.getRangeAt( 0 ).collapsed ) {\n\t\t\tconst domParent = domSelection.getRangeAt( 0 ).startContainer;\n\t\t\tconst domOffset = domSelection.getRangeAt( 0 ).startOffset;\n\n\t\t\tif ( startsWithFiller( domParent ) && domOffset <= INLINE_FILLER_LENGTH ) {\n\t\t\t\tdomSelection.collapse( domParent, 0 );\n\t\t\t}\n\t\t}\n\t}\n}\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./renderer.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/renderer\n */\n\nimport ViewText from './text';\nimport ViewPosition from './position';\nimport { INLINE_FILLER, INLINE_FILLER_LENGTH, startsWithFiller, isInlineFiller } from './filler';\n\nimport {\n\tCKEditorError,\n\tObservableMixin,\n\tdiff,\n\tenv,\n\tfastDiff,\n\tinsertAt,\n\tisComment,\n\tisNode,\n\tisText,\n\tremove,\n\ttype DiffResult,\n\ttype ObservableChangeEvent\n} from '@ckeditor/ckeditor5-utils';\n\nimport type { ChangeType } from './document';\nimport type DocumentSelection from './documentselection';\nimport type DomConverter from './domconverter';\nimport type ViewElement from './element';\nimport type ViewNode from './node';\n\nimport '../../theme/renderer.css';\n\ntype DomText = globalThis.Text;\ntype DomNode = globalThis.Node;\ntype DomDocument = globalThis.Document;\ntype DomElement = globalThis.HTMLElement;\ntype DomSelection = globalThis.Selection;\n\n/**\n * Renderer is responsible for updating the DOM structure and the DOM selection based on\n * the {@link module:engine/view/renderer~Renderer#markToSync information about updated view nodes}.\n * In other words, it renders the view to the DOM.\n *\n * Its main responsibility is to make only the necessary, minimal changes to the DOM. However, unlike in many\n * virtual DOM implementations, the primary reason for doing minimal changes is not the performance but ensuring\n * that native editing features such as text composition, autocompletion, spell checking, selection's x-index are\n * affected as little as possible.\n *\n * Renderer uses {@link module:engine/view/domconverter~DomConverter} to transform view nodes and positions\n * to and from the DOM.\n */\nexport default class Renderer extends ObservableMixin() {\n\tpublic readonly domDocuments: Set;\n\tpublic readonly domConverter: DomConverter;\n\tpublic readonly markedAttributes: Set;\n\tpublic readonly markedChildren: Set;\n\tpublic readonly markedTexts: Set;\n\tpublic readonly selection: DocumentSelection;\n\n\tdeclare public readonly isFocused: boolean;\n\tdeclare public readonly isSelecting: boolean;\n\tdeclare public readonly isComposing: boolean;\n\n\tprivate _inlineFiller: DomText | null;\n\tprivate _fakeSelectionContainer: DomElement | null;\n\n\t/**\n\t * Creates a renderer instance.\n\t *\n\t * @param {module:engine/view/domconverter~DomConverter} domConverter Converter instance.\n\t * @param {module:engine/view/documentselection~DocumentSelection} selection View selection.\n\t */\n\tconstructor( domConverter: DomConverter, selection: DocumentSelection ) {\n\t\tsuper();\n\n\t\t/**\n\t\t * Set of DOM Documents instances.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.domDocuments = new Set();\n\n\t\t/**\n\t\t * Converter instance.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/domconverter~DomConverter}\n\t\t */\n\t\tthis.domConverter = domConverter;\n\n\t\t/**\n\t\t * Set of nodes which attributes changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedAttributes = new Set();\n\n\t\t/**\n\t\t * Set of elements which child lists changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedChildren = new Set();\n\n\t\t/**\n\t\t * Set of text nodes which text data changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedTexts = new Set();\n\n\t\t/**\n\t\t * View selection. Renderer updates DOM selection based on the view selection.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/documentselection~DocumentSelection}\n\t\t */\n\t\tthis.selection = selection;\n\n\t\t/**\n\t\t * Indicates if the view document is focused and selection can be rendered. Selection will not be rendered if\n\t\t * this is set to `false`.\n\t\t *\n\t\t * @member {Boolean}\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'isFocused', false );\n\n\t\t/**\n\t\t * Indicates whether the user is making a selection in the document (e.g. holding the mouse button and moving the cursor).\n\t\t * When they stop selecting, the property goes back to `false`.\n\t\t *\n\t\t * Note: In some browsers, the renderer will stop rendering the selection and inline fillers while the user is making\n\t\t * a selection to avoid glitches in DOM selection\n\t\t * (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\t *\n\t\t * @member {Boolean}\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'isSelecting', false );\n\n\t\t// Rendering the selection and inline filler manipulation should be postponed in (non-Android) Blink until the user finishes\n\t\t// creating the selection in DOM to avoid accidental selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\t// When the user stops selecting, all pending changes should be rendered ASAP, though.\n\t\tif ( env.isBlink && !env.isAndroid ) {\n\t\t\tthis.on( 'change:isSelecting', () => {\n\t\t\t\tif ( !this.isSelecting ) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t/**\n\t\t * True if composition is in progress inside the document.\n\t\t *\n\t\t * This property is bound to the {@link module:engine/view/document~Document#isComposing `Document#isComposing`} property.\n\t\t *\n\t\t * @member {Boolean}\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'isComposing', false );\n\n\t\tthis.on( 'change:isComposing', () => {\n\t\t\tif ( !this.isComposing ) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The text node in which the inline filler was rendered.\n\t\t *\n\t\t * @private\n\t\t * @member {Text}\n\t\t */\n\t\tthis._inlineFiller = null;\n\n\t\t/**\n\t\t * DOM element containing fake selection.\n\t\t *\n\t\t * @private\n\t\t * @type {null|HTMLElement}\n\t\t */\n\t\tthis._fakeSelectionContainer = null;\n\t}\n\n\t/**\n\t * Marks a view node to be updated in the DOM by {@link #render `render()`}.\n\t *\n\t * Note that only view nodes whose parents have corresponding DOM elements need to be marked to be synchronized.\n\t *\n\t * @see #markedAttributes\n\t * @see #markedChildren\n\t * @see #markedTexts\n\t *\n\t * @param {module:engine/view/document~ChangeType} type Type of the change.\n\t * @param {module:engine/view/node~ViewNode} node ViewNode to be marked.\n\t */\n\tpublic markToSync( type: ChangeType, node: ViewNode ): void {\n\t\tif ( type === 'text' ) {\n\t\t\tif ( this.domConverter.mapViewToDom( node.parent! ) ) {\n\t\t\t\tthis.markedTexts.add( node );\n\t\t\t}\n\t\t} else {\n\t\t\t// If the node has no DOM element it is not rendered yet,\n\t\t\t// its children/attributes do not need to be marked to be sync.\n\t\t\tif ( !this.domConverter.mapViewToDom( node as ViewElement ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( type === 'attributes' ) {\n\t\t\t\tthis.markedAttributes.add( node as ViewElement );\n\t\t\t} else if ( type === 'children' ) {\n\t\t\t\tthis.markedChildren.add( node as ViewElement );\n\t\t\t} else {\n\t\t\t\t/**\n\t\t\t\t * Unknown type passed to Renderer.markToSync.\n\t\t\t\t *\n\t\t\t\t * @error view-renderer-unknown-type\n\t\t\t\t */\n\t\t\t\tthrow new CKEditorError( 'view-renderer-unknown-type', this );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Renders all buffered changes ({@link #markedAttributes}, {@link #markedChildren} and {@link #markedTexts}) and\n\t * the current view selection (if needed) to the DOM by applying a minimal set of changes to it.\n\t *\n\t * Renderer tries not to break the text composition (e.g. IME) and x-index of the selection,\n\t * so it does as little as it is needed to update the DOM.\n\t *\n\t * Renderer also handles {@link module:engine/view/filler fillers}. Especially, it checks if the inline filler is needed\n\t * at the selection position and adds or removes it. To prevent breaking text composition inline filler will not be\n\t * removed as long as the selection is in the text node which needed it at first.\n\t */\n\tpublic render(): void {\n\t\t// Ignore rendering while in the composition mode. Composition events are not cancellable and browser will modify the DOM tree.\n\t\t// All marked elements, attributes, etc. will wait until next render after the composition ends.\n\t\t// On Android composition events are immediately applied to the model, so we don't need to skip rendering,\n\t\t// and we should not do it because the difference between view and DOM could lead to position mapping problems.\n\t\tif ( this.isComposing && !env.isAndroid ) {\n\t\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Rendering aborted while isComposing',\n\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t\treturn;\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Rendering',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\tlet inlineFillerPosition: ViewPosition | null = null;\n\t\tconst isInlineFillerRenderingPossible = env.isBlink && !env.isAndroid ? !this.isSelecting : true;\n\n\t\t// Refresh mappings.\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildrenMappings( element );\n\t\t}\n\n\t\t// Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\n\t\t// DOM selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\tif ( isInlineFillerRenderingPossible ) {\n\t\t\t// There was inline filler rendered in the DOM but it's not\n\t\t\t// at the selection position any more, so we can remove it\n\t\t\t// (cause even if it's needed, it must be placed in another location).\n\t\t\tif ( this._inlineFiller && !this._isSelectionInInlineFiller() ) {\n\t\t\t\tthis._removeInlineFiller();\n\t\t\t}\n\n\t\t\t// If we've got the filler, let's try to guess its position in the view.\n\t\t\tif ( this._inlineFiller ) {\n\t\t\t\tinlineFillerPosition = this._getInlineFillerPosition();\n\t\t\t}\n\t\t\t// Otherwise, if it's needed, create it at the selection position.\n\t\t\telse if ( this._needsInlineFillerAtSelection() ) {\n\t\t\t\tinlineFillerPosition = this.selection.getFirstPosition()!;\n\n\t\t\t\t// Do not use `markToSync` so it will be added even if the parent is already added.\n\t\t\t\tthis.markedChildren.add( inlineFillerPosition.parent as ViewElement );\n\t\t\t}\n\t\t}\n\t\t// Make sure the inline filler has any parent, so it can be mapped to view position by DomConverter.\n\t\telse if ( this._inlineFiller && this._inlineFiller.parentNode ) {\n\t\t\t// While the user is making selection, preserve the inline filler at its original position.\n\t\t\tinlineFillerPosition = this.domConverter.domPositionToView( this._inlineFiller )!;\n\n\t\t\t// While down-casting the document selection attributes, all existing empty\n\t\t\t// attribute elements (for selection position) are removed from the view and DOM,\n\t\t\t// so make sure that we were able to map filler position.\n\t\t\t// https://github.com/ckeditor/ckeditor5/issues/12026\n\t\t\tif ( inlineFillerPosition && inlineFillerPosition.parent.is( '$text' ) ) {\n\t\t\t\t// The inline filler position is expected to be before the text node.\n\t\t\t\tinlineFillerPosition = ViewPosition._createBefore( inlineFillerPosition.parent );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const element of this.markedAttributes ) {\n\t\t\tthis._updateAttrs( element );\n\t\t}\n\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildren( element, { inlineFillerPosition } );\n\t\t}\n\n\t\tfor ( const node of this.markedTexts ) {\n\t\t\tif ( !this.markedChildren.has( node.parent as ViewElement ) && this.domConverter.mapViewToDom( node.parent as ViewElement ) ) {\n\t\t\t\tthis._updateText( node as ViewText, { inlineFillerPosition } );\n\t\t\t}\n\t\t}\n\n\t\t// * Check whether the inline filler is required and where it really is in the DOM.\n\t\t// At this point in most cases it will be in the DOM, but there are exceptions.\n\t\t// For example, if the inline filler was deep in the created DOM structure, it will not be created.\n\t\t// Similarly, if it was removed at the beginning of this function and then neither text nor children were updated,\n\t\t// it will not be present. Fix those and similar scenarios.\n\t\t// * Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\n\t\t// DOM selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\tif ( isInlineFillerRenderingPossible ) {\n\t\t\tif ( inlineFillerPosition ) {\n\t\t\t\tconst fillerDomPosition = this.domConverter.viewPositionToDom( inlineFillerPosition )!;\n\t\t\t\tconst domDocument = fillerDomPosition.parent.ownerDocument!;\n\n\t\t\t\tif ( !startsWithFiller( fillerDomPosition.parent ) ) {\n\t\t\t\t\t// Filler has not been created at filler position. Create it now.\n\t\t\t\t\tthis._inlineFiller = addInlineFiller( domDocument, fillerDomPosition.parent, fillerDomPosition.offset );\n\t\t\t\t} else {\n\t\t\t\t\t// Filler has been found, save it.\n\t\t\t\t\tthis._inlineFiller = fillerDomPosition.parent as DomText;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// There is no filler needed.\n\t\t\t\tthis._inlineFiller = null;\n\t\t\t}\n\t\t}\n\n\t\t// First focus the new editing host, then update the selection.\n\t\t// Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721).\n\t\tthis._updateFocus();\n\t\tthis._updateSelection();\n\n\t\tthis.markedTexts.clear();\n\t\tthis.markedAttributes.clear();\n\t\tthis.markedChildren.clear();\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t// @if CK_DEBUG_TYPING // }\n\t}\n\n\t/**\n\t * Updates mappings of view element's children.\n\t *\n\t * Children that were replaced in the view structure by similar elements (same tag name) are treated as 'replaced'.\n\t * This means that their mappings can be updated so the new view elements are mapped to the existing DOM elements.\n\t * Thanks to that these elements do not need to be re-rendered completely.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~ViewNode} viewElement The view element whose children mappings will be updated.\n\t */\n\tprivate _updateChildrenMappings( viewElement: ViewElement ): void {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM and there is no need to process it.\n\t\t\treturn;\n\t\t}\n\n\t\t// Removing nodes from the DOM as we iterate can cause `actualDomChildren`\n\t\t// (which is a live-updating `NodeList`) to get out of sync with the\n\t\t// indices that we compute as we iterate over `actions`.\n\t\t// This would produce incorrect element mappings.\n\t\t//\n\t\t// Converting live list to an array to make the list static.\n\t\tconst actualDomChildren = Array.from(\n\t\t\tthis.domConverter.mapViewToDom( viewElement )!.childNodes\n\t\t);\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, { withChildren: false } )\n\t\t);\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\t\tconst actions = this._findReplaceActions( diff, actualDomChildren, expectedDomChildren );\n\n\t\tif ( actions.indexOf( 'replace' ) !== -1 ) {\n\t\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\t\tfor ( const action of actions ) {\n\t\t\t\tif ( action === 'replace' ) {\n\t\t\t\t\tconst insertIndex = counter.equal + counter.insert;\n\t\t\t\t\tconst deleteIndex = counter.equal + counter.delete;\n\t\t\t\t\tconst viewChild = viewElement.getChild( insertIndex );\n\n\t\t\t\t\t// UIElement and RawElement are special cases. Their children are not stored in a view (#799)\n\t\t\t\t\t// so we cannot use them with replacing flow (since they use view children during rendering\n\t\t\t\t\t// which will always result in rendering empty elements).\n\t\t\t\t\tif ( viewChild && !( viewChild.is( 'uiElement' ) || viewChild.is( 'rawElement' ) ) ) {\n\t\t\t\t\t\tthis._updateElementMappings( viewChild as ViewElement, actualDomChildren[ deleteIndex ] as DomElement );\n\t\t\t\t\t}\n\n\t\t\t\t\tremove( expectedDomChildren[ insertIndex ] );\n\t\t\t\t\tcounter.equal++;\n\t\t\t\t} else {\n\t\t\t\t\tcounter[ action ]++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates mappings of a given view element.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~ViewNode} viewElement The view element whose mappings will be updated.\n\t * @param {ViewNode} domElement The DOM element representing the given view element.\n\t */\n\tprivate _updateElementMappings( viewElement: ViewElement, domElement: DomElement ): void {\n\t\t// Remap 'DomConverter' bindings.\n\t\tthis.domConverter.unbindDomElement( domElement );\n\t\tthis.domConverter.bindElements( domElement, viewElement );\n\n\t\t// View element may have children which needs to be updated, but are not marked, mark them to update.\n\t\tthis.markedChildren.add( viewElement );\n\n\t\t// Because we replace new view element mapping with the existing one, the corresponding DOM element\n\t\t// will not be rerendered. The new view element may have different attributes than the previous one.\n\t\t// Since its corresponding DOM element will not be rerendered, new attributes will not be added\n\t\t// to the DOM, so we need to mark it here to make sure its attributes gets updated. See #1427 for more\n\t\t// detailed case study.\n\t\t// Also there are cases where replaced element is removed from the view structure and then has\n\t\t// its attributes changed or removed. In such cases the element will not be present in `markedAttributes`\n\t\t// and also may be the same (`element.isSimilar()`) as the reused element not having its attributes updated.\n\t\t// To prevent such situations we always mark reused element to have its attributes rerenderd (#1560).\n\t\tthis.markedAttributes.add( viewElement );\n\t}\n\n\t/**\n\t * Gets the position of the inline filler based on the current selection.\n\t * Here, we assume that we know that the filler is needed and\n\t * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it is needed,\n\t * it is somewhere at the selection position.\n\t *\n\t * Note: The filler position cannot be restored based on the filler's DOM text node, because\n\t * when this method is called (before rendering), the bindings will often be broken. View-to-DOM\n\t * bindings are only dependable after rendering.\n\t *\n\t * @private\n\t * @returns {module:engine/view/position~Position}\n\t */\n\tprivate _getInlineFillerPosition(): ViewPosition {\n\t\tconst firstPos = this.selection.getFirstPosition()!;\n\n\t\tif ( firstPos.parent.is( '$text' ) ) {\n\t\t\treturn ViewPosition._createBefore( firstPos.parent );\n\t\t} else {\n\t\t\treturn firstPos;\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if the selection has not left the inline filler's text node.\n\t * If it is `true`, it means that the filler had been added for a reason and the selection did not\n\t * leave the filler's text node. For example, the user can be in the middle of a composition so it should not be touched.\n\t *\n\t * @private\n\t * @returns {Boolean} `true` if the inline filler and selection are in the same place.\n\t */\n\tprivate _isSelectionInInlineFiller(): boolean {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Note, we can't check if selection's position equals position of the\n\t\t// this._inlineFiller node, because of #663. We may not be able to calculate\n\t\t// the filler's position in the view at this stage.\n\t\t// Instead, we check it the other way – whether selection is anchored in\n\t\t// that text node or next to it.\n\n\t\t// Possible options are:\n\t\t// \"FILLER{}\"\n\t\t// \"FILLERadded-text{}\"\n\t\tconst selectionPosition = this.selection.getFirstPosition()!;\n\t\tconst position = this.domConverter.viewPositionToDom( selectionPosition );\n\n\t\tif ( position && isText( position.parent ) && startsWithFiller( position.parent ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Removes the inline filler.\n\t *\n\t * @private\n\t */\n\tprivate _removeInlineFiller(): void {\n\t\tconst domFillerNode = this._inlineFiller!;\n\n\t\t// Something weird happened and the stored node doesn't contain the filler's text.\n\t\tif ( !startsWithFiller( domFillerNode ) ) {\n\t\t\t/**\n\t\t\t * The inline filler node was lost. Most likely, something overwrote the filler text node\n\t\t\t * in the DOM.\n\t\t\t *\n\t\t\t * @error view-renderer-filler-was-lost\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-renderer-filler-was-lost', this );\n\t\t}\n\n\t\tif ( isInlineFiller( domFillerNode ) ) {\n\t\t\tdomFillerNode.remove();\n\t\t} else {\n\t\t\tdomFillerNode.data = domFillerNode.data.substr( INLINE_FILLER_LENGTH );\n\t\t}\n\n\t\tthis._inlineFiller = null;\n\t}\n\n\t/**\n\t * Checks if the inline {@link module:engine/view/filler filler} should be added.\n\t *\n\t * @private\n\t * @returns {Boolean} `true` if the inline filler should be added.\n\t */\n\tprivate _needsInlineFillerAtSelection(): boolean {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst selectionPosition = this.selection.getFirstPosition()!;\n\t\tconst selectionParent = selectionPosition.parent;\n\t\tconst selectionOffset = selectionPosition.offset;\n\n\t\t// If there is no DOM root we do not care about fillers.\n\t\tif ( !this.domConverter.mapViewToDom( selectionParent.root ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !( selectionParent.is( 'element' ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Prevent adding inline filler inside elements with contenteditable=false.\n\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/1170\n\t\tif ( !isEditable( selectionParent ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We have block filler, we do not need inline one.\n\t\tif ( selectionOffset === selectionParent.getFillerOffset!() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst nodeBefore = selectionPosition.nodeBefore;\n\t\tconst nodeAfter = selectionPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof ViewText || nodeAfter instanceof ViewText ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Do not use inline filler while typing outside inline elements on Android.\n\t\t// The deleteContentBackward would remove part of the inline filler instead of removing last letter in a link.\n\t\tif ( env.isAndroid && ( nodeBefore || nodeAfter ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks if text needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/text~Text} viewText View text to update.\n\t * @param {Object} options\n\t * @param {module:engine/view/position~Position} options.inlineFillerPosition The position where the inline\n\t * filler should be rendered.\n\t */\n\tprivate _updateText( viewText: ViewText, options: { inlineFillerPosition?: ViewPosition | null } ) {\n\t\tconst domText = this.domConverter.findCorrespondingDomText( viewText )!;\n\t\tconst newDomText = this.domConverter.viewToDom( viewText ) as DomText;\n\n\t\tlet expectedText = newDomText.data;\n\t\tconst filler = options.inlineFillerPosition;\n\n\t\tif ( filler && filler.parent == viewText.parent && filler.offset == viewText.index ) {\n\t\t\texpectedText = INLINE_FILLER + expectedText;\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update text',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\tupdateTextNode( domText, expectedText );\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t// @if CK_DEBUG_TYPING // }\n\t}\n\n\t/**\n\t * Checks if attribute list needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} viewElement The view element to update.\n\t */\n\tprivate _updateAttrs( viewElement: ViewElement ): void {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that 'viewElement' is outdated as its mapping was updated\n\t\t\t// in 'this._updateChildrenMappings()'. There is no need to process it as new view element which\n\t\t\t// replaced old 'viewElement' mapping was also added to 'this.markedAttributes'\n\t\t\t// in 'this._updateChildrenMappings()' so it will be processed separately.\n\t\t\treturn;\n\t\t}\n\n\t\tconst domAttrKeys = Array.from( ( domElement as DomElement ).attributes ).map( attr => attr.name );\n\t\tconst viewAttrKeys = viewElement.getAttributeKeys();\n\n\t\t// Add or overwrite attributes.\n\t\tfor ( const key of viewAttrKeys ) {\n\t\t\tthis.domConverter.setDomElementAttribute( domElement as DomElement, key, viewElement.getAttribute( key )!, viewElement );\n\t\t}\n\n\t\t// Remove from DOM attributes which do not exists in the view.\n\t\tfor ( const key of domAttrKeys ) {\n\t\t\t// All other attributes not present in the DOM should be removed.\n\t\t\tif ( !viewElement.hasAttribute( key ) ) {\n\t\t\t\tthis.domConverter.removeDomElementAttribute( domElement as DomElement, key );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if elements child list needs to be updated and possibly updates it.\n\t *\n\t * Note that on Android, to reduce the risk of composition breaks, it tries to update data of an existing\n\t * child text nodes instead of replacing them completely.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} viewElement View element to update.\n\t * @param {Object} options\n\t * @param {module:engine/view/position~Position} options.inlineFillerPosition The position where the inline\n\t * filler should be rendered.\n\t */\n\tprivate _updateChildren( viewElement: ViewElement, options: { inlineFillerPosition: ViewPosition | null } ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM.\n\t\t\t// There is no need to process it. It will be processed when re-inserted.\n\t\t\treturn;\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update children',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t// IME on Android inserts a new text node while typing after a link\n\t\t// instead of updating an existing text node that follows the link.\n\t\t// We must normalize those text nodes so the diff won't get confused.\n\t\t// https://github.com/ckeditor/ckeditor5/issues/12574.\n\t\tif ( env.isAndroid ) {\n\t\t\tlet previousDomNode = null;\n\n\t\t\tfor ( const domNode of Array.from( domElement.childNodes ) ) {\n\t\t\t\tif ( previousDomNode && isText( previousDomNode ) && isText( domNode ) ) {\n\t\t\t\t\tdomElement.normalize();\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpreviousDomNode = domNode;\n\t\t\t}\n\t\t}\n\n\t\tconst inlineFillerPosition = options.inlineFillerPosition;\n\t\tconst actualDomChildren = domElement.childNodes;\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, { bind: true } )\n\t\t);\n\n\t\t// Inline filler element has to be created as it is present in the DOM, but not in the view. It is required\n\t\t// during diffing so text nodes could be compared correctly and also during rendering to maintain\n\t\t// proper order and indexes while updating the DOM.\n\t\tif ( inlineFillerPosition && inlineFillerPosition.parent === viewElement ) {\n\t\t\taddInlineFiller( ( domElement as DomElement ).ownerDocument, expectedDomChildren, inlineFillerPosition.offset );\n\t\t}\n\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\n\t\t// The rendering is not disabled on Android in the composition mode.\n\t\t// Composition events are not cancellable and browser will modify the DOM tree.\n\t\t// On Android composition events are immediately applied to the model, so we don't need to skip rendering,\n\t\t// and we should not do it because the difference between view and DOM could lead to position mapping problems.\n\t\t// Since the composition is fragile and often breaks if the composed text node is replaced while composing\n\t\t// we need to make sure that we update the existing text node and not replace it with another one.\n\t\t// We don't want to change the behavior on other browsers for safety, but maybe one day cause it seems to make sense.\n\t\t// https://github.com/ckeditor/ckeditor5/issues/12455.\n\t\tconst actions = env.isAndroid ?\n\t\t\tthis._findReplaceActions( diff, actualDomChildren, expectedDomChildren, { replaceText: true } ) :\n\t\t\tdiff;\n\n\t\tlet i = 0;\n\t\tconst nodesToUnbind: Set = new Set();\n\n\t\t// Handle deletions first.\n\t\t// This is to prevent a situation where an element that already exists in `actualDomChildren` is inserted at a different\n\t\t// index in `actualDomChildren`. Since `actualDomChildren` is a `NodeList`, this works like move, not like an insert,\n\t\t// and it disrupts the whole algorithm. See https://github.com/ckeditor/ckeditor5/issues/6367.\n\t\t//\n\t\t// It doesn't matter in what order we remove or add nodes, as long as we remove and add correct nodes at correct indexes.\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'delete' ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Remove node',\n\t\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', actualDomChildren[ i ]\n\t\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\t\t\t\tnodesToUnbind.add( actualDomChildren[ i ] as DomElement );\n\t\t\t\tremove( actualDomChildren[ i ] );\n\t\t\t} else if ( action === 'equal' || action === 'replace' ) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\ti = 0;\n\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Insert node',\n\t\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', expectedDomChildren[ i ]\n\t\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t\t\tinsertAt( domElement as DomElement, i, expectedDomChildren[ i ] );\n\t\t\t\ti++;\n\t\t\t}\n\t\t\t// Update the existing text node data. Note that replace action is generated only for Android for now.\n\t\t\telse if ( action === 'replace' ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update text node',\n\t\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t\t\tupdateTextNode( actualDomChildren[ i ] as DomText, ( expectedDomChildren[ i ] as DomText ).data );\n\t\t\t\ti++;\n\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\t\t\t} else if ( action === 'equal' ) {\n\t\t\t\t// Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125).\n\t\t\t\t// Do it here (not in the loop above) because only after insertions the `i` index is correct.\n\t\t\t\tthis._markDescendantTextToSync( this.domConverter.domToView( expectedDomChildren[ i ] ) as any );\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\t// Unbind removed nodes. When node does not have a parent it means that it was removed from DOM tree during\n\t\t// comparison with the expected DOM. We don't need to check child nodes, because if child node was reinserted,\n\t\t// it was moved to DOM tree out of the removed node.\n\t\tfor ( const node of nodesToUnbind ) {\n\t\t\tif ( !node.parentNode ) {\n\t\t\t\tthis.domConverter.unbindDomElement( node as DomElement );\n\t\t\t}\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t// @if CK_DEBUG_TYPING // }\n\t}\n\n\t/**\n\t * Shorthand for diffing two arrays or node lists of DOM nodes.\n\t *\n\t * @private\n\t * @param {Array.|NodeList} actualDomChildren Actual DOM children\n\t * @param {Array.|NodeList} expectedDomChildren Expected DOM children.\n\t * @returns {Array.} The list of actions based on the {@link module:utils/diff~diff} function.\n\t */\n\tprivate _diffNodeLists( actualDomChildren: Array | NodeList, expectedDomChildren: Array | NodeList ) {\n\t\tactualDomChildren = filterOutFakeSelectionContainer( actualDomChildren, this._fakeSelectionContainer );\n\n\t\treturn diff( actualDomChildren, expectedDomChildren, sameNodes.bind( null, this.domConverter ) );\n\t}\n\n\t/**\n\t * Finds DOM nodes that were replaced with the similar nodes (same tag name) in the view. All nodes are compared\n\t * within one `insert`/`delete` action group, for example:\n\t *\n\t * \t\tActual DOM:\t\t

    FooBarBazBax

    \n\t * \t\tExpected DOM:\t

    Bar123Baz456

    \n\t * \t\tInput actions:\t[ insert, insert, delete, delete, equal, insert, delete ]\n\t * \t\tOutput actions:\t[ insert, replace, delete, equal, replace ]\n\t *\n\t * @private\n\t * @param {Array.} actions Actions array which is a result of the {@link module:utils/diff~diff} function.\n\t * @param {Array.|NodeList} actualDom Actual DOM children\n\t * @param {Array.} expectedDom Expected DOM children.\n\t * @param {Object} [options] Options\n\t * @param {Boolean} [options.replaceText] Mark text nodes replacement.\n\t * @returns {Array.} Actions array modified with the `replace` actions.\n\t */\n\tprivate _findReplaceActions(\n\t\tactions: Array,\n\t\tactualDom: Array | NodeList,\n\t\texpectedDom: Array,\n\t\toptions: { replaceText?: boolean } = {}\n\t): Array {\n\t\t// If there is no both 'insert' and 'delete' actions, no need to check for replaced elements.\n\t\tif ( actions.indexOf( 'insert' ) === -1 || actions.indexOf( 'delete' ) === -1 ) {\n\t\t\treturn actions;\n\t\t}\n\n\t\tlet newActions: Array = [];\n\t\tlet actualSlice = [];\n\t\tlet expectedSlice = [];\n\n\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\texpectedSlice.push( expectedDom[ counter.equal + counter.insert ] );\n\t\t\t} else if ( action === 'delete' ) {\n\t\t\t\tactualSlice.push( actualDom[ counter.equal + counter.delete ] );\n\t\t\t} else { // equal\n\t\t\t\tnewActions = newActions.concat(\n\t\t\t\t\tdiff( actualSlice, expectedSlice, options.replaceText ? areTextNodes : areSimilar )\n\t\t\t\t\t\t.map( x => x === 'equal' ? 'replace' : x )\n\t\t\t\t);\n\t\t\t\tnewActions.push( 'equal' );\n\t\t\t\t// Reset stored elements on 'equal'.\n\t\t\t\tactualSlice = [];\n\t\t\t\texpectedSlice = [];\n\t\t\t}\n\t\t\tcounter[ action ]++;\n\t\t}\n\n\t\treturn newActions.concat(\n\t\t\tdiff( actualSlice, expectedSlice, options.replaceText ? areTextNodes : areSimilar )\n\t\t\t\t.map( x => x === 'equal' ? 'replace' : x )\n\t\t);\n\t}\n\n\t/**\n\t * Marks text nodes to be synchronized.\n\t *\n\t * If a text node is passed, it will be marked. If an element is passed, all descendant text nodes inside it will be marked.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~ViewNode} viewNode View node to sync.\n\t */\n\tprivate _markDescendantTextToSync( viewNode: ViewNode | undefined ): void {\n\t\tif ( !viewNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( viewNode.is( '$text' ) ) {\n\t\t\tthis.markedTexts.add( viewNode );\n\t\t} else if ( viewNode.is( 'element' ) ) {\n\t\t\tfor ( const child of viewNode.getChildren() ) {\n\t\t\t\tthis._markDescendantTextToSync( child );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the selection needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t */\n\tprivate _updateSelection(): void {\n\t\t// Block updating DOM selection in (non-Android) Blink while the user is selecting to prevent accidental selection collapsing.\n\t\t// Note: Structural changes in DOM must trigger selection rendering, though. Nodes the selection was anchored\n\t\t// to, may disappear in DOM which would break the selection (e.g. in real-time collaboration scenarios).\n\t\t// https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723\n\t\tif ( env.isBlink && !env.isAndroid && this.isSelecting && !this.markedChildren.size ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there is no selection - remove DOM and fake selections.\n\t\tif ( this.selection.rangeCount === 0 ) {\n\t\t\tthis._removeDomSelection();\n\t\t\tthis._removeFakeSelection();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst domRoot = this.domConverter.mapViewToDom( this.selection.editableElement! ) as DomElement;\n\n\t\t// Do nothing if there is no focus, or there is no DOM element corresponding to selection's editable element.\n\t\tif ( !this.isFocused || !domRoot ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Render fake selection - create the fake selection container (if needed) and move DOM selection to it.\n\t\tif ( this.selection.isFake ) {\n\t\t\tthis._updateFakeSelection( domRoot );\n\t\t}\n\t\t// There was a fake selection so remove it and update the DOM selection.\n\t\t// This is especially important on Android because otherwise IME will try to compose over the fake selection container.\n\t\telse if ( this._fakeSelectionContainer && this._fakeSelectionContainer.isConnected ) {\n\t\t\tthis._removeFakeSelection();\n\t\t\tthis._updateDomSelection( domRoot );\n\t\t}\n\t\t// Update the DOM selection in case of a plain selection change (no fake selection is involved).\n\t\t// On non-Android the whole rendering is disabled in composition mode (including DOM selection update),\n\t\t// but updating DOM selection should be also disabled on Android if in the middle of the composition\n\t\t// (to not interrupt it).\n\t\telse if ( !( this.isComposing && env.isAndroid ) ) {\n\t\t\tthis._updateDomSelection( domRoot );\n\t\t}\n\t}\n\n\t/**\n\t * Updates the fake selection.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where the fake selection container should be added.\n\t */\n\tprivate _updateFakeSelection( domRoot: DomElement ): void {\n\t\tconst domDocument = domRoot.ownerDocument;\n\n\t\tif ( !this._fakeSelectionContainer ) {\n\t\t\tthis._fakeSelectionContainer = createFakeSelectionContainer( domDocument );\n\t\t}\n\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\t// Bind fake selection container with the current selection *position*.\n\t\tthis.domConverter.bindFakeSelection( container, this.selection );\n\n\t\tif ( !this._fakeSelectionNeedsUpdate( domRoot ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !container.parentElement || container.parentElement != domRoot ) {\n\t\t\tdomRoot.appendChild( container );\n\t\t}\n\n\t\tcontainer.textContent = this.selection.fakeSelectionLabel || '\\u00A0';\n\n\t\tconst domSelection = domDocument.getSelection()!;\n\t\tconst domRange = domDocument.createRange();\n\n\t\tdomSelection.removeAllRanges();\n\t\tdomRange.selectNodeContents( container );\n\t\tdomSelection.addRange( domRange );\n\t}\n\n\t/**\n\t * Updates the DOM selection.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where the DOM selection should be rendered.\n\t */\n\tprivate _updateDomSelection( domRoot: DomElement ) {\n\t\tconst domSelection = domRoot.ownerDocument.defaultView!.getSelection()!;\n\n\t\t// Let's check whether DOM selection needs updating at all.\n\t\tif ( !this._domSelectionNeedsUpdate( domSelection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Multi-range selection is not available in most browsers, and, at least in Chrome, trying to\n\t\t// set such selection, that is not continuous, throws an error. Because of that, we will just use anchor\n\t\t// and focus of view selection.\n\t\t// Since we are not supporting multi-range selection, we also do not need to check if proper editable is\n\t\t// selected. If there is any editable selected, it is okay (editable is taken from selection anchor).\n\t\tconst anchor = this.domConverter.viewPositionToDom( this.selection.anchor! )!;\n\t\tconst focus = this.domConverter.viewPositionToDom( this.selection.focus! )!;\n\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Update DOM selection:',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', anchor, focus\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\tdomSelection.collapse( anchor.parent, anchor.offset );\n\t\tdomSelection.extend( focus.parent, focus.offset );\n\n\t\t// Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n\t\tif ( env.isGecko ) {\n\t\t\tfixGeckoSelectionAfterBr( focus, domSelection );\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether a given DOM selection needs to be updated.\n\t *\n\t * @private\n\t * @param {Selection} domSelection The DOM selection to check.\n\t * @returns {Boolean}\n\t */\n\tprivate _domSelectionNeedsUpdate( domSelection: Selection ): boolean {\n\t\tif ( !this.domConverter.isDomSelectionCorrect( domSelection ) ) {\n\t\t\t// Current DOM selection is in incorrect position. We need to update it.\n\t\t\treturn true;\n\t\t}\n\n\t\tconst oldViewSelection = domSelection && this.domConverter.domSelectionToView( domSelection );\n\n\t\tif ( oldViewSelection && this.selection.isEqual( oldViewSelection ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If selection is not collapsed, it does not need to be updated if it is similar.\n\t\tif ( !this.selection.isCollapsed && this.selection.isSimilar( oldViewSelection ) ) {\n\t\t\t// Selection did not changed and is correct, do not update.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Selections are not similar.\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks whether the fake selection needs to be updated.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where a new fake selection container should be added.\n\t * @returns {Boolean}\n\t */\n\tprivate _fakeSelectionNeedsUpdate( domRoot: DomElement ): boolean {\n\t\tconst container = this._fakeSelectionContainer;\n\t\tconst domSelection = domRoot.ownerDocument.getSelection()!;\n\n\t\t// Fake selection needs to be updated if there's no fake selection container, or the container currently sits\n\t\t// in a different root.\n\t\tif ( !container || container.parentElement !== domRoot ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Make sure that the selection actually is within the fake selection.\n\t\tif ( domSelection.anchorNode !== container && !container.contains( domSelection.anchorNode ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn container.textContent !== this.selection.fakeSelectionLabel;\n\t}\n\n\t/**\n\t * Removes the DOM selection.\n\t *\n\t * @private\n\t */\n\tprivate _removeDomSelection(): void {\n\t\tfor ( const doc of this.domDocuments ) {\n\t\t\tconst domSelection = doc.getSelection()!;\n\n\t\t\tif ( domSelection.rangeCount ) {\n\t\t\t\tconst activeDomElement = doc.activeElement!;\n\t\t\t\tconst viewElement = this.domConverter.mapDomToView( activeDomElement as DomElement );\n\n\t\t\t\tif ( activeDomElement && viewElement ) {\n\t\t\t\t\tdomSelection.removeAllRanges();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes the fake selection.\n\t *\n\t * @private\n\t */\n\tprivate _removeFakeSelection(): void {\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\tif ( container ) {\n\t\t\tcontainer.remove();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if focus needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t */\n\tprivate _updateFocus(): void {\n\t\tif ( this.isFocused ) {\n\t\t\tconst editable = this.selection.editableElement;\n\n\t\t\tif ( editable ) {\n\t\t\t\tthis.domConverter.focus( editable );\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Checks if provided element is editable.\n//\n// @private\n// @param {module:engine/view/element~Element} element\n// @returns {Boolean}\nfunction isEditable( element: ViewElement ): boolean {\n\tif ( element.getAttribute( 'contenteditable' ) == 'false' ) {\n\t\treturn false;\n\t}\n\n\tconst parent = element.findAncestor( element => element.hasAttribute( 'contenteditable' ) );\n\n\treturn !parent || parent.getAttribute( 'contenteditable' ) == 'true';\n}\n\n// Adds inline filler at a given position.\n//\n// The position can be given as an array of DOM nodes and an offset in that array,\n// or a DOM parent element and an offset in that element.\n//\n// @private\n// @param {Document} domDocument\n// @param {Element|Array.} domParentOrArray\n// @param {Number} offset\n// @returns {Text} The DOM text node that contains an inline filler.\nfunction addInlineFiller( domDocument: DomDocument, domParentOrArray: DomNode | Array, offset: number ): DomText {\n\tconst childNodes = domParentOrArray instanceof Array ? domParentOrArray : domParentOrArray.childNodes;\n\tconst nodeAfterFiller = childNodes[ offset ];\n\n\tif ( isText( nodeAfterFiller ) ) {\n\t\tnodeAfterFiller.data = INLINE_FILLER + nodeAfterFiller.data;\n\n\t\treturn nodeAfterFiller;\n\t} else {\n\t\tconst fillerNode = domDocument.createTextNode( INLINE_FILLER );\n\n\t\tif ( Array.isArray( domParentOrArray ) ) {\n\t\t\t( childNodes as Array ).splice( offset, 0, fillerNode );\n\t\t} else {\n\t\t\tinsertAt( domParentOrArray as DomElement, offset, fillerNode );\n\t\t}\n\n\t\treturn fillerNode;\n\t}\n}\n\n// Whether two DOM nodes should be considered as similar.\n// Nodes are considered similar if they have the same tag name.\n//\n// @private\n// @param {ViewNode} node1\n// @param {ViewNode} node2\n// @returns {Boolean}\nfunction areSimilar( node1: DomNode, node2: DomNode ): boolean {\n\treturn isNode( node1 ) && isNode( node2 ) &&\n\t\t!isText( node1 ) && !isText( node2 ) &&\n\t\t!isComment( node1 ) && !isComment( node2 ) &&\n\t\t( node1 as DomElement ).tagName.toLowerCase() === ( node2 as DomElement ).tagName.toLowerCase();\n}\n\n// Whether two DOM nodes are text nodes.\nfunction areTextNodes( node1: DomNode, node2: DomNode ): boolean {\n\treturn isNode( node1 ) && isNode( node2 ) &&\n\t\tisText( node1 ) && isText( node2 );\n}\n\n// Whether two dom nodes should be considered as the same.\n// Two nodes which are considered the same are:\n//\n//\t\t* Text nodes with the same text.\n//\t\t* Element nodes represented by the same object.\n//\t\t* Two block filler elements.\n//\n// @private\n// @param {String} blockFillerMode Block filler mode, see {@link module:engine/view/domconverter~DomConverter#blockFillerMode}.\n// @param {ViewNode} node1\n// @param {ViewNode} node2\n// @returns {Boolean}\nfunction sameNodes( domConverter: DomConverter, actualDomChild: DomNode, expectedDomChild: DomNode ): boolean {\n\t// Elements.\n\tif ( actualDomChild === expectedDomChild ) {\n\t\treturn true;\n\t}\n\t// Texts.\n\telse if ( isText( actualDomChild ) && isText( expectedDomChild ) ) {\n\t\treturn actualDomChild.data === expectedDomChild.data;\n\t}\n\t// Block fillers.\n\telse if ( domConverter.isBlockFiller( actualDomChild ) &&\n\t\tdomConverter.isBlockFiller( expectedDomChild ) ) {\n\t\treturn true;\n\t}\n\n\t// Not matching types.\n\treturn false;\n}\n\n// The following is a Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n// When the native DOM selection is at the end of the block and preceded by
    e.g.\n//\n//\t\t

    foo
    []

    \n//\n// which happens a lot when using the soft line break, the browser fails to (visually) move the\n// caret to the new line. A quick fix is as simple as force–refreshing the selection with the same range.\nfunction fixGeckoSelectionAfterBr( focus: ReturnType, domSelection: DomSelection ) {\n\tconst parent = focus!.parent;\n\n\t// This fix works only when the focus point is at the very end of an element.\n\t// There is no point in running it in cases unrelated to the browser bug.\n\tif ( parent.nodeType != Node.ELEMENT_NODE || focus!.offset != parent.childNodes.length - 1 ) {\n\t\treturn;\n\t}\n\n\tconst childAtOffset = parent.childNodes[ focus!.offset ];\n\n\t// To stay on the safe side, the fix being as specific as possible, it targets only the\n\t// selection which is at the very end of the element and preceded by
    .\n\tif ( childAtOffset && ( childAtOffset as DomElement ).tagName == 'BR' ) {\n\t\tdomSelection.addRange( domSelection.getRangeAt( 0 ) );\n\t}\n}\n\nfunction filterOutFakeSelectionContainer( domChildList: Array | NodeList, fakeSelectionContainer: DomElement | null ) {\n\tconst childList = Array.from( domChildList );\n\n\tif ( childList.length == 0 || !fakeSelectionContainer ) {\n\t\treturn childList;\n\t}\n\n\tconst last = childList[ childList.length - 1 ];\n\n\tif ( last == fakeSelectionContainer ) {\n\t\tchildList.pop();\n\t}\n\n\treturn childList;\n}\n\n// Creates a fake selection container for a given document.\n//\n// @private\n// @param {Document} domDocument\n// @returns {HTMLElement}\nfunction createFakeSelectionContainer( domDocument: DomDocument ): DomElement {\n\tconst container = domDocument.createElement( 'div' );\n\n\tcontainer.className = 'ck-fake-selection-container';\n\n\tObject.assign( container.style, {\n\t\tposition: 'fixed',\n\t\ttop: 0,\n\t\tleft: '-9999px',\n\t\t// See https://github.com/ckeditor/ckeditor5/issues/752.\n\t\twidth: '42px'\n\t} );\n\n\t// Fill it with a text node so we can update it later.\n\tcontainer.textContent = '\\u00A0';\n\n\treturn container;\n}\n\n// Checks if text needs to be updated and possibly updates it by removing and inserting only parts\n// of the data from the existing text node to reduce impact on the IME composition.\n//\n// @param {Text} domText DOM text node to update.\n// @param {String} expectedText The expected data of a text node.\nfunction updateTextNode( domText: DomText, expectedText: string ) {\n\tconst actualText = domText.data;\n\n\tif ( actualText == expectedText ) {\n\t\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Text node does not need update:',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '',\n\t\t// @if CK_DEBUG_TYPING // \t\t`\"${ domText.data }\" (${ domText.data.length })`\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\treturn;\n\t}\n\n\t// @if CK_DEBUG_TYPING // if ( window.logCKETyping ) {\n\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Update text node:',\n\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '',\n\t// @if CK_DEBUG_TYPING // \t\t`\"${ domText.data }\" (${ domText.data.length }) -> \"${ expectedText }\" (${ expectedText.length })`\n\t// @if CK_DEBUG_TYPING // \t);\n\t// @if CK_DEBUG_TYPING // }\n\n\tconst actions = fastDiff( actualText, expectedText );\n\n\tfor ( const action of actions ) {\n\t\tif ( action.type === 'insert' ) {\n\t\t\tdomText.insertData( action.index, action.values.join( '' ) );\n\t\t} else { // 'delete'\n\t\t\tdomText.deleteData( action.index, action.howMany );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/domconverter\n */\n\n/* globals Node, NodeFilter, DOMParser, Text */\n\nimport ViewText from './text';\nimport ViewElement from './element';\nimport ViewUIElement from './uielement';\nimport ViewPosition from './position';\nimport ViewRange from './range';\nimport ViewSelection from './selection';\nimport ViewDocumentFragment from './documentfragment';\nimport ViewTreeWalker from './treewalker';\nimport { default as Matcher, type MatcherPattern } from './matcher';\nimport {\n\tBR_FILLER, INLINE_FILLER_LENGTH, NBSP_FILLER, MARKED_NBSP_FILLER,\n\tgetDataWithoutFiller, isInlineFiller, startsWithFiller\n} from './filler';\n\nimport {\n\tglobal,\n\tlogWarning,\n\tindexOf,\n\tgetAncestors,\n\tisText,\n\tisComment,\n\tfirst\n} from '@ckeditor/ckeditor5-utils';\n\nimport type ViewNode from './node';\nimport type Document from './document';\nimport type DocumentSelection from './documentselection';\nimport type EditableElement from './editableelement';\nimport type ViewTextProxy from './textproxy';\nimport type ViewRawElement from './rawelement';\n\ntype DomNode = globalThis.Node;\ntype DomElement = globalThis.HTMLElement;\ntype DomDocument = globalThis.Document;\ntype DomDocumentFragment = globalThis.DocumentFragment;\ntype DomComment = globalThis.Comment;\ntype DomRange = globalThis.Range;\ntype DomText = globalThis.Text;\ntype DomSelection = globalThis.Selection;\n\nconst BR_FILLER_REF = BR_FILLER( global.document ); // eslint-disable-line new-cap\nconst NBSP_FILLER_REF = NBSP_FILLER( global.document ); // eslint-disable-line new-cap\nconst MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER( global.document ); // eslint-disable-line new-cap\nconst UNSAFE_ATTRIBUTE_NAME_PREFIX = 'data-ck-unsafe-attribute-';\nconst UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE = 'data-ck-unsafe-element';\n\n/**\n * `DomConverter` is a set of tools to do transformations between DOM nodes and view nodes. It also handles\n * {@link module:engine/view/domconverter~DomConverter#bindElements bindings} between these nodes.\n *\n * An instance of the DOM converter is available under\n * {@link module:engine/view/view~View#domConverter `editor.editing.view.domConverter`}.\n *\n * The DOM converter does not check which nodes should be rendered (use {@link module:engine/view/renderer~Renderer}), does not keep the\n * state of a tree nor keeps the synchronization between the tree view and the DOM tree (use {@link module:engine/view/document~Document}).\n *\n * The DOM converter keeps DOM elements to view element bindings, so when the converter gets destroyed, the bindings are lost.\n * Two converters will keep separate binding maps, so one tree view can be bound with two DOM trees.\n */\nexport default class DomConverter {\n\tpublic readonly document: Document;\n\tpublic readonly renderingMode: 'data' | 'editing';\n\tpublic blockFillerMode: BlockFillerMode;\n\tpublic readonly preElements: Array;\n\tpublic readonly blockElements: Array;\n\tpublic readonly inlineObjectElements: Array;\n\tpublic readonly unsafeElements: Array;\n\n\tprivate readonly _domDocument: DomDocument;\n\tprivate readonly _domToViewMapping: WeakMap;\n\tprivate readonly _viewToDomMapping: WeakMap;\n\tprivate readonly _fakeSelectionMapping: WeakMap;\n\tprivate readonly _rawContentElementMatcher: Matcher;\n\tprivate readonly _encounteredRawContentDomNodes: WeakSet;\n\n\t/**\n\t * Creates a DOM converter.\n\t *\n\t * @param {module:engine/view/document~Document} document The view document instance.\n\t * @param {Object} options An object with configuration options.\n\t * @param {module:engine/view/filler~BlockFillerMode} [options.blockFillerMode] The type of the block filler to use.\n\t * Default value depends on the options.renderingMode:\n\t * 'nbsp' when options.renderingMode == 'data',\n\t * 'br' when options.renderingMode == 'editing'.\n\t * @param {'data'|'editing'} [options.renderingMode='editing'] Whether to leave the View-to-DOM conversion result unchanged\n\t * or improve editing experience by filtering out interactive data.\n\t */\n\tconstructor( document: Document, options: {\n\t\tblockFillerMode?: BlockFillerMode;\n\t\trenderingMode?: 'data' | 'editing';\n\t} = {} ) {\n\t\t/**\n\t\t * @readonly\n\t\t * @type {module:engine/view/document~Document}\n\t\t */\n\t\tthis.document = document;\n\n\t\t/**\n\t\t * Whether to leave the View-to-DOM conversion result unchanged or improve editing experience by filtering out interactive data.\n\t\t *\n\t\t * @member {'data'|'editing'} module:engine/view/domconverter~DomConverter#renderingMode\n\t\t */\n\t\tthis.renderingMode = options.renderingMode || 'editing';\n\n\t\t/**\n\t\t * The mode of a block filler used by the DOM converter.\n\t\t *\n\t\t * @member {'br'|'nbsp'|'markedNbsp'} module:engine/view/domconverter~DomConverter#blockFillerMode\n\t\t */\n\t\tthis.blockFillerMode = options.blockFillerMode || ( this.renderingMode === 'editing' ? 'br' : 'nbsp' );\n\n\t\t/**\n\t\t * Elements which are considered pre-formatted elements.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/view/domconverter~DomConverter#preElements\n\t\t */\n\t\tthis.preElements = [ 'pre' ];\n\n\t\t/**\n\t\t * Elements which are considered block elements (and hence should be filled with a\n\t\t * {@link #isBlockFiller block filler}).\n\t\t *\n\t\t * Whether an element is considered a block element also affects handling of trailing whitespaces.\n\t\t *\n\t\t * You can extend this array if you introduce support for block elements which are not yet recognized here.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/view/domconverter~DomConverter#blockElements\n\t\t */\n\t\tthis.blockElements = [\n\t\t\t'address', 'article', 'aside', 'blockquote', 'caption', 'center', 'dd', 'details', 'dir', 'div',\n\t\t\t'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',\n\t\t\t'hgroup', 'legend', 'li', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'tbody',\n\t\t\t'td', 'tfoot', 'th', 'thead', 'tr', 'ul'\n\t\t];\n\n\t\t/**\n\t\t * A list of elements that exist inline (in text) but their inner structure cannot be edited because\n\t\t * of the way they are rendered by the browser. They are mostly HTML form elements but there are other\n\t\t * elements such as `` or `' +\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'spotify',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(artist\\/\\w+)/,\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(album\\/\\w+)/,\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(track\\/\\w+)/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'youtube',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^(?:m\\.)?youtube\\.com\\/watch\\?v=([\\w-]+)(?:&t=(\\d+))?/,\n\t\t\t\t\t\t/^(?:m\\.)?youtube\\.com\\/v\\/([\\w-]+)(?:\\?t=(\\d+))?/,\n\t\t\t\t\t\t/^youtube\\.com\\/embed\\/([\\w-]+)(?:\\?start=(\\d+))?/,\n\t\t\t\t\t\t/^youtu\\.be\\/([\\w-]+)(?:\\?t=(\\d+))?/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\t\t\t\t\t\tconst time = match[ 2 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'vimeo',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^vimeo\\.com\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/[^/]+\\/[^/]+\\/video\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/album\\/[^/]+\\/video\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/channels\\/[^/]+\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/groups\\/[^/]+\\/videos\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/ondemand\\/[^/]+\\/(\\d+)/,\n\t\t\t\t\t\t/^player\\.vimeo\\.com\\/video\\/(\\d+)/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
    '\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'instagram',\n\t\t\t\t\turl: /^instagram\\.com\\/p\\/(\\w+)/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'twitter',\n\t\t\t\t\turl: /^twitter\\.com/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'googleMaps',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^google\\.com\\/maps/,\n\t\t\t\t\t\t/^goo\\.gl\\/maps/,\n\t\t\t\t\t\t/^maps\\.google\\.com/,\n\t\t\t\t\t\t/^maps\\.app\\.goo\\.gl/\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'flickr',\n\t\t\t\t\turl: /^flickr\\.com/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'facebook',\n\t\t\t\t\turl: /^facebook\\.com/\n\t\t\t\t}\n\t\t\t]\n\t\t} );\n\n\t\t/**\n\t\t * The media registry managing the media providers in the editor.\n\t\t *\n\t\t * @member {module:media-embed/mediaregistry~MediaRegistry} #registry\n\t\t */\n\t\tthis.registry = new MediaRegistry( editor.locale, editor.config.get( 'mediaEmbed' ) );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\t\tconst t = editor.t;\n\t\tconst conversion = editor.conversion;\n\t\tconst renderMediaPreview = editor.config.get( 'mediaEmbed.previewsInData' );\n\t\tconst elementName = editor.config.get( 'mediaEmbed.elementName' );\n\n\t\tconst registry = this.registry;\n\n\t\teditor.commands.add( 'mediaEmbed', new MediaEmbedCommand( editor ) );\n\n\t\t// Configure the schema.\n\t\tschema.register( 'media', {\n\t\t\tinheritAllFrom: '$blockObject',\n\t\t\tallowAttributes: [ 'url' ]\n\t\t} );\n\n\t\t// Model -> Data\n\t\tconversion.for( 'dataDowncast' ).elementToStructure( {\n\t\t\tmodel: 'media',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tconst url = modelElement.getAttribute( 'url' );\n\n\t\t\t\treturn createMediaFigureElement( writer, registry, url, {\n\t\t\t\t\telementName,\n\t\t\t\t\trenderMediaPreview: url && renderMediaPreview\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> Data (url -> data-oembed-url)\n\t\tconversion.for( 'dataDowncast' ).add(\n\t\t\tmodelToViewUrlAttributeConverter( registry, {\n\t\t\t\telementName,\n\t\t\t\trenderMediaPreview\n\t\t\t} ) );\n\n\t\t// Model -> View (element)\n\t\tconversion.for( 'editingDowncast' ).elementToStructure( {\n\t\t\tmodel: 'media',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tconst url = modelElement.getAttribute( 'url' );\n\t\t\t\tconst figure = createMediaFigureElement( writer, registry, url, {\n\t\t\t\t\telementName,\n\t\t\t\t\trenderForEditingView: true\n\t\t\t\t} );\n\n\t\t\t\treturn toMediaWidget( figure, writer, t( 'media widget' ) );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> View (url -> data-oembed-url)\n\t\tconversion.for( 'editingDowncast' ).add(\n\t\t\tmodelToViewUrlAttributeConverter( registry, {\n\t\t\t\telementName,\n\t\t\t\trenderForEditingView: true\n\t\t\t} ) );\n\n\t\t// View -> Model (data-oembed-url -> url)\n\t\tconversion.for( 'upcast' )\n\t\t\t// Upcast semantic media.\n\t\t\t.elementToElement( {\n\t\t\t\tview: element => [ 'oembed', elementName ].includes( element.name ) && element.getAttribute( 'url' ) ?\n\t\t\t\t\t{ name: true } :\n\t\t\t\t\tnull,\n\t\t\t\tmodel: ( viewMedia, { writer } ) => {\n\t\t\t\t\tconst url = viewMedia.getAttribute( 'url' );\n\n\t\t\t\t\tif ( registry.hasMedia( url ) ) {\n\t\t\t\t\t\treturn writer.createElement( 'media', { url } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// Upcast non-semantic media.\n\t\t\t.elementToElement( {\n\t\t\t\tview: {\n\t\t\t\t\tname: 'div',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-oembed-url': true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodel: ( viewMedia, { writer } ) => {\n\t\t\t\t\tconst url = viewMedia.getAttribute( 'data-oembed-url' );\n\n\t\t\t\t\tif ( registry.hasMedia( url ) ) {\n\t\t\t\t\t\treturn writer.createElement( 'media', { url } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// Consume `
    ` elements, that were left after upcast.\n\t\t\t.add( dispatcher => {\n\t\t\t\tdispatcher.on( 'element:figure', converter );\n\n\t\t\t\tfunction converter( evt, data, conversionApi ) {\n\t\t\t\t\tif ( !conversionApi.consumable.consume( data.viewItem, { name: true, classes: 'media' } ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { modelRange, modelCursor } = conversionApi.convertChildren( data.viewItem, data.modelCursor );\n\n\t\t\t\t\tdata.modelRange = modelRange;\n\t\t\t\t\tdata.modelCursor = modelCursor;\n\n\t\t\t\t\tconst modelElement = first( modelRange.getItems() );\n\n\t\t\t\t\tif ( !modelElement ) {\n\t\t\t\t\t\t// Revert consumed figure so other features can convert it.\n\t\t\t\t\t\tconversionApi.consumable.revert( data.viewItem, { name: true, classes: 'media' } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/automediaembed\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { LiveRange, LivePosition } from 'ckeditor5/src/engine';\nimport { Clipboard } from 'ckeditor5/src/clipboard';\nimport { Delete } from 'ckeditor5/src/typing';\nimport { Undo } from 'ckeditor5/src/undo';\nimport { global } from 'ckeditor5/src/utils';\n\nimport MediaEmbedEditing from './mediaembedediting';\nimport { insertMedia } from './utils';\n\nconst URL_REGEXP = /^(?:http(s)?:\\/\\/)?[\\w-]+\\.[\\w-.~:/?#[\\]@!$&'()*+,;=%]+$/;\n\n/**\n * The auto-media embed plugin. It recognizes media links in the pasted content and embeds\n * them shortly after they are injected into the document.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class AutoMediaEmbed extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ Clipboard, Delete, Undo ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'AutoMediaEmbed';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\tsuper( editor );\n\n\t\t/**\n\t\t * The paste–to–embed `setTimeout` ID. Stored as a property to allow\n\t\t * cleaning of the timeout.\n\t\t *\n\t\t * @private\n\t\t * @member {Number} #_timeoutId\n\t\t */\n\t\tthis._timeoutId = null;\n\n\t\t/**\n\t\t * The position where the `` element will be inserted after the timeout,\n\t\t * determined each time the new content is pasted into the document.\n\t\t *\n\t\t * @private\n\t\t * @member {module:engine/model/liveposition~LivePosition} #_positionToInsert\n\t\t */\n\t\tthis._positionToInsert = null;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst modelDocument = editor.model.document;\n\n\t\t// We need to listen on `Clipboard#inputTransformation` because we need to save positions of selection.\n\t\t// After pasting, the content between those positions will be checked for a URL that could be transformed\n\t\t// into media.\n\t\tthis.listenTo( editor.plugins.get( 'ClipboardPipeline' ), 'inputTransformation', () => {\n\t\t\tconst firstRange = modelDocument.selection.getFirstRange();\n\n\t\t\tconst leftLivePosition = LivePosition.fromPosition( firstRange.start );\n\t\t\tleftLivePosition.stickiness = 'toPrevious';\n\n\t\t\tconst rightLivePosition = LivePosition.fromPosition( firstRange.end );\n\t\t\trightLivePosition.stickiness = 'toNext';\n\n\t\t\tmodelDocument.once( 'change:data', () => {\n\t\t\t\tthis._embedMediaBetweenPositions( leftLivePosition, rightLivePosition );\n\n\t\t\t\tleftLivePosition.detach();\n\t\t\t\trightLivePosition.detach();\n\t\t\t}, { priority: 'high' } );\n\t\t} );\n\n\t\teditor.commands.get( 'undo' ).on( 'execute', () => {\n\t\t\tif ( this._timeoutId ) {\n\t\t\t\tglobal.window.clearTimeout( this._timeoutId );\n\t\t\t\tthis._positionToInsert.detach();\n\n\t\t\t\tthis._timeoutId = null;\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t}\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * Analyzes the part of the document between provided positions in search for a URL representing media.\n\t * When the URL is found, it is automatically converted into media.\n\t *\n\t * @protected\n\t * @param {module:engine/model/liveposition~LivePosition} leftPosition Left position of the selection.\n\t * @param {module:engine/model/liveposition~LivePosition} rightPosition Right position of the selection.\n\t */\n\t_embedMediaBetweenPositions( leftPosition, rightPosition ) {\n\t\tconst editor = this.editor;\n\t\tconst mediaRegistry = editor.plugins.get( MediaEmbedEditing ).registry;\n\t\t// TODO: Use marker instead of LiveRange & LivePositions.\n\t\tconst urlRange = new LiveRange( leftPosition, rightPosition );\n\t\tconst walker = urlRange.getWalker( { ignoreElementEnd: true } );\n\n\t\tlet url = '';\n\n\t\tfor ( const node of walker ) {\n\t\t\tif ( node.item.is( '$textProxy' ) ) {\n\t\t\t\turl += node.item.data;\n\t\t\t}\n\t\t}\n\n\t\turl = url.trim();\n\n\t\t// If the URL does not match to universal URL regexp, let's skip that.\n\t\tif ( !url.match( URL_REGEXP ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// If the URL represents a media, let's use it.\n\t\tif ( !mediaRegistry.hasMedia( url ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst mediaEmbedCommand = editor.commands.get( 'mediaEmbed' );\n\n\t\t// Do not anything if media element cannot be inserted at the current position (#47).\n\t\tif ( !mediaEmbedCommand.isEnabled ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Position won't be available in the `setTimeout` function so let's clone it.\n\t\tthis._positionToInsert = LivePosition.fromPosition( leftPosition );\n\n\t\t// This action mustn't be executed if undo was called between pasting and auto-embedding.\n\t\tthis._timeoutId = global.window.setTimeout( () => {\n\t\t\teditor.model.change( writer => {\n\t\t\t\tthis._timeoutId = null;\n\n\t\t\t\twriter.remove( urlRange );\n\t\t\t\turlRange.detach();\n\n\t\t\t\tlet insertionPosition;\n\n\t\t\t\t// Check if position where the media element should be inserted is still valid.\n\t\t\t\t// Otherwise leave it as undefined to use document.selection - default behavior of model.insertContent().\n\t\t\t\tif ( this._positionToInsert.root.rootName !== '$graveyard' ) {\n\t\t\t\t\tinsertionPosition = this._positionToInsert;\n\t\t\t\t}\n\n\t\t\t\tinsertMedia( editor.model, url, insertionPosition, false );\n\n\t\t\t\tthis._positionToInsert.detach();\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t} );\n\n\t\t\teditor.plugins.get( 'Delete' ).requestUndoOnBackspace();\n\t\t}, 100 );\n\t}\n}\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/ui/mediaformview\n */\n\nimport {\n\tButtonView,\n\tFocusCycler,\n\tLabeledFieldView,\n\tView,\n\tViewCollection,\n\tcreateLabeledInputText,\n\tinjectCssTransitionDisabler,\n\tsubmitHandler\n} from 'ckeditor5/src/ui';\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\nimport { icons } from 'ckeditor5/src/core';\n\n// See: #8833.\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\nimport '../../theme/mediaform.css';\n\n/**\n * The media form view controller class.\n *\n * See {@link module:media-embed/ui/mediaformview~MediaFormView}.\n *\n * @extends module:ui/view~View\n */\nexport default class MediaFormView extends View {\n\t/**\n\t * @param {Array.} validators Form validators used by {@link #isValid}.\n\t * @param {module:utils/locale~Locale} [locale] The localization services instance.\n\t */\n\tconstructor( validators, locale ) {\n\t\tsuper( locale );\n\n\t\tconst t = locale.t;\n\n\t\t/**\n\t\t * Tracks information about the DOM focus in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/focustracker~FocusTracker}\n\t\t */\n\t\tthis.focusTracker = new FocusTracker();\n\n\t\t/**\n\t\t * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/keystrokehandler~KeystrokeHandler}\n\t\t */\n\t\tthis.keystrokes = new KeystrokeHandler();\n\n\t\t/**\n\t\t * The value of the URL input.\n\t\t *\n\t\t * @member {String} #mediaURLInputValue\n\t\t * @observable\n\t\t */\n\t\tthis.set( 'mediaURLInputValue', '' );\n\n\t\t/**\n\t\t * The URL input view.\n\t\t *\n\t\t * @member {module:ui/labeledfield/labeledfieldview~LabeledFieldView}\n\t\t */\n\t\tthis.urlInputView = this._createUrlInput();\n\n\t\t/**\n\t\t * The Save button view.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView}\n\t\t */\n\t\tthis.saveButtonView = this._createButton( t( 'Save' ), icons.check, 'ck-button-save' );\n\t\tthis.saveButtonView.type = 'submit';\n\t\tthis.saveButtonView.bind( 'isEnabled' ).to( this, 'mediaURLInputValue', value => !!value );\n\n\t\t/**\n\t\t * The Cancel button view.\n\t\t *\n\t\t * @member {module:ui/button/buttonview~ButtonView}\n\t\t */\n\t\tthis.cancelButtonView = this._createButton( t( 'Cancel' ), icons.cancel, 'ck-button-cancel', 'cancel' );\n\n\t\t/**\n\t\t * A collection of views that can be focused in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/viewcollection~ViewCollection}\n\t\t */\n\t\tthis._focusables = new ViewCollection();\n\n\t\t/**\n\t\t * Helps cycling over {@link #_focusables} in the form.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/focuscycler~FocusCycler}\n\t\t */\n\t\tthis._focusCycler = new FocusCycler( {\n\t\t\tfocusables: this._focusables,\n\t\t\tfocusTracker: this.focusTracker,\n\t\t\tkeystrokeHandler: this.keystrokes,\n\t\t\tactions: {\n\t\t\t\t// Navigate form fields backwards using the Shift + Tab keystroke.\n\t\t\t\tfocusPrevious: 'shift + tab',\n\n\t\t\t\t// Navigate form fields forwards using the Tab key.\n\t\t\t\tfocusNext: 'tab'\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * An array of form validators used by {@link #isValid}.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {Array.}\n\t\t */\n\t\tthis._validators = validators;\n\n\t\tthis.setTemplate( {\n\t\t\ttag: 'form',\n\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck',\n\t\t\t\t\t'ck-media-form',\n\t\t\t\t\t'ck-responsive-form'\n\t\t\t\t],\n\n\t\t\t\ttabindex: '-1'\n\t\t\t},\n\n\t\t\tchildren: [\n\t\t\t\tthis.urlInputView,\n\t\t\t\tthis.saveButtonView,\n\t\t\t\tthis.cancelButtonView\n\t\t\t]\n\t\t} );\n\n\t\tinjectCssTransitionDisabler( this );\n\n\t\t/**\n\t\t * The default info text for the {@link #urlInputView}.\n\t\t *\n\t\t * @private\n\t\t * @member {String} #_urlInputViewInfoDefault\n\t\t */\n\n\t\t/**\n\t\t * The info text with an additional tip for the {@link #urlInputView},\n\t\t * displayed when the input has some value.\n\t\t *\n\t\t * @private\n\t\t * @member {String} #_urlInputViewInfoTip\n\t\t */\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\trender() {\n\t\tsuper.render();\n\n\t\tsubmitHandler( {\n\t\t\tview: this\n\t\t} );\n\n\t\tconst childViews = [\n\t\t\tthis.urlInputView,\n\t\t\tthis.saveButtonView,\n\t\t\tthis.cancelButtonView\n\t\t];\n\n\t\tchildViews.forEach( v => {\n\t\t\t// Register the view as focusable.\n\t\t\tthis._focusables.add( v );\n\n\t\t\t// Register the view in the focus tracker.\n\t\t\tthis.focusTracker.add( v.element );\n\t\t} );\n\n\t\t// Start listening for the keystrokes coming from #element.\n\t\tthis.keystrokes.listenTo( this.element );\n\n\t\tconst stopPropagation = data => data.stopPropagation();\n\n\t\t// Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\n\t\t// keystroke handler would take over the key management in the URL input. We need to prevent\n\t\t// this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\n\t\tthis.keystrokes.set( 'arrowright', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowleft', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowup', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowdown', stopPropagation );\n\n\t\t// Intercept the `selectstart` event, which is blocked by default because of the default behavior\n\t\t// of the DropdownView#panelView.\n\t\t// TODO: blocking `selectstart` in the #panelView should be configurable per–drop–down instance.\n\t\tthis.listenTo( this.urlInputView.element, 'selectstart', ( evt, domEvt ) => {\n\t\t\tdomEvt.stopPropagation();\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tthis.focusTracker.destroy();\n\t\tthis.keystrokes.destroy();\n\t}\n\n\t/**\n\t * Focuses the fist {@link #_focusables} in the form.\n\t */\n\tfocus() {\n\t\tthis._focusCycler.focusFirst();\n\t}\n\n\t/**\n\t * The native DOM `value` of the {@link #urlInputView} element.\n\t *\n\t * **Note**: Do not confuse it with the {@link module:ui/inputtext/inputtextview~InputTextView#value}\n\t * which works one way only and may not represent the actual state of the component in the DOM.\n\t *\n\t * @type {String}\n\t */\n\tget url() {\n\t\treturn this.urlInputView.fieldView.element.value.trim();\n\t}\n\n\tset url( url ) {\n\t\tthis.urlInputView.fieldView.element.value = url.trim();\n\t}\n\n\t/**\n\t * Validates the form and returns `false` when some fields are invalid.\n\t *\n\t * @returns {Boolean}\n\t */\n\tisValid() {\n\t\tthis.resetFormStatus();\n\n\t\tfor ( const validator of this._validators ) {\n\t\t\tconst errorText = validator( this );\n\n\t\t\t// One error per field is enough.\n\t\t\tif ( errorText ) {\n\t\t\t\t// Apply updated error.\n\t\t\t\tthis.urlInputView.errorText = errorText;\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Cleans up the supplementary error and information text of the {@link #urlInputView}\n\t * bringing them back to the state when the form has been displayed for the first time.\n\t *\n\t * See {@link #isValid}.\n\t */\n\tresetFormStatus() {\n\t\tthis.urlInputView.errorText = null;\n\t\tthis.urlInputView.infoText = this._urlInputViewInfoDefault;\n\t}\n\n\t/**\n\t * Creates a labeled input view.\n\t *\n\t * @private\n\t * @returns {module:ui/labeledfield/labeledfieldview~LabeledFieldView} Labeled input view instance.\n\t */\n\t_createUrlInput() {\n\t\tconst t = this.locale.t;\n\n\t\tconst labeledInput = new LabeledFieldView( this.locale, createLabeledInputText );\n\t\tconst inputField = labeledInput.fieldView;\n\n\t\tthis._urlInputViewInfoDefault = t( 'Paste the media URL in the input.' );\n\t\tthis._urlInputViewInfoTip = t( 'Tip: Paste the URL into the content to embed faster.' );\n\n\t\tlabeledInput.label = t( 'Media URL' );\n\t\tlabeledInput.infoText = this._urlInputViewInfoDefault;\n\n\t\tinputField.on( 'input', () => {\n\t\t\t// Display the tip text only when there is some value. Otherwise fall back to the default info text.\n\t\t\tlabeledInput.infoText = inputField.element.value ? this._urlInputViewInfoTip : this._urlInputViewInfoDefault;\n\t\t\tthis.mediaURLInputValue = inputField.element.value.trim();\n\t\t} );\n\n\t\treturn labeledInput;\n\t}\n\n\t/**\n\t * Creates a button view.\n\t *\n\t * @private\n\t * @param {String} label The button label.\n\t * @param {String} icon The button icon.\n\t * @param {String} className The additional button CSS class name.\n\t * @param {String} [eventName] An event name that the `ButtonView#execute` event will be delegated to.\n\t * @returns {module:ui/button/buttonview~ButtonView} The button view instance.\n\t */\n\t_createButton( label, icon, className, eventName ) {\n\t\tconst button = new ButtonView( this.locale );\n\n\t\tbutton.set( {\n\t\t\tlabel,\n\t\t\ticon,\n\t\t\ttooltip: true\n\t\t} );\n\n\t\tbutton.extendTemplate( {\n\t\t\tattributes: {\n\t\t\t\tclass: className\n\t\t\t}\n\t\t} );\n\n\t\tif ( eventName ) {\n\t\t\tbutton.delegate( 'execute' ).to( this, eventName );\n\t\t}\n\n\t\treturn button;\n\t}\n}\n\n/**\n * Fired when the form view is submitted (when one of the children triggered the submit event),\n * e.g. click on {@link #saveButtonView}.\n *\n * @event submit\n */\n\n/**\n * Fired when the form view is canceled, e.g. by a click on {@link #cancelButtonView}.\n *\n * @event cancel\n */\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/mediaembedui\n */\n\nimport { Plugin } from 'ckeditor5/src/core';\nimport { createDropdown } from 'ckeditor5/src/ui';\n\nimport MediaFormView from './ui/mediaformview';\nimport MediaEmbedEditing from './mediaembedediting';\nimport mediaIcon from '../theme/icons/media.svg';\n\n/**\n * The media embed UI plugin.\n *\n * @extends module:core/plugin~Plugin\n */\nexport default class MediaEmbedUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get requires() {\n\t\treturn [ MediaEmbedEditing ];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get pluginName() {\n\t\treturn 'MediaEmbedUI';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tconst editor = this.editor;\n\t\tconst command = editor.commands.get( 'mediaEmbed' );\n\n\t\teditor.ui.componentFactory.add( 'mediaEmbed', locale => {\n\t\t\tconst dropdown = createDropdown( locale );\n\n\t\t\tthis._setUpDropdown( dropdown, command );\n\n\t\t\treturn dropdown;\n\t\t} );\n\t}\n\n\t/**\n\t * @private\n\t * @param {module:ui/dropdown/dropdownview~DropdownView} dropdown\n\t * @param {module:media-embed/mediaembedcommand~MediaEmbedCommand} command\n\t */\n\t_setUpDropdown( dropdown, command ) {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst button = dropdown.buttonView;\n\t\tconst registry = editor.plugins.get( MediaEmbedEditing ).registry;\n\n\t\tdropdown.once( 'change:isOpen', () => {\n\t\t\tconst form = new MediaFormView( getFormValidators( editor.t, registry ), editor.locale );\n\n\t\t\tdropdown.panelView.children.add( form );\n\n\t\t\t// Note: Use the low priority to make sure the following listener starts working after the\n\t\t\t// default action of the drop-down is executed (i.e. the panel showed up). Otherwise, the\n\t\t\t// invisible form/input cannot be focused/selected.\n\t\t\tbutton.on( 'open', () => {\n\t\t\t\tform.disableCssTransitions();\n\n\t\t\t\t// Make sure that each time the panel shows up, the URL field remains in sync with the value of\n\t\t\t\t// the command. If the user typed in the input, then canceled (`urlInputView#fieldView#value` stays\n\t\t\t\t// unaltered) and re-opened it without changing the value of the media command (e.g. because they\n\t\t\t\t// didn't change the selection), they would see the old value instead of the actual value of the\n\t\t\t\t// command.\n\t\t\t\tform.url = command.value || '';\n\t\t\t\tform.urlInputView.fieldView.select();\n\t\t\t\tform.enableCssTransitions();\n\t\t\t}, { priority: 'low' } );\n\n\t\t\tdropdown.on( 'submit', () => {\n\t\t\t\tif ( form.isValid() ) {\n\t\t\t\t\teditor.execute( 'mediaEmbed', form.url );\n\t\t\t\t\teditor.editing.view.focus();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tdropdown.on( 'change:isOpen', () => form.resetFormStatus() );\n\t\t\tdropdown.on( 'cancel', () => {\n\t\t\t\teditor.editing.view.focus();\n\t\t\t} );\n\n\t\t\tform.delegate( 'submit', 'cancel' ).to( dropdown );\n\t\t\tform.urlInputView.bind( 'value' ).to( command, 'value' );\n\n\t\t\t// Form elements should be read-only when corresponding commands are disabled.\n\t\t\tform.urlInputView.bind( 'isReadOnly' ).to( command, 'isEnabled', value => !value );\n\t\t} );\n\n\t\tdropdown.bind( 'isEnabled' ).to( command );\n\n\t\tbutton.set( {\n\t\t\tlabel: t( 'Insert media' ),\n\t\t\ticon: mediaIcon,\n\t\t\ttooltip: true\n\t\t} );\n\t}\n}\n\nfunction getFormValidators( t, registry ) {\n\treturn [\n\t\tform => {\n\t\t\tif ( !form.url.length ) {\n\t\t\t\treturn t( 'The URL must not be empty.' );\n\t\t\t}\n\t\t},\n\t\tform => {\n\t\t\tif ( !registry.hasMedia( form.url ) ) {\n\t\t\t\treturn t( 'This media URL is not supported.' );\n\t\t\t}\n\t\t}\n\t];\n}\n","export default \"\";","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaembed.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/br\n */\n\nimport {\n\tDomConverter,\n\tViewDocument,\n\ttype UpcastWriter,\n\ttype ViewDocumentFragment,\n\ttype ViewElement,\n\ttype ViewNode\n} from 'ckeditor5/src/engine';\n\n/**\n * Transforms `
    ` elements that are siblings to some block element into a paragraphs.\n *\n * @param documentFragment The view structure to be transformed.\n */\nexport default function transformBlockBrsToParagraphs(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): void {\n\tconst viewDocument = new ViewDocument( writer.document.stylesProcessor );\n\tconst domConverter = new DomConverter( viewDocument, { renderingMode: 'data' } );\n\n\tconst blockElements = domConverter.blockElements;\n\tconst inlineObjectElements = domConverter.inlineObjectElements;\n\n\tconst elementsToReplace = [];\n\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\n\t\tconst element = value.item;\n\n\t\tif ( element.is( 'element', 'br' ) ) {\n\t\t\tconst nextSibling = findSibling( element, 'forward', writer, { blockElements, inlineObjectElements } );\n\t\t\tconst previousSibling = findSibling( element, 'backward', writer, { blockElements, inlineObjectElements } );\n\n\t\t\tconst nextSiblingIsBlock = isBlockViewElement( nextSibling, blockElements );\n\t\t\tconst previousSiblingIsBlock = isBlockViewElement( previousSibling, blockElements );\n\n\t\t\t// If the
    is surrounded by blocks then convert it to a paragraph:\n\t\t\t// *

    foo

    [
    ]

    bar

    ->

    foo

    [

    ]

    bar

    \n\t\t\t// *

    foo

    [
    ] ->

    foo

    [

    ]\n\t\t\t// * [
    ]

    foo

    -> [

    ]

    foo

    \n\t\t\tif ( previousSiblingIsBlock || nextSiblingIsBlock ) {\n\t\t\t\telementsToReplace.push( element );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const element of elementsToReplace ) {\n\t\tif ( element.hasClass( 'Apple-interchange-newline' ) ) {\n\t\t\twriter.remove( element );\n\t\t} else {\n\t\t\twriter.replace( element, writer.createElement( 'p' ) );\n\t\t}\n\t}\n}\n\n/**\n * Returns sibling node, threats inline elements as transparent (but should stop on an inline objects).\n */\nfunction findSibling(\n\tviewElement: ViewElement,\n\tdirection: 'forward' | 'backward',\n\twriter: UpcastWriter,\n\t{ blockElements, inlineObjectElements }: { blockElements: Array; inlineObjectElements: Array }\n) {\n\tlet position = writer.createPositionAt( viewElement, direction == 'forward' ? 'after' : 'before' );\n\n\t// Find first position that is just before a first:\n\t// * text node,\n\t// * block element,\n\t// * inline object element.\n\t// It's ignoring any inline (non-object) elements like span, strong, etc.\n\tposition = position.getLastMatchingPosition( ( { item } ) => (\n\t\titem.is( 'element' ) &&\n\t\t!blockElements.includes( item.name ) &&\n\t\t!inlineObjectElements.includes( item.name )\n\t), { direction } );\n\n\treturn direction == 'forward' ? position.nodeAfter : position.nodeBefore;\n}\n\n/**\n * Returns true for view elements that are listed as block view elements.\n */\nfunction isBlockViewElement( node: ViewNode | null, blockElements: Array ) {\n\treturn !!node && node.is( 'element' ) && blockElements.includes( node.name );\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/list\n */\n\nimport {\n\tMatcher,\n\tUpcastWriter,\n\ttype ViewDocumentFragment,\n\ttype ViewElement,\n\ttype ViewNode,\n\ttype ViewText\n} from 'ckeditor5/src/engine';\n\n/**\n * Transforms Word specific list-like elements to the semantic HTML lists.\n *\n * Lists in Word are represented by block elements with special attributes like:\n *\n * ```xml\n *

    ...

    // Paragraph based list.\n *

    ...

    // Heading 1 based list.\n * ```\n *\n * @param documentFragment The view structure to be transformed.\n * @param stylesString Styles from which list-like elements styling will be extracted.\n */\nexport function transformListItemLikeElementsIntoLists(\n\tdocumentFragment: ViewDocumentFragment,\n\tstylesString: string\n): void {\n\tif ( !documentFragment.childCount ) {\n\t\treturn;\n\t}\n\n\tconst writer = new UpcastWriter( documentFragment.document );\n\tconst itemLikeElements = findAllItemLikeElements( documentFragment, writer );\n\n\tif ( !itemLikeElements.length ) {\n\t\treturn;\n\t}\n\n\tlet currentList: ViewElement | null = null;\n\tlet currentIndentation = 1;\n\n\titemLikeElements.forEach( ( itemLikeElement, i ) => {\n\t\tconst isDifferentList = isNewListNeeded( itemLikeElements[ i - 1 ], itemLikeElement );\n\t\tconst previousItemLikeElement = isDifferentList ? null : itemLikeElements[ i - 1 ];\n\t\tconst indentationDifference = getIndentationDifference( previousItemLikeElement, itemLikeElement );\n\n\t\tif ( isDifferentList ) {\n\t\t\tcurrentList = null;\n\t\t\tcurrentIndentation = 1;\n\t\t}\n\n\t\tif ( !currentList || indentationDifference !== 0 ) {\n\t\t\tconst listStyle = detectListStyle( itemLikeElement, stylesString );\n\n\t\t\tif ( !currentList ) {\n\t\t\t\tcurrentList = insertNewEmptyList( listStyle, itemLikeElement.element, writer );\n\t\t\t} else if ( itemLikeElement.indent > currentIndentation ) {\n\t\t\t\tconst lastListItem = currentList.getChild( currentList.childCount - 1 ) as ViewElement;\n\t\t\t\tconst lastListItemChild = lastListItem!.getChild( lastListItem.childCount - 1 ) as ViewElement;\n\n\t\t\t\tcurrentList = insertNewEmptyList( listStyle, lastListItemChild, writer );\n\t\t\t\tcurrentIndentation += 1;\n\t\t\t} else if ( itemLikeElement.indent < currentIndentation ) {\n\t\t\t\tconst differentIndentation = currentIndentation - itemLikeElement.indent;\n\n\t\t\t\tcurrentList = findParentListAtLevel( currentList, differentIndentation );\n\t\t\t\tcurrentIndentation = itemLikeElement.indent;\n\t\t\t}\n\n\t\t\tif ( itemLikeElement.indent <= currentIndentation ) {\n\t\t\t\tif ( !currentList.is( 'element', listStyle.type ) ) {\n\t\t\t\t\tcurrentList = writer.rename( listStyle.type, currentList );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst listItem = transformElementIntoListItem( itemLikeElement.element, writer );\n\n\t\twriter.appendChild( listItem, currentList! );\n\t} );\n}\n\n/**\n * Removes paragraph wrapping content inside a list item.\n */\nexport function unwrapParagraphInListItem(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): void {\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\n\t\tconst element = value.item;\n\n\t\tif ( element.is( 'element', 'li' ) ) {\n\t\t\t// Google Docs allows for single paragraph inside LI.\n\t\t\tconst firstChild = element.getChild( 0 );\n\n\t\t\tif ( firstChild && firstChild.is( 'element', 'p' ) ) {\n\t\t\t\twriter.unwrapElement( firstChild );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Finds all list-like elements in a given document fragment.\n *\n * @param documentFragment Document fragment in which to look for list-like nodes.\n * @returns Array of found list-like items. Each item is an object containing:\n */\nfunction findAllItemLikeElements(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): Array {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\t// Matcher for finding list-like elements.\n\tconst itemLikeElementsMatcher = new Matcher( {\n\t\tname: /^p|h\\d+$/,\n\t\tstyles: {\n\t\t\t'mso-list': /.*/\n\t\t}\n\t} );\n\n\tconst itemLikeElements: Array = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type === 'elementStart' && itemLikeElementsMatcher.match( value.item as ViewElement ) ) {\n\t\t\tconst itemData = getListItemData( value.item as ViewElement );\n\n\t\t\titemLikeElements.push( {\n\t\t\t\telement: value.item as ViewElement,\n\t\t\t\tid: itemData.id,\n\t\t\t\torder: itemData.order,\n\t\t\t\tindent: itemData.indent\n\t\t\t} );\n\t\t}\n\t}\n\n\treturn itemLikeElements;\n}\n\n/**\n * Extracts list item style from the provided CSS.\n *\n * List item style is extracted from the CSS stylesheet. Each list with its specific style attribute\n * value (`mso-list:l1 level1 lfo1`) has its dedicated properties in a CSS stylesheet defined with a selector like:\n *\n * ```css\n * @list l1:level1 { ... }\n * ```\n *\n * It contains `mso-level-number-format` property which defines list numbering/bullet style. If this property\n * is not defined it means default `decimal` numbering.\n *\n * Here CSS string representation is used as `mso-level-number-format` property is an invalid CSS property\n * and will be removed during CSS parsing.\n *\n * @param listLikeItem List-like item for which list style will be searched for. Usually\n * a result of `findAllItemLikeElements()` function.\n * @param stylesString CSS stylesheet.\n * @returns An object with properties:\n *\n * * type - List type, could be `ul` or `ol`.\n * * startIndex - List start index, valid only for ordered lists.\n * * style - List style, for example: `decimal`, `lower-roman`, etc. It is extracted\n * directly from Word stylesheet and adjusted to represent proper values for the CSS `list-style-type` property.\n * If it cannot be adjusted, the `null` value is returned.\n */\nfunction detectListStyle( listLikeItem: ListLikeElement, stylesString: string ) {\n\tconst listStyleRegexp = new RegExp( `@list l${ listLikeItem.id }:level${ listLikeItem.indent }\\\\s*({[^}]*)`, 'gi' );\n\tconst listStyleTypeRegex = /mso-level-number-format:([^;]{0,100});/gi;\n\tconst listStartIndexRegex = /mso-level-start-at:\\s{0,100}([0-9]{0,10})\\s{0,100};/gi;\n\n\tconst listStyleMatch = listStyleRegexp.exec( stylesString );\n\n\tlet listStyleType = 'decimal'; // Decimal is default one.\n\tlet type = 'ol'; //
      is default list.\n\tlet startIndex = null;\n\n\tif ( listStyleMatch && listStyleMatch[ 1 ] ) {\n\t\tconst listStyleTypeMatch = listStyleTypeRegex.exec( listStyleMatch[ 1 ] );\n\n\t\tif ( listStyleTypeMatch && listStyleTypeMatch[ 1 ] ) {\n\t\t\tlistStyleType = listStyleTypeMatch[ 1 ].trim();\n\t\t\ttype = listStyleType !== 'bullet' && listStyleType !== 'image' ? 'ol' : 'ul';\n\t\t}\n\n\t\t// Styles for the numbered lists are always defined in the Word CSS stylesheet.\n\t\t// Unordered lists MAY contain a value for the Word CSS definition `mso-level-text` but sometimes\n\t\t// this tag is missing. And because of that, we cannot depend on that. We need to predict the list style value\n\t\t// based on the list style marker element.\n\t\tif ( listStyleType === 'bullet' ) {\n\t\t\tconst bulletedStyle = findBulletedListStyle( listLikeItem.element );\n\n\t\t\tif ( bulletedStyle ) {\n\t\t\t\tlistStyleType = bulletedStyle;\n\t\t\t}\n\t\t} else {\n\t\t\tconst listStartIndexMatch = listStartIndexRegex.exec( listStyleMatch[ 1 ] );\n\n\t\t\tif ( listStartIndexMatch && listStartIndexMatch[ 1 ] ) {\n\t\t\t\tstartIndex = parseInt( listStartIndexMatch[ 1 ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\ttype,\n\t\tstartIndex,\n\t\tstyle: mapListStyleDefinition( listStyleType )\n\t};\n}\n\n/**\n * Tries to extract the `list-style-type` value based on the marker element for bulleted list.\n */\nfunction findBulletedListStyle( element: ViewElement ) {\n\tconst listMarkerElement = findListMarkerNode( element );\n\n\tif ( !listMarkerElement ) {\n\t\treturn null;\n\t}\n\n\tconst listMarker = listMarkerElement._data;\n\n\tif ( listMarker === 'o' ) {\n\t\treturn 'circle';\n\t} else if ( listMarker === '·' ) {\n\t\treturn 'disc';\n\t}\n\t// Word returns '§' instead of '■' for the square list style.\n\telse if ( listMarker === '§' ) {\n\t\treturn 'square';\n\t}\n\n\treturn null;\n}\n\n/**\n * Tries to find a text node that represents the marker element (list-style-type).\n */\nfunction findListMarkerNode( element: ViewElement ): ViewText | null {\n\t// If the first child is a text node, it is the data for the element.\n\t// The list-style marker is not present here.\n\tif ( element.getChild( 0 )!.is( '$text' ) ) {\n\t\treturn null;\n\t}\n\n\tfor ( const childNode of element.getChildren() ) {\n\t\t// The list-style marker will be inside the `` element. Let's ignore all non-span elements.\n\t\t// It may happen that the `` element is added as the first child. Most probably, it's an anchor element.\n\t\tif ( !childNode.is( 'element', 'span' ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst textNodeOrElement = childNode.getChild( 0 )!;\n\n\t\t// If already found the marker element, use it.\n\t\tif ( textNodeOrElement.is( '$text' ) ) {\n\t\t\treturn textNodeOrElement;\n\t\t}\n\n\t\treturn ( textNodeOrElement as any ).getChild( 0 );\n\t}\n\n\t/* istanbul ignore next */\n\treturn null;\n}\n\n/**\n * Parses the `list-style-type` value extracted directly from the Word CSS stylesheet and returns proper CSS definition.\n */\nfunction mapListStyleDefinition( value: string ) {\n\tif ( value.startsWith( 'arabic-leading-zero' ) ) {\n\t\treturn 'decimal-leading-zero';\n\t}\n\n\tswitch ( value ) {\n\t\tcase 'alpha-upper':\n\t\t\treturn 'upper-alpha';\n\t\tcase 'alpha-lower':\n\t\t\treturn 'lower-alpha';\n\t\tcase 'roman-upper':\n\t\t\treturn 'upper-roman';\n\t\tcase 'roman-lower':\n\t\t\treturn 'lower-roman';\n\t\tcase 'circle':\n\t\tcase 'disc':\n\t\tcase 'square':\n\t\t\treturn value;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Creates an empty list of a given type and inserts it after a specified element.\n *\n * @param listStyle List style object which determines the type of newly created list.\n * Usually a result of `detectListStyle()` function.\n * @param element Element after which list is inserted.\n * @returns Newly created list element.\n */\nfunction insertNewEmptyList(\n\tlistStyle: ReturnType,\n\telement: ViewElement,\n\twriter: UpcastWriter\n) {\n\tconst parent = element.parent!;\n\tconst list = writer.createElement( listStyle.type );\n\tconst position = parent.getChildIndex( element ) + 1;\n\n\twriter.insertChild( position, list, parent );\n\n\t// We do not support modifying the marker for a particular list item.\n\t// Set the value for the `list-style-type` property directly to the list container.\n\tif ( listStyle.style ) {\n\t\twriter.setStyle( 'list-style-type', listStyle.style, list );\n\t}\n\n\tif ( listStyle.startIndex && listStyle.startIndex > 1 ) {\n\t\twriter.setAttribute( 'start', listStyle.startIndex, list );\n\t}\n\n\treturn list;\n}\n\n/**\n * Transforms a given element into a semantic list item. As the function operates on a provided\n * {module:engine/src/view/element~Element element} it will modify the view structure to which this element belongs.\n *\n * @param element Element which will be transformed into a list item.\n * @returns New element to which the given one was transformed. It is\n * inserted in place of the old element (the reference to the old element is lost due to renaming).\n */\nfunction transformElementIntoListItem( element: ViewElement, writer: UpcastWriter ) {\n\tremoveBulletElement( element, writer );\n\n\treturn writer.rename( 'li', element )!;\n}\n\n/**\n * Extracts list item information from Word specific list-like element style:\n *\n * ```\n * `style=\"mso-list:l1 level1 lfo1\"`\n * ```\n *\n * where:\n *\n * ```\n * * `l1` is a list id (however it does not mean this is a continuous list - see #43),\n * * `level1` is a list item indentation level,\n * * `lfo1` is a list insertion order in a document.\n * ```\n *\n * @param element Element from which style data is extracted.\n */\nfunction getListItemData( element: ViewElement ): ListItemData {\n\tconst data: ListItemData = {} as any;\n\tconst listStyle = element.getStyle( 'mso-list' );\n\n\tif ( listStyle ) {\n\t\tconst idMatch = listStyle.match( /(^|\\s{1,100})l(\\d+)/i );\n\t\tconst orderMatch = listStyle.match( /\\s{0,100}lfo(\\d+)/i );\n\t\tconst indentMatch = listStyle.match( /\\s{0,100}level(\\d+)/i );\n\n\t\tif ( idMatch && orderMatch && indentMatch ) {\n\t\t\tdata.id = idMatch[ 2 ];\n\t\t\tdata.order = orderMatch[ 1 ];\n\t\t\tdata.indent = parseInt( indentMatch[ 1 ] );\n\t\t}\n\t}\n\n\treturn data;\n}\n\n/**\n * Removes span with a numbering/bullet from a given element.\n */\nfunction removeBulletElement( element: ViewElement, writer: UpcastWriter ) {\n\t// Matcher for finding `span` elements holding lists numbering/bullets.\n\tconst bulletMatcher = new Matcher( {\n\t\tname: 'span',\n\t\tstyles: {\n\t\t\t'mso-list': 'Ignore'\n\t\t}\n\t} );\n\n\tconst range = writer.createRangeIn( element );\n\n\tfor ( const value of range ) {\n\t\tif ( value.type === 'elementStart' && bulletMatcher.match( value.item as ViewElement ) ) {\n\t\t\twriter.remove( value.item as ViewElement );\n\t\t}\n\t}\n}\n\n/**\n * Whether the previous and current items belong to the same list. It is determined based on `item.id`\n * (extracted from `mso-list` style, see #getListItemData) and a previous sibling of the current item.\n *\n * However, it's quite easy to change the `id` attribute for nested lists in Word. It will break the list feature while pasting.\n * Let's check also the `indent` attribute. If the difference between those two elements is equal to 1, we can assume that\n * the `currentItem` is a beginning of the nested list because lists in CKEditor 5 always start with the `indent=0` attribute.\n * See: https://github.com/ckeditor/ckeditor5/issues/7805.\n */\nfunction isNewListNeeded( previousItem: ListLikeElement, currentItem: ListLikeElement ) {\n\tif ( !previousItem ) {\n\t\treturn true;\n\t}\n\n\tif ( previousItem.id !== currentItem.id ) {\n\t\t// See: https://github.com/ckeditor/ckeditor5/issues/7805.\n\t\t//\n\t\t// * List item 1.\n\t\t// - Nested list item 1.\n\t\tif ( currentItem.indent - previousItem.indent === 1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tconst previousSibling = currentItem.element.previousSibling;\n\n\tif ( !previousSibling ) {\n\t\treturn true;\n\t}\n\n\t// Even with the same id the list does not have to be continuous (#43).\n\treturn !isList( previousSibling );\n}\n\nfunction isList( element: ViewNode ) {\n\treturn element.is( 'element', 'ol' ) || element.is( 'element', 'ul' );\n}\n\n/**\n * Calculates the indentation difference between two given list items (based on the indent attribute\n * extracted from the `mso-list` style, see #getListItemData).\n */\nfunction getIndentationDifference( previousItem: ListLikeElement | null, currentItem: ListLikeElement ) {\n\treturn previousItem ? currentItem.indent - previousItem.indent : currentItem.indent - 1;\n}\n\n/**\n * Finds the parent list element (ul/ol) of a given list element with indentation level lower by a given value.\n *\n * @param listElement List element from which to start looking for a parent list.\n * @param indentationDifference Indentation difference between lists.\n * @returns Found list element with indentation level lower by a given value.\n */\nfunction findParentListAtLevel( listElement: ViewElement, indentationDifference: number ) {\n\tconst ancestors = listElement.getAncestors( { parentFirst: true } );\n\n\tlet parentList = null;\n\tlet levelChange = 0;\n\n\tfor ( const ancestor of ancestors ) {\n\t\tif ( ancestor.is( 'element', 'ul' ) || ancestor.is( 'element', 'ol' ) ) {\n\t\t\tlevelChange++;\n\t\t}\n\n\t\tif ( levelChange === indentationDifference ) {\n\t\t\tparentList = ancestor;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn parentList as ViewElement;\n}\n\ninterface ListItemData {\n\n\t/**\n\t * Parent list id.\n\t */\n\tid: string;\n\n\t/**\n\t * List item creation order.\n\t */\n\torder: string;\n\n\t/**\n\t * List item indentation level.\n\t */\n\tindent: number;\n}\n\ninterface ListLikeElement extends ListItemData {\n\n\t/**\n\t * List-like element.\n\t */\n\telement: ViewElement;\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/googledocsnormalizer\n */\n\nimport { UpcastWriter, type ViewDocument } from 'ckeditor5/src/engine';\n\nimport removeBoldWrapper from '../filters/removeboldwrapper';\nimport transformBlockBrsToParagraphs from '../filters/br';\nimport { unwrapParagraphInListItem } from '../filters/list';\nimport type { Normalizer, NormalizerData } from '../normalizer';\n\nconst googleDocsMatch = /id=(\"|')docs-internal-guid-[-0-9a-f]+(\"|')/i;\n\n/**\n * Normalizer for the content pasted from Google Docs.\n */\nexport default class GoogleDocsNormalizer implements Normalizer {\n\tpublic readonly document: ViewDocument;\n\n\t/**\n\t * Creates a new `GoogleDocsNormalizer` instance.\n\t *\n\t * @param document View document.\n\t */\n\tconstructor( document: ViewDocument ) {\n\t\tthis.document = document;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isActive( htmlString: string ): boolean {\n\t\treturn googleDocsMatch.test( htmlString );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic execute( data: NormalizerData ): void {\n\t\tconst writer = new UpcastWriter( this.document );\n\t\tconst { body: documentFragment } = data._parsedData;\n\n\t\tremoveBoldWrapper( documentFragment, writer );\n\t\tunwrapParagraphInListItem( documentFragment, writer );\n\t\ttransformBlockBrsToParagraphs( documentFragment, writer );\n\n\t\tdata.content = documentFragment;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removeboldwrapper\n */\n\nimport type { UpcastWriter, ViewDocumentFragment } from 'ckeditor5/src/engine';\n\n/**\n * Removes `` tag wrapper added by Google Docs to a copied content.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n */\nexport default function removeBoldWrapper( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): void {\n\tfor ( const child of documentFragment.getChildren() ) {\n\t\tif ( child.is( 'element', 'b' ) && child.getStyle( 'font-weight' ) === 'normal' ) {\n\t\t\tconst childIndex = documentFragment.getChildIndex( child );\n\n\t\t\twriter.remove( child );\n\t\t\twriter.insertChild( childIndex, child.getChildren(), documentFragment );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/image\n */\n\n/* globals btoa */\n\nimport {\n\tMatcher,\n\tUpcastWriter,\n\ttype ViewDocumentFragment,\n\ttype ViewElement,\n\ttype ViewNode\n} from 'ckeditor5/src/engine';\n\n/**\n * Replaces source attribute of all `` elements representing regular\n * images (not the Word shapes) with inlined base64 image representation extracted from RTF or Blob data.\n *\n * @param documentFragment Document fragment on which transform images.\n * @param rtfData The RTF data from which images representation will be used.\n */\nexport function replaceImagesSourceWithBase64( documentFragment: ViewDocumentFragment, rtfData: string ): void {\n\tif ( !documentFragment.childCount ) {\n\t\treturn;\n\t}\n\n\tconst upcastWriter = new UpcastWriter( documentFragment.document );\n\tconst shapesIds = findAllShapesIds( documentFragment, upcastWriter );\n\n\tremoveAllImgElementsRepresentingShapes( shapesIds, documentFragment, upcastWriter );\n\tinsertMissingImgs( shapesIds, documentFragment, upcastWriter );\n\tremoveAllShapeElements( documentFragment, upcastWriter );\n\n\tconst images = findAllImageElementsWithLocalSource( documentFragment, upcastWriter );\n\n\tif ( images.length ) {\n\t\treplaceImagesFileSourceWithInlineRepresentation( images, extractImageDataFromRtf( rtfData ), upcastWriter );\n\t}\n}\n\n/**\n * Converts given HEX string to base64 representation.\n *\n * @internal\n * @param hexString The HEX string to be converted.\n * @returns Base64 representation of a given HEX string.\n */\nexport function _convertHexToBase64( hexString: string ): string {\n\treturn btoa( hexString.match( /\\w{2}/g )!.map( char => {\n\t\treturn String.fromCharCode( parseInt( char, 16 ) );\n\t} ).join( '' ) );\n}\n\n/**\n * Finds all shapes (`...`) ids. Shapes can represent images (canvas)\n * or Word shapes (which does not have RTF or Blob representation).\n *\n * @param documentFragment Document fragment from which to extract shape ids.\n * @returns Array of shape ids.\n */\nfunction findAllShapesIds( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): Array {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapeElementsMatcher = new Matcher( {\n\t\tname: /v:(.+)/\n\t} );\n\n\tconst shapesIds = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type != 'elementStart' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst el = value.item as ViewElement;\n\t\tconst previousSibling = el.previousSibling;\n\t\tconst prevSiblingName = previousSibling && previousSibling.is( 'element' ) ? previousSibling.name : null;\n\n\t\t// If shape element have 'o:gfxdata' attribute and is not directly before `` element it means it represent Word shape.\n\t\tif ( shapeElementsMatcher.match( el ) && el.getAttribute( 'o:gfxdata' ) && prevSiblingName !== 'v:shapetype' ) {\n\t\t\tshapesIds.push( ( value.item as ViewElement ).getAttribute( 'id' )! );\n\t\t}\n\t}\n\n\treturn shapesIds;\n}\n\n/**\n * Removes all `` elements which represents Word shapes and not regular images.\n *\n * @param shapesIds Shape ids which will be checked against `` elements.\n * @param documentFragment Document fragment from which to remove `` elements.\n */\nfunction removeAllImgElementsRepresentingShapes(\n\tshapesIds: Array,\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): void {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst imageElementsMatcher = new Matcher( {\n\t\tname: 'img'\n\t} );\n\n\tconst imgs = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.item.is( 'element' ) && imageElementsMatcher.match( value.item ) ) {\n\t\t\tconst el = value.item;\n\t\t\tconst shapes = el.getAttribute( 'v:shapes' ) ? el.getAttribute( 'v:shapes' )!.split( ' ' ) : [];\n\n\t\t\tif ( shapes.length && shapes.every( shape => shapesIds.indexOf( shape ) > -1 ) ) {\n\t\t\t\timgs.push( el );\n\t\t\t// Shapes may also have empty source while content is paste in some browsers (Safari).\n\t\t\t} else if ( !el.getAttribute( 'src' ) ) {\n\t\t\t\timgs.push( el );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const img of imgs ) {\n\t\twriter.remove( img );\n\t}\n}\n\n/**\n * Removes all shape elements (`...`) so they do not pollute the output structure.\n *\n * @param documentFragment Document fragment from which to remove shape elements.\n */\nfunction removeAllShapeElements( documentFragment: ViewDocumentFragment, writer: UpcastWriter ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapeElementsMatcher = new Matcher( {\n\t\tname: /v:(.+)/\n\t} );\n\n\tconst shapes = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type == 'elementStart' && shapeElementsMatcher.match( value.item as ViewElement ) ) {\n\t\t\tshapes.push( value.item as ViewElement );\n\t\t}\n\t}\n\n\tfor ( const shape of shapes ) {\n\t\twriter.remove( shape );\n\t}\n}\n\n/**\n * Inserts `img` tags if there is none after a shape.\n */\nfunction insertMissingImgs( shapeIds: Array, documentFragment: ViewDocumentFragment, writer: UpcastWriter ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapes: Array = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type == 'elementStart' && value.item.is( 'element', 'v:shape' ) ) {\n\t\t\tconst id = value.item.getAttribute( 'id' )!;\n\n\t\t\tif ( shapeIds.includes( id ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !containsMatchingImg( value.item.parent!.getChildren(), id ) ) {\n\t\t\t\tshapes.push( value.item );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const shape of shapes ) {\n\t\tconst attrs: Record = {\n\t\t\tsrc: findSrc( shape )\n\t\t};\n\n\t\tif ( shape.hasAttribute( 'alt' ) ) {\n\t\t\tattrs.alt = shape.getAttribute( 'alt' );\n\t\t}\n\n\t\tconst img = writer.createElement( 'img', attrs );\n\n\t\twriter.insertChild( shape.index! + 1, img, shape.parent! );\n\t}\n\n\tfunction containsMatchingImg( nodes: Iterable, id: string ): boolean {\n\t\tfor ( const node of nodes ) {\n\t\t\t/* istanbul ignore else */\n\t\t\tif ( node.is( 'element' ) ) {\n\t\t\t\tif ( node.name == 'img' && node.getAttribute( 'v:shapes' ) == id ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif ( containsMatchingImg( node.getChildren(), id ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction findSrc( shape: ViewElement ) {\n\t\tfor ( const child of shape.getChildren() ) {\n\t\t\t/* istanbul ignore else */\n\t\t\tif ( child.is( 'element' ) && child.getAttribute( 'src' ) ) {\n\t\t\t\treturn child.getAttribute( 'src' );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Finds all `` elements in a given document fragment which have source pointing to local `file://` resource.\n *\n * @param documentFragment Document fragment in which to look for `` elements.\n * @returns result All found images grouped by source type.\n */\nfunction findAllImageElementsWithLocalSource(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): Array {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst imageElementsMatcher = new Matcher( {\n\t\tname: 'img'\n\t} );\n\n\tconst imgs = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.item.is( 'element' ) && imageElementsMatcher.match( value.item ) ) {\n\t\t\tif ( value.item.getAttribute( 'src' )!.startsWith( 'file://' ) ) {\n\t\t\t\timgs.push( value.item );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn imgs;\n}\n\n/**\n * Extracts all images HEX representations from a given RTF data.\n *\n * @param rtfData The RTF data from which to extract images HEX representation.\n * @returns Array of found HEX representations. Each array item is an object containing:\n *\n * * hex Image representation in HEX format.\n * * type Type of image, `image/png` or `image/jpeg`.\n */\nfunction extractImageDataFromRtf( rtfData: string ): Array<{ hex: string; type: string }> {\n\tif ( !rtfData ) {\n\t\treturn [];\n\t}\n\n\tconst regexPictureHeader = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/;\n\tconst regexPicture = new RegExp( '(?:(' + regexPictureHeader.source + '))([\\\\da-fA-F\\\\s]+)\\\\}', 'g' );\n\tconst images = rtfData.match( regexPicture );\n\tconst result = [];\n\n\tif ( images ) {\n\t\tfor ( const image of images ) {\n\t\t\tlet imageType: string | false = false;\n\n\t\t\tif ( image.includes( '\\\\pngblip' ) ) {\n\t\t\t\timageType = 'image/png';\n\t\t\t} else if ( image.includes( '\\\\jpegblip' ) ) {\n\t\t\t\timageType = 'image/jpeg';\n\t\t\t}\n\n\t\t\tif ( imageType ) {\n\t\t\t\tresult.push( {\n\t\t\t\t\thex: image.replace( regexPictureHeader, '' ).replace( /[^\\da-fA-F]/g, '' ),\n\t\t\t\t\ttype: imageType\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Replaces `src` attribute value of all given images with the corresponding base64 image representation.\n *\n * @param imageElements Array of image elements which will have its source replaced.\n * @param imagesHexSources Array of images hex sources (usually the result of `extractImageDataFromRtf()` function).\n * The array should be the same length as `imageElements` parameter.\n */\nfunction replaceImagesFileSourceWithInlineRepresentation(\n\timageElements: Array,\n\timagesHexSources: ReturnType,\n\twriter: UpcastWriter\n) {\n\t// Assume there is an equal amount of image elements and images HEX sources so they can be matched accordingly based on existing order.\n\tif ( imageElements.length === imagesHexSources.length ) {\n\t\tfor ( let i = 0; i < imageElements.length; i++ ) {\n\t\t\tconst newSrc = `data:${ imagesHexSources[ i ].type };base64,${ _convertHexToBase64( imagesHexSources[ i ].hex ) }`;\n\t\t\twriter.setAttribute( 'src', newSrc, imageElements[ i ] );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/mswordnormalizer\n */\n\nimport { transformListItemLikeElementsIntoLists } from '../filters/list';\nimport { replaceImagesSourceWithBase64 } from '../filters/image';\nimport type { Normalizer, NormalizerData } from '../normalizer';\n\nimport type { ViewDocument } from 'ckeditor5/src/engine';\n\nconst msWordMatch1 = //i;\nconst msWordMatch2 = /xmlns:o=\"urn:schemas-microsoft-com/i;\n\n/**\n * Normalizer for the content pasted from Microsoft Word.\n */\nexport default class MSWordNormalizer implements Normalizer {\n\tpublic readonly document: ViewDocument;\n\n\t/**\n\t * Creates a new `MSWordNormalizer` instance.\n\t *\n\t * @param document View document.\n\t */\n\tconstructor( document: ViewDocument ) {\n\t\tthis.document = document;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isActive( htmlString: string ): boolean {\n\t\treturn msWordMatch1.test( htmlString ) || msWordMatch2.test( htmlString );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic execute( data: NormalizerData ): void {\n\t\tconst { body: documentFragment, stylesString } = data._parsedData;\n\n\t\ttransformListItemLikeElementsIntoLists( documentFragment, stylesString );\n\t\treplaceImagesSourceWithBase64( documentFragment, data.dataTransfer.getData( 'text/rtf' ) );\n\n\t\tdata.content = documentFragment;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/space\n */\n\n/**\n * Replaces last space preceding elements closing tag with ` `. Such operation prevents spaces from being removed\n * during further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\n * This method also takes into account Word specific `` empty tags.\n * Additionally multiline sequences of spaces and new lines between tags are removed (see #39 and #40).\n *\n * @param htmlString HTML string in which spacing should be normalized.\n * @returns Input HTML with spaces normalized.\n */\nexport function normalizeSpacing( htmlString: string ): string {\n\t// Run normalizeSafariSpaceSpans() two times to cover nested spans.\n\treturn normalizeSafariSpaceSpans( normalizeSafariSpaceSpans( htmlString ) )\n\t\t// Remove all \\r\\n from \"spacerun spans\" so the last replace line doesn't strip all whitespaces.\n\t\t.replace( /([^\\S\\r\\n]*?)[\\r\\n]+([^\\S\\r\\n]*<\\/span>)/g, '$1$2' )\n\t\t.replace( /<\\/span>/g, '' )\n\t\t.replace( / <\\//g, '\\u00A0<\\/o:p>/g, '\\u00A0' )\n\t\t// Remove block filler from empty paragraph. Safari uses \\u00A0 instead of  .\n\t\t.replace( /( |\\u00A0)<\\/o:p>/g, '' )\n\t\t// Remove all whitespaces when they contain any \\r or \\n.\n\t\t.replace( />([^\\S\\r\\n]*[\\r\\n]\\s*)<' );\n}\n\n/**\n * Normalizes spacing in special Word `spacerun spans` (`\\s+`) by replacing\n * all spaces with `  ` pairs. This prevents spaces from being removed during further DOM/View processing\n * (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\n *\n * @param htmlDocument Native `Document` object in which spacing should be normalized.\n */\nexport function normalizeSpacerunSpans( htmlDocument: Document ): void {\n\thtmlDocument.querySelectorAll( 'span[style*=spacerun]' ).forEach( el => {\n\t\tconst htmlElement = el as HTMLElement;\n\t\tconst innerTextLength = htmlElement.innerText.length || 0;\n\n\t\thtmlElement.innerText = Array( innerTextLength + 1 ).join( '\\u00A0 ' ).substr( 0, innerTextLength );\n\t} );\n}\n\n/**\n * Normalizes specific spacing generated by Safari when content pasted from Word (` `)\n * by replacing all spaces sequences longer than 1 space with `  ` pairs. This prevents spaces from being removed during\n * further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\n *\n * This function is similar to {@link module:clipboard/utils/normalizeclipboarddata normalizeClipboardData util} but uses\n * regular spaces /   sequence for replacement.\n *\n * @param htmlString HTML string in which spacing should be normalized\n * @returns Input HTML with spaces normalized.\n */\nfunction normalizeSafariSpaceSpans( htmlString: string ) {\n\treturn htmlString.replace( /(\\s+)<\\/span>/g, ( fullMatch, spaces ) => {\n\t\treturn spaces.length === 1 ? ' ' : Array( spaces.length + 1 ).join( '\\u00A0 ' ).substr( 0, spaces.length );\n\t} );\n}\n","/**\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/parse\n */\n\n/* globals DOMParser */\n\nimport {\n\tDomConverter,\n\tViewDocument,\n\ttype StylesProcessor,\n\ttype ViewDocumentFragment\n} from 'ckeditor5/src/engine';\n\nimport { normalizeSpacing, normalizeSpacerunSpans } from './space';\n\n/**\n * Parses provided HTML extracting contents of `` and ` + + + + + + + diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css new file mode 100644 index 000000000..ff402f678 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content .media { + /* Don't allow floated content overlap the media. + https://github.com/ckeditor/ckeditor5-media-embed/issues/53 */ + clear: both; + + /* Make sure there is some space between the content and the media. */ + /* The first value should be equal to --ck-spacing-large variable if used in the editor context + to avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */ + margin: 0.9em 0; + + /* Make sure media is not overriden with Bootstrap default `flex` value. + See: https://github.com/ckeditor/ckeditor5/issues/1373. */ + display: block; + + /* Give the media some minimal width in the content to prevent them + from being "squashed" in tight spaces, e.g. in table cells (#44) */ + min-width: 15em; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css new file mode 100644 index 000000000..d07f123de --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-media__wrapper { + & .ck-media__placeholder { + display: flex; + flex-direction: column; + align-items: center; + + & .ck-media__placeholder__url { + /* Otherwise the URL will overflow when the content is very narrow. */ + max-width: 100%; + + position: relative; + + & .ck-media__placeholder__url__text { + overflow: hidden; + display: block; + } + } + } + + &[data-oembed-url*="twitter.com"], + &[data-oembed-url*="google.com/maps"], + &[data-oembed-url*="goo.gl/maps"], + &[data-oembed-url*="maps.google.com"], + &[data-oembed-url*="maps.app.goo.gl"], + &[data-oembed-url*="facebook.com"], + &[data-oembed-url*="instagram.com"] { + & .ck-media__placeholder__icon * { + display: none; + } + } +} + +/* Disable all mouse interaction as long as the editor is not read–only. + https://github.com/ckeditor/ckeditor5-media-embed/issues/58 */ +.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper > *:not(.ck-media__placeholder) { + pointer-events: none; +} + +/* Disable all mouse interaction when the widget is not selected (e.g. to avoid opening links by accident). + https://github.com/ckeditor/ckeditor5-media-embed/issues/18 */ +.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder { + pointer-events: none; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaform.css b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaform.css new file mode 100644 index 000000000..d0d4b0688 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-media-embed/theme/mediaform.css @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"; + +.ck.ck-media-form { + display: flex; + align-items: flex-start; + flex-direction: row; + flex-wrap: nowrap; + + & .ck-labeled-field-view { + display: inline-block; + } + + & .ck-label { + display: none; + } + + @mixin ck-media-phone { + flex-wrap: wrap; + + & .ck-labeled-field-view { + flex-basis: 100%; + } + + & .ck-button { + flex-basis: 50%; + } + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/CHANGELOG.md new file mode 100644 index 000000000..d5a8c7c0d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/CHANGELOG.md @@ -0,0 +1,175 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v18.0.0...v19.0.0) (2020-04-29) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v17.0.0...v18.0.0) (2020-03-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v16.0.0...v17.0.0) (2020-02-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v15.0.0...v16.0.0) (2019-12-04) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.5...v15.0.0) (2019-10-23) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.4...v11.0.5) (2019-08-26) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([7229cdb](https://github.com/ckeditor/ckeditor5-paragraph/commit/7229cdb)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([b1b9e23](https://github.com/ckeditor/ckeditor5-paragraph/commit/b1b9e23)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.3...v11.0.4) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.2...v11.0.3) (2019-07-04) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.1...v11.0.2) (2019-06-05) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.0...v11.0.1) (2019-04-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.4...v11.0.0) (2019-02-28) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.3...v10.0.4) (2018-12-05) + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([a9f440f](https://github.com/ckeditor/ckeditor5-paragraph/commit/a9f440f)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.2...v10.0.3) (2018-10-08) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.1...v10.0.2) (2018-07-18) + +### Other changes + +* Refreshed the paragraph icon (see [ckeditor/ckeditor5-ui#394](https://github.com/ckeditor/ckeditor5-ui/issues/394)). ([d6e054a](https://github.com/ckeditor/ckeditor5-paragraph/commit/d6e054a)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.0...v10.0.1) (2018-06-21) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([8f01946](https://github.com/ckeditor/ckeditor5-paragraph/commit/8f01946)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +### Features + +* Introduced `ParagraphButtonUI` plugin. Closes [#33](https://github.com/ckeditor/ckeditor5-paragraph/issues/33). ([12dadba](https://github.com/ckeditor/ckeditor5-paragraph/commit/12dadba)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +### Other changes + +* Aligned feature class naming to the new scheme. ([69e98d3](https://github.com/ckeditor/ckeditor5-paragraph/commit/69e98d3)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +Internal changes only (updated dependencies, documentation, etc.). + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.9.0...v1.0.0-alpha.1) (2017-10-03) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.8.0...v0.9.0) (2017-09-03) + +### Bug fixes + +* `ParagraphCommand` should check whether it can be applied to the selection. Closes [#24](https://github.com/ckeditor/ckeditor5-paragraph/issues/24). ([07b37af](https://github.com/ckeditor/ckeditor5-paragraph/commit/07b37af)) +* Autoparagraphing empty roots will not be triggered if the change-to-fix was in a `transparent` batch. Closes [#26](https://github.com/ckeditor/ckeditor5-paragraph/issues/26). ([a171de3](https://github.com/ckeditor/ckeditor5-paragraph/commit/a171de3)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([c2a1559](https://github.com/ckeditor/ckeditor5-paragraph/commit/c2a1559)) + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.7.0...v0.8.0) (2017-05-07) + +### Bug fixes + +* Content autoparagraphing has been improved. "Inline" view elements (converted to attributes or elements) will be now correctly handled and autoparagraphed. Closes [#10](https://github.com/ckeditor/ckeditor5-paragraph/issues/10). Closes [#11](https://github.com/ckeditor/ckeditor5-paragraph/issues/11). ([22d387c](https://github.com/ckeditor/ckeditor5-paragraph/commit/22d387c)) + +### Features + +* Paragraph will be automatically created if loaded empty data or if programmatically emptied the root element. Closes [#19](https://github.com/ckeditor/ckeditor5-paragraph/issues/19). ([c42d33e](https://github.com/ckeditor/ckeditor5-paragraph/commit/c42d33e)) + + +## [0.7.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.6.1...v0.7.0) (2017-04-05) + +### Bug fixes + +* Paragraph command should correctly update its `value` and `isEnabled` properties. Closes [#16](https://github.com/ckeditor/ckeditor5-paragraph/issues/16). ([931e02f](https://github.com/ckeditor/ckeditor5-paragraph/commit/931e02f)) + +### Features + +* Implemented `ParagraphCommand`, previously part of the `HeadingCommand`. Closes [#14](https://github.com/ckeditor/ckeditor5-paragraph/issues/14). ([876877d](https://github.com/ckeditor/ckeditor5-paragraph/commit/876877d)) +* Named existing plugin(s). ([46dc9b8](https://github.com/ckeditor/ckeditor5-paragraph/commit/46dc9b8)) + + +## [0.6.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.6.0...v0.6.1) (2017-03-06) + +Internal changes only (updated dependencies, documentation, etc.). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/LICENSE.md new file mode 100644 index 000000000..7262b5636 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 paragraph feature** – https://github.com/ckeditor/ckeditor5-paragraph
      +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/README.md new file mode 100644 index 000000000..e98906d77 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/README.md @@ -0,0 +1,17 @@ +CKEditor 5 paragraph feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-paragraph.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-paragraph) + +This package implements paragraph support for CKEditor 5. + +## Documentation + +See the [`@ckeditor/ckeditor5-paragraph` package](https://ckeditor.com/docs/ckeditor5/latest/api/paragraph.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json new file mode 100644 index 000000000..e4845e642 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json @@ -0,0 +1,17 @@ +{ + "plugins": [ + { + "name": "Paragraph", + "className": "Paragraph", + "description": "Enables support for adding paragraphs to your content.", + "path": "src/paragraph.js", + "htmlOutput": [ + { + "elements": "p", + "implements": "$block", + "_comment": "This element inherits all attributes, classes and styles that are allowed on the `<$block>` element by other features." + } + ] + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/package.json new file mode 100644 index 000000000..0575fb884 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/package.json @@ -0,0 +1,58 @@ +{ + "name": "@ckeditor/ckeditor5-paragraph", + "version": "36.0.1", + "description": "Paragraph feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "@ckeditor/ckeditor5-core": "^36.0.1", + "@ckeditor/ckeditor5-ui": "^36.0.1", + "@ckeditor/ckeditor5-utils": "^36.0.1" + }, + "devDependencies": { + "@ckeditor/ckeditor5-basic-styles": "^36.0.1", + "@ckeditor/ckeditor5-clipboard": "^36.0.1", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-engine": "^36.0.1", + "@ckeditor/ckeditor5-enter": "^36.0.1", + "@ckeditor/ckeditor5-heading": "^36.0.1", + "@ckeditor/ckeditor5-link": "^36.0.1", + "@ckeditor/ckeditor5-typing": "^36.0.1", + "@ckeditor/ckeditor5-undo": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-paragraph" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/index.js new file mode 100644 index 000000000..6b2395521 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/index.js @@ -0,0 +1,9 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph + */ +export { default as Paragraph } from './paragraph'; +export { default as ParagraphButtonUI } from './paragraphbuttonui'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js new file mode 100644 index 000000000..b787a2c80 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js @@ -0,0 +1,58 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/insertparagraphcommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +/** + * The insert paragraph command. It inserts a new paragraph at a specific + * {@link module:engine/model/position~Position document position}. + * + * // Insert a new paragraph before an element in the document. + * editor.execute( 'insertParagraph', { + * position: editor.model.createPositionBefore( element ) + * } ); + * + * If a paragraph is disallowed in the context of the specific position, the command + * will attempt to split position ancestors to find a place where it is possible + * to insert a paragraph. + * + * **Note**: This command moves the selection to the inserted paragraph. + * + * @extends module:core/command~Command + */ +export default class InsertParagraphCommand extends Command { + /** + * Executes the command. + * + * @param {Object} options Options for the executed command. + * @param {module:engine/model/position~Position} options.position The model position at which + * the new paragraph will be inserted. + * @param {Object} attributes Attributes keys and values to set on a inserted paragraph + * @fires execute + */ + execute(options) { + const model = this.editor.model; + const attributes = options.attributes; + let position = options.position; + model.change(writer => { + const paragraph = writer.createElement('paragraph'); + if (attributes) { + model.schema.setAllowedAttributes(paragraph, attributes, writer); + } + if (!model.schema.checkChild(position.parent, paragraph)) { + const allowedParent = model.schema.findAllowedParent(position, paragraph); + // It could be there's no ancestor limit that would allow paragraph. + // In theory, "paragraph" could be disallowed even in the "$root". + if (!allowedParent) { + return; + } + position = writer.split(position, allowedParent).position; + } + model.insertContent(paragraph, position); + writer.setSelection(paragraph, 'in'); + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraph.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraph.js new file mode 100644 index 000000000..ac379a6c0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraph.js @@ -0,0 +1,106 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraph + */ +import ParagraphCommand from './paragraphcommand'; +import InsertParagraphCommand from './insertparagraphcommand'; +import { Plugin } from '@ckeditor/ckeditor5-core'; +/** + * The paragraph feature for the editor. + * + * It introduces the `` element in the model which renders as a `

      ` element in the DOM and data. + * + * It also brings two editors commands: + * + * * The {@link module:paragraph/paragraphcommand~ParagraphCommand `'paragraph'`} command that converts all + * blocks in the model selection into paragraphs. + * * The {@link module:paragraph/insertparagraphcommand~InsertParagraphCommand `'insertParagraph'`} command + * that inserts a new paragraph at a specified location in the model. + * + * @extends module:core/plugin~Plugin + */ +export default class Paragraph extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'Paragraph'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const model = editor.model; + editor.commands.add('paragraph', new ParagraphCommand(editor)); + editor.commands.add('insertParagraph', new InsertParagraphCommand(editor)); + // Schema. + model.schema.register('paragraph', { inheritAllFrom: '$block' }); + editor.conversion.elementToElement({ model: 'paragraph', view: 'p' }); + // Conversion for paragraph-like elements which has not been converted by any plugin. + editor.conversion.for('upcast').elementToElement({ + model: (viewElement, { writer }) => { + if (!Paragraph.paragraphLikeElements.has(viewElement.name)) { + return null; + } + // Do not auto-paragraph empty elements. + if (viewElement.isEmpty) { + return null; + } + return writer.createElement('paragraph'); + }, + view: /.+/, + converterPriority: 'low' + }); + } +} +/** + * A list of element names which should be treated by the autoparagraphing algorithms as + * paragraph-like. This means that e.g. the following content: + * + *

      Foo

      +* +* +* +* +* +*
      X +*
        +*
      • Y
      • +*
      • Z
      • +*
      +*
      +* +* contains five paragraph-like elements: `

      `, two ``s and two `
    1. `s. +* Hence, if none of the features is going to convert those elements the above content will be automatically handled +* by the paragraph feature and converted to: +* +*

      Foo

      +*

      X

      +*

      Y

      +*

      Z

      +* +* Note: The `` containing two `
    2. ` elements was ignored as the innermost paragraph-like elements +* have a priority upon conversion. +* +* @member {Set.} module:paragraph/paragraph~Paragraph.paragraphLikeElements +*/ +Paragraph.paragraphLikeElements = new Set([ + 'blockquote', + 'dd', + 'div', + 'dt', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'li', + 'p', + 'td', + 'th' +]); diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js new file mode 100644 index 000000000..df9e00190 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraphbuttonui + */ +import { Plugin, icons } from '@ckeditor/ckeditor5-core'; +import { ButtonView } from '@ckeditor/ckeditor5-ui'; +import Paragraph from './paragraph'; +const icon = icons.paragraph; +/** + * This plugin defines the `'paragraph'` button. It can be used together with + * {@link module:heading/headingbuttonsui~HeadingButtonsUI} to replace the standard heading dropdown. + * + * This plugin is not loaded automatically by the {@link module:paragraph/paragraph~Paragraph} plugin. It must + * be added manually. + * + * ClassicEditor + * .create( { + * plugins: [ ..., Heading, Paragraph, HeadingButtonsUI, ParagraphButtonUI ] + * toolbar: [ 'paragraph', 'heading1', 'heading2', 'heading3' ] + * } ) + * .then( ... ) + * .catch( ... ); + * + * @extends module:core/plugin~Plugin + */ +export default class ParagraphButtonUI extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [Paragraph]; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + editor.ui.componentFactory.add('paragraph', locale => { + const view = new ButtonView(locale); + const command = editor.commands.get('paragraph'); + view.label = t('Paragraph'); + view.icon = icon; + view.tooltip = true; + view.isToggleable = true; + view.bind('isEnabled').to(command); + view.bind('isOn').to(command, 'value'); + view.on('execute', () => { + editor.execute('paragraph'); + }); + return view; + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js new file mode 100644 index 000000000..d11895931 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraphcommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +import { first } from '@ckeditor/ckeditor5-utils'; +/** + * The paragraph command. + * + * @extends module:core/command~Command + */ +export default class ParagraphCommand extends Command { + /** + * @inheritDoc + */ + refresh() { + const model = this.editor.model; + const document = model.document; + const block = first(document.selection.getSelectedBlocks()); + this.value = !!block && block.is('element', 'paragraph'); + this.isEnabled = !!block && checkCanBecomeParagraph(block, model.schema); + } + /** + * Executes the command. All the blocks (see {@link module:engine/model/schema~Schema}) in the selection + * will be turned to paragraphs. + * + * @fires execute + * @param {Object} [options] Options for the executed command. + * @param {module:engine/model/selection~Selection|module:engine/model/documentselection~DocumentSelection} [options.selection] + * The selection that the command should be applied to. + * By default, if not provided, the command is applied to the {@link module:engine/model/document~Document#selection}. + */ + execute(options = {}) { + const model = this.editor.model; + const document = model.document; + model.change(writer => { + const blocks = (options.selection || document.selection).getSelectedBlocks(); + for (const block of blocks) { + if (!block.is('element', 'paragraph') && checkCanBecomeParagraph(block, model.schema)) { + writer.rename(block, 'paragraph'); + } + } + }); + } +} +// Checks whether the given block can be replaced by a paragraph. +// +// @private +// @param {module:engine/model/element~Element} block A block to be tested. +// @param {module:engine/model/schema~Schema} schema The schema of the document. +// @returns {Boolean} +function checkCanBecomeParagraph(block, schema) { + return schema.checkChild(block.parent, 'paragraph') && !schema.isObject(block); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md new file mode 100644 index 000000000..10d07aede --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md @@ -0,0 +1,94 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v18.0.0...v19.0.0) (2020-04-29) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v17.0.0...v18.0.0) (2020-03-19) + +### Features + +* Added support for basic list indentation when pasting from Microsoft Word. Closes [ckeditor/ckeditor5#2518](https://github.com/ckeditor/ckeditor5/issues/2518). ([58ae829](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/58ae829)) + + Thanks to [gjhenrique](https://github.com/gjhenrique) for the contribution! + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v16.0.0...v17.0.0) (2020-02-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Bug fixes + +* Fixed handling `mso-list:normal`. Closes [ckeditor/ckeditor5#5712](https://github.com/ckeditor/ckeditor5/issues/5712). ([2054e69](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/2054e69)) + + Thanks [@bendemboski](https://github.com/bendemboski)! +* Fixed various issues with oddly formatted space run spans. ([2cd7b0f](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/2cd7b0f)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.1.0...v15.0.0) (2019-10-23) + +### Other changes + +* Remove the `fixListIndentation()` filter in favor of improved list converters fix. See [ckeditor/ckeditor5-list#115](https://github.com/ckeditor/ckeditor5-list/issues/115). ([d594038](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/d594038)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.4...v11.1.0) (2019-08-26) + +### Features + +* Prevent of bolding entire content pasted from Google Docs. Closes [#61](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/61). ([8102de3](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/8102de3)) +* Provide support for pasting lists from Google Docs. Closes [#69](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/69). ([6ad2a62](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/6ad2a62)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([22edb90](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/22edb90)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.3...v11.0.4) (2019-07-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.2...v11.0.3) (2019-07-04) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.1...v11.0.2) (2019-06-05) + +### Other changes + +* Loosen a dependency of a clipboard plugin in the paste from Office plugin so that it can be overridden. Closes [#56](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/56). ([561f22b](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/561f22b)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.0...v11.0.1) (2019-04-10) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v10.0.0...v11.0.0) (2019-02-28) + +### Bug fixes + +* Ensured correct lists ordering for separate list items with the same `mso-list` id. Closes [#43](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/43). ([4ebc363](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/4ebc363)) +* Handle "spacerun spans" with mixed whitespaces. Closes [#49](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/49). Closes [#50](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/50). ([7fb132f](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/7fb132f)) + + Huge thanks to [Matt Kobs](https://github.com/kobsy) for this contribution! + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/tree/v10.0.0) (2018-12-05) + +Initial implementation of the Paste from Office feature. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/LICENSE.md new file mode 100644 index 000000000..0badbaae9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 paste from Office feature** – https://github.com/ckeditor/ckeditor5-paste-from-office
      +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/README.md new file mode 100644 index 000000000..e15b01c3e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/README.md @@ -0,0 +1,23 @@ +CKEditor 5 paste from Office feature +================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-paste-from-office.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-paste-from-office) + +This package implements the [paste from Office](https://docs.ckeditor.com/ckeditor5/latest/features/paste-from-office.html) feature for CKEditor 5. + +Paste from Office allows copying content from Microsoft Word without losing any formatting. + +## Demo + +Check out the demos for the [paste from office](https://ckeditor.com/docs/ckeditor5/latest/features/pasting/paste-from-word.html#demo) and [paste from Google Docs](https://ckeditor.com/docs/ckeditor5/latest/features/pasting/paste-from-google-docs.html#demo) features. + +## Documentation + +See the [`@ckeditor/ckeditor5-paste-from-office` package](https://docs.ckeditor.com/ckeditor5/latest/api/paste-from-office.html) page in [CKEditor 5 documentation](https://docs.ckeditor.com/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js new file mode 100644 index 000000000..636610fd9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js @@ -0,0 +1,4 @@ +/*! + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var e={945:(e,t,n)=>{e.exports=n(79)("./src/clipboard.js")},704:(e,t,n)=>{e.exports=n(79)("./src/core.js")},492:(e,t,n)=>{e.exports=n(79)("./src/engine.js")},79:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{"use strict";n.r(r),n.d(r,{PasteFromOffice:()=>v});var e=n(704),t=n(945),i=n(492);function s(e,t,n,{blockElements:r,inlineObjectElements:i}){let s=n.createPositionAt(e,"forward"==t?"after":"before");return s=s.getLastMatchingPosition((({item:e})=>e.is("element")&&!r.includes(e.name)&&!i.includes(e.name)),{direction:t}),"forward"==t?s.nodeAfter:s.nodeBefore}function o(e,t){return!!e&&e.is("element")&&t.includes(e.name)}function c(e,t){if(!e.childCount)return;const n=new i.UpcastWriter(e.document),r=function(e,t){const n=t.createRangeIn(e),r=new i.Matcher({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),s=[];for(const e of n)if("elementStart"===e.type&&r.match(e.item)){const t=u(e.item);s.push({element:e.item,id:t.id,order:t.order,indent:t.indent})}return s}(e,n);if(!r.length)return;let s=null,o=1;r.forEach(((e,c)=>{const u=function(e,t){if(!e)return!0;if(e.id!==t.id)return t.indent-e.indent!=1;const n=t.element.previousSibling;if(!n)return!0;return r=n,!(r.is("element","ol")||r.is("element","ul"));var r}(r[c-1],e),f=u?null:r[c-1],m=(p=e,(d=f)?p.indent-d.indent:p.indent-1);var d,p;if(u&&(s=null,o=1),!s||0!==m){const r=function(e,t){const n=new RegExp(`@list l${e.id}:level${e.indent}\\s*({[^}]*)`,"gi"),r=/mso-level-number-format:([^;]{0,100});/gi,i=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,s=n.exec(t);let o="decimal",c="ol",a=null;if(s&&s[1]){const t=r.exec(s[1]);if(t&&t[1]&&(o=t[1].trim(),c="bullet"!==o&&"image"!==o?"ol":"ul"),"bullet"===o){const t=function(e){const t=function(e){if(e.getChild(0).is("$text"))return null;for(const t of e.getChildren()){if(!t.is("element","span"))continue;const e=t.getChild(0);return e.is("$text")?e:e.getChild(0)}return null}(e);if(!t)return null;const n=t._data;if("o"===n)return"circle";if("·"===n)return"disc";if("§"===n)return"square";return null}(e.element);t&&(o=t)}else{const e=i.exec(s[1]);e&&e[1]&&(a=parseInt(e[1]))}}return{type:c,startIndex:a,style:l(o)}}(e,t);if(s){if(e.indent>o){const e=s.getChild(s.childCount-1),t=e.getChild(e.childCount-1);s=a(r,t,n),o+=1}else if(e.indent1&&n.setAttribute("start",e.startIndex,i),i}function u(e){const t={},n=e.getStyle("mso-list");if(n){const e=n.match(/(^|\s{1,100})l(\d+)/i),r=n.match(/\s{0,100}lfo(\d+)/i),i=n.match(/\s{0,100}level(\d+)/i);e&&r&&i&&(t.id=e[2],t.order=r[1],t.indent=parseInt(i[1]))}return t}const f=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class m{constructor(e){this.document=e}isActive(e){return f.test(e)}execute(e){const t=new i.UpcastWriter(this.document),{body:n}=e._parsedData;!function(e,t){for(const n of e.getChildren())if(n.is("element","b")&&"normal"===n.getStyle("font-weight")){const r=e.getChildIndex(n);t.remove(n),t.insertChild(r,n.getChildren(),e)}}(n,t),function(e,t){for(const n of t.createRangeIn(e)){const e=n.item;if(e.is("element","li")){const n=e.getChild(0);n&&n.is("element","p")&&t.unwrapElement(n)}}}(n,t),function(e,t){const n=new i.ViewDocument(t.document.stylesProcessor),r=new i.DomConverter(n,{renderingMode:"data"}),c=r.blockElements,l=r.inlineObjectElements,a=[];for(const n of t.createRangeIn(e)){const e=n.item;if(e.is("element","br")){const n=s(e,"forward",t,{blockElements:c,inlineObjectElements:l}),r=s(e,"backward",t,{blockElements:c,inlineObjectElements:l}),i=o(n,c);(o(r,c)||i)&&a.push(e)}}for(const e of a)e.hasClass("Apple-interchange-newline")?t.remove(e):t.replace(e,t.createElement("p"))}(n,t),e.content=n}}function d(e,t){if(!e.childCount)return;const n=new i.UpcastWriter(e.document),r=function(e,t){const n=t.createRangeIn(e),r=new i.Matcher({name:/v:(.+)/}),s=[];for(const e of n){if("elementStart"!=e.type)continue;const t=e.item,n=t.previousSibling,i=n&&n.is("element")?n.name:null;r.match(t)&&t.getAttribute("o:gfxdata")&&"v:shapetype"!==i&&s.push(e.item.getAttribute("id"))}return s}(e,n);!function(e,t,n){const r=n.createRangeIn(t),s=new i.Matcher({name:"img"}),o=[];for(const t of r)if(t.item.is("element")&&s.match(t.item)){const n=t.item,r=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];r.length&&r.every((t=>e.indexOf(t)>-1))?o.push(n):n.getAttribute("src")||o.push(n)}for(const e of o)n.remove(e)}(r,e,n),function(e,t,n){const r=n.createRangeIn(t),i=[];for(const t of r)if("elementStart"==t.type&&t.item.is("element","v:shape")){const n=t.item.getAttribute("id");if(e.includes(n))continue;s(t.item.parent.getChildren(),n)||i.push(t.item)}for(const e of i){const t={src:o(e)};e.hasAttribute("alt")&&(t.alt=e.getAttribute("alt"));const r=n.createElement("img",t);n.insertChild(e.index+1,r,e.parent)}function s(e,t){for(const n of e)if(n.is("element")){if("img"==n.name&&n.getAttribute("v:shapes")==t)return!0;if(s(n.getChildren(),t))return!0}return!1}function o(e){for(const t of e.getChildren())if(t.is("element")&&t.getAttribute("src"))return t.getAttribute("src")}}(r,e,n),function(e,t){const n=t.createRangeIn(e),r=new i.Matcher({name:/v:(.+)/}),s=[];for(const e of n)"elementStart"==e.type&&r.match(e.item)&&s.push(e.item);for(const e of s)t.remove(e)}(e,n);const s=function(e,t){const n=t.createRangeIn(e),r=new i.Matcher({name:"img"}),s=[];for(const e of n)e.item.is("element")&&r.match(e.item)&&e.item.getAttribute("src").startsWith("file://")&&s.push(e.item);return s}(e,n);s.length&&function(e,t,n){if(e.length===t.length)for(let r=0;rString.fromCharCode(parseInt(e,16)))).join(""))}const g=//i,h=/xmlns:o="urn:schemas-microsoft-com/i;class b{constructor(e){this.document=e}isActive(e){return g.test(e)||h.test(e)}execute(e){const{body:t,stylesString:n}=e._parsedData;c(t,n),d(t,e.dataTransfer.getData("text/rtf")),e.content=t}}function y(e){return e.replace(/(\s+)<\/span>/g,((e,t)=>1===t.length?" ":Array(t.length+1).join("  ").substr(0,t.length)))}function w(e,t){const n=new DOMParser,r=function(e){return y(y(e)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(e){const t="",n="",r=e.indexOf(t);if(r<0)return e;const i=e.indexOf(n,r+t.length);return e.substring(0,r+t.length)+(i>=0?e.substring(i):"")}(e=e.replace(/

      [

      ]

      -->

      + // starting content --> after `modifySelection` --> after `deleteContent`. + const doNotResetEntireContent = selection.isCollapsed; + // Try to extend the selection in the specified direction. + if (selection.isCollapsed) { + model.modifySelection(selection, { + direction: this.direction, + unit: options.unit, + treatEmojiAsSingleUnit: true + }); + } + // Check if deleting in an empty editor. See #61. + if (this._shouldEntireContentBeReplacedWithParagraph(sequence)) { + this._replaceEntireContentWithParagraph(writer); + return; + } + // Check if deleting in the first empty block. + // See https://github.com/ckeditor/ckeditor5/issues/8137. + if (this._shouldReplaceFirstBlockWithParagraph(selection, sequence)) { + this.editor.execute('paragraph', { selection }); + return; + } + // If selection is still collapsed, then there's nothing to delete. + if (selection.isCollapsed) { + return; + } + let changeCount = 0; + selection.getFirstRange().getMinimalFlatRanges().forEach(range => { + changeCount += count(range.getWalker({ singleCharacters: true, ignoreElementEnd: true, shallow: true })); + }); + // @if CK_DEBUG_TYPING // if ( window.logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( '%c[DeleteCommand]%c Delete content', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // `[${ selection.getFirstPosition().path }]-[${ selection.getLastPosition().path }]`, options + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + model.deleteContent(selection, { + doNotResetEntireContent, + direction: this.direction + }); + this._buffer.input(changeCount); + writer.setSelection(selection); + this._buffer.unlock(); + }); + } + /** + * If the user keeps Backspace or Delete key pressed, the content of the current + * editable will be cleared. However, this will not yet lead to resetting the remaining block to a paragraph + * (which happens e.g. when the user does Ctrl + A, Backspace). + * + * But, if the user pressed the key in an empty editable for the first time, + * we want to replace the entire content with a paragraph if: + * + * * the current limit element is empty, + * * the paragraph is allowed in the limit element, + * * the limit doesn't already have a paragraph inside. + * + * See https://github.com/ckeditor/ckeditor5-typing/issues/61. + * + * @private + * @param {Number} sequence A number describing which subsequent delete event it is without the key being released. + * @returns {Boolean} + */ + _shouldEntireContentBeReplacedWithParagraph(sequence) { + // Does nothing if user pressed and held the "Backspace" or "Delete" key. + if (sequence > 1) { + return false; + } + const model = this.editor.model; + const doc = model.document; + const selection = doc.selection; + const limitElement = model.schema.getLimitElement(selection); + // If a collapsed selection contains the whole content it means that the content is empty + // (from the user perspective). + const limitElementIsEmpty = selection.isCollapsed && selection.containsEntireContent(limitElement); + if (!limitElementIsEmpty) { + return false; + } + if (!model.schema.checkChild(limitElement, 'paragraph')) { + return false; + } + const limitElementFirstChild = limitElement.getChild(0); + // Does nothing if the limit element already contains only a paragraph. + // We ignore the case when paragraph might have some inline elements (

      []

      ) + // because we don't support such cases yet and it's unclear whether inlineWidget shouldn't be a limit itself. + if (limitElementFirstChild && limitElementFirstChild.is('element', 'paragraph')) { + return false; + } + return true; + } + /** + * The entire content is replaced with the paragraph. Selection is moved inside the paragraph. + * + * @private + * @param {module:engine/model/writer~Writer} writer The model writer. + */ + _replaceEntireContentWithParagraph(writer) { + const model = this.editor.model; + const doc = model.document; + const selection = doc.selection; + const limitElement = model.schema.getLimitElement(selection); + const paragraph = writer.createElement('paragraph'); + writer.remove(writer.createRangeIn(limitElement)); + writer.insert(paragraph, limitElement); + writer.setSelection(paragraph, 0); + } + /** + * Checks if the selection is inside an empty element that is the first child of the limit element + * and should be replaced with a paragraph. + * + * @private + * @param {module:engine/model/selection~Selection} selection The selection. + * @param {Number} sequence A number describing which subsequent delete event it is without the key being released. + * @returns {Boolean} + */ + _shouldReplaceFirstBlockWithParagraph(selection, sequence) { + const model = this.editor.model; + // Does nothing if user pressed and held the "Backspace" key or it was a "Delete" button. + if (sequence > 1 || this.direction != 'backward') { + return false; + } + if (!selection.isCollapsed) { + return false; + } + const position = selection.getFirstPosition(); + const limitElement = model.schema.getLimitElement(position); + const limitElementFirstChild = limitElement.getChild(0); + // Only elements that are direct children of the limit element can be replaced. + // Unwrapping from a block quote should be handled in a dedicated feature. + if (position.parent != limitElementFirstChild) { + return false; + } + // A block should be replaced only if it was empty. + if (!selection.containsEntireContent(limitElementFirstChild)) { + return false; + } + // Replace with a paragraph only if it's allowed there. + if (!model.schema.checkChild(limitElement, 'paragraph')) { + return false; + } + // Does nothing if the limit element already contains only a paragraph. + if (limitElementFirstChild.name == 'paragraph') { + return false; + } + return true; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/deleteobserver.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/deleteobserver.js new file mode 100644 index 000000000..bbc3f9a1b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/deleteobserver.js @@ -0,0 +1,220 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/deleteobserver + */ +import { env, keyCodes } from '@ckeditor/ckeditor5-utils'; +import { BubblingEventInfo, DomEventData, Observer } from '@ckeditor/ckeditor5-engine'; +const DELETE_CHARACTER = 'character'; +const DELETE_WORD = 'word'; +const DELETE_CODE_POINT = 'codePoint'; +const DELETE_SELECTION = 'selection'; +const DELETE_BACKWARD = 'backward'; +const DELETE_FORWARD = 'forward'; +const DELETE_EVENT_TYPES = { + // --------------------------------------- Backward delete types ----------------------------------------------------- + // This happens in Safari on Mac when some content is selected and Ctrl + K is pressed. + deleteContent: { + unit: DELETE_SELECTION, + // According to the Input Events Level 2 spec, this delete type has no direction + // but to keep things simple, let's default to backward. + direction: DELETE_BACKWARD + }, + // Chrome and Safari on Mac: Backspace or Ctrl + H + deleteContentBackward: { + // This kind of deletions must be done on the code point-level instead of target range provided by the DOM beforeinput event. + // Take for instance "👨‍👩‍👧‍👧", it equals: + // + // * [ "👨", "ZERO WIDTH JOINER", "👩", "ZERO WIDTH JOINER", "👧", "ZERO WIDTH JOINER", "👧" ] + // * or simply "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}" + // + // The range provided by the browser would cause the entire multi-byte grapheme to disappear while the user + // intention when deleting backwards ("👨‍👩‍👧‍👧[]", then backspace) is gradual "decomposition" (first to "👨‍👩‍👧‍[]", + // then to "👨‍👩‍[]", etc.). + // + // * "👨‍👩‍👧‍👧[]" + backward delete (by code point) -> results in "👨‍👩‍👧[]", removed the last "👧" 👍 + // * "👨‍👩‍👧‍👧[]" + backward delete (by character) -> results in "[]", removed the whole grapheme 👎 + // + // Deleting by code-point is simply a better UX. See "deleteContentForward" to learn more. + unit: DELETE_CODE_POINT, + direction: DELETE_BACKWARD + }, + // On Mac: Option + Backspace. + // On iOS: Hold the backspace for a while and the whole words will start to disappear. + deleteWordBackward: { + unit: DELETE_WORD, + direction: DELETE_BACKWARD + }, + // Safari on Mac: Cmd + Backspace + deleteHardLineBackward: { + unit: DELETE_SELECTION, + direction: DELETE_BACKWARD + }, + // Chrome on Mac: Cmd + Backspace. + deleteSoftLineBackward: { + unit: DELETE_SELECTION, + direction: DELETE_BACKWARD + }, + // --------------------------------------- Forward delete types ----------------------------------------------------- + // Chrome on Mac: Fn + Backspace or Ctrl + D + // Safari on Mac: Ctrl + K or Ctrl + D + deleteContentForward: { + // Unlike backward delete, this delete must be performed by character instead of by code point, which + // provides the best UX for working with accented letters. + // Take, for example "b̂" ("\u0062\u0302", or [ "LATIN SMALL LETTER B", "COMBINING CIRCUMFLEX ACCENT" ]): + // + // * "b̂[]" + backward delete (by code point) -> results in "b[]", removed the combining mark 👍 + // * "[]b̂" + forward delete (by code point) -> results in "[]^", a bare combining mark does that not make sense when alone 👎 + // * "[]b̂" + forward delete (by character) -> results in "[]", removed both "b" and the combining mark 👍 + // + // See: "deleteContentBackward" to learn more. + unit: DELETE_CHARACTER, + direction: DELETE_FORWARD + }, + // On Mac: Fn + Option + Backspace. + deleteWordForward: { + unit: DELETE_WORD, + direction: DELETE_FORWARD + }, + // Chrome on Mac: Ctrl + K (you have to disable the Link plugin first, though, because it uses the same keystroke) + // This is weird that it does not work in Safari on Mac despite being listed in the official shortcuts listing + // on Apple's webpage. + deleteHardLineForward: { + unit: DELETE_SELECTION, + direction: DELETE_FORWARD + }, + // At this moment there is no known way to trigger this event type but let's keep it for the symmetry with + // deleteSoftLineBackward. + deleteSoftLineForward: { + unit: DELETE_SELECTION, + direction: DELETE_FORWARD + } +}; +/** + * Delete observer introduces the {@link module:engine/view/document~Document#event:delete} event. + * + * @extends module:engine/view/observer/observer~Observer + */ +export default class DeleteObserver extends Observer { + /** + * @inheritDoc + */ + constructor(view) { + super(view); + const document = view.document; + // It matters how many subsequent deletions were made, e.g. when the backspace key was pressed and held + // by the user for some time. For instance, if such scenario ocurred and the heading the selection was + // anchored to was the only content of the editor, it will not be converted into a paragraph (the user + // wanted to clean it up, not remove it, it's about UX). Check out the DeleteCommand implementation to learn more. + // + // Fun fact: Safari on Mac won't fire beforeinput for backspace in an empty heading (only content). + let sequence = 0; + document.on('keydown', () => { + sequence++; + }); + document.on('keyup', () => { + sequence = 0; + }); + document.on('beforeinput', (evt, data) => { + if (!this.isEnabled) { + return; + } + const { targetRanges, domEvent, inputType } = data; + const deleteEventSpec = DELETE_EVENT_TYPES[inputType]; + if (!deleteEventSpec) { + return; + } + const deleteData = { + direction: deleteEventSpec.direction, + unit: deleteEventSpec.unit, + sequence + }; + if (deleteData.unit == DELETE_SELECTION) { + deleteData.selectionToRemove = view.createSelection(targetRanges[0]); + } + // The default deletion unit for deleteContentBackward is a single code point + // but on Android it sometimes passes a wider target range, so we need to change + // the unit of deletion to include the whole range to be removed and not a single code point. + if (env.isAndroid && inputType === 'deleteContentBackward') { + // On Android, deleteContentBackward has sequence 1 by default. + deleteData.sequence = 1; + // IME wants more than a single character to be removed. + if (targetRanges.length == 1 && (targetRanges[0].start.parent != targetRanges[0].end.parent || + targetRanges[0].start.offset + 1 != targetRanges[0].end.offset)) { + deleteData.unit = DELETE_SELECTION; + deleteData.selectionToRemove = view.createSelection(targetRanges); + } + } + const eventInfo = new BubblingEventInfo(document, 'delete', targetRanges[0]); + document.fire(eventInfo, new DomEventData(view, domEvent, deleteData)); + // Stop the beforeinput event if `delete` event was stopped. + // https://github.com/ckeditor/ckeditor5/issues/753 + if (eventInfo.stop.called) { + evt.stop(); + } + }); + // TODO: to be removed when https://bugs.chromium.org/p/chromium/issues/detail?id=1365311 is solved. + if (env.isBlink) { + enableChromeWorkaround(this); + } + } + /** + * @inheritDoc + */ + observe() { } +} +// Enables workaround for the issue https://github.com/ckeditor/ckeditor5/issues/11904. +function enableChromeWorkaround(observer) { + const view = observer.view; + const document = view.document; + let pressedKeyCode = null; + let beforeInputReceived = false; + document.on('keydown', (evt, { keyCode }) => { + pressedKeyCode = keyCode; + beforeInputReceived = false; + }); + document.on('keyup', (evt, { keyCode, domEvent }) => { + const selection = document.selection; + const shouldFireDeleteEvent = observer.isEnabled && + keyCode == pressedKeyCode && + isDeleteKeyCode(keyCode) && + !selection.isCollapsed && + !beforeInputReceived; + pressedKeyCode = null; + if (shouldFireDeleteEvent) { + const targetRange = selection.getFirstRange(); + const eventInfo = new BubblingEventInfo(document, 'delete', targetRange); + const deleteData = { + unit: DELETE_SELECTION, + direction: getDeleteDirection(keyCode), + selectionToRemove: selection + }; + document.fire(eventInfo, new DomEventData(view, domEvent, deleteData)); + } + }); + document.on('beforeinput', (evt, { inputType }) => { + const deleteEventSpec = DELETE_EVENT_TYPES[inputType]; + const isMatchingBeforeInput = isDeleteKeyCode(pressedKeyCode) && + deleteEventSpec && + deleteEventSpec.direction == getDeleteDirection(pressedKeyCode); + if (isMatchingBeforeInput) { + beforeInputReceived = true; + } + }, { priority: 'high' }); + document.on('beforeinput', (evt, { inputType, data }) => { + const shouldIgnoreBeforeInput = pressedKeyCode == keyCodes.delete && + inputType == 'insertText' && + data == '\x7f'; // Delete character :P + if (shouldIgnoreBeforeInput) { + evt.stop(); + } + }, { priority: 'high' }); + function isDeleteKeyCode(keyCode) { + return keyCode == keyCodes.backspace || keyCode == keyCodes.delete; + } + function getDeleteDirection(keyCode) { + return keyCode == keyCodes.backspace ? DELETE_BACKWARD : DELETE_FORWARD; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/index.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/index.js new file mode 100644 index 000000000..4d565a060 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/index.js @@ -0,0 +1,16 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing + */ +export { default as Typing } from './typing'; +export { default as Input } from './input'; +export { default as Delete } from './delete'; +export { default as TextWatcher } from './textwatcher'; +export { default as TwoStepCaretMovement } from './twostepcaretmovement'; +export { default as TextTransformation } from './texttransformation'; +export { default as inlineHighlight } from './utils/inlinehighlight'; +export { default as findAttributeRange } from './utils/findattributerange'; +export { default as getLastTextLine } from './utils/getlasttextline'; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/input.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/input.js new file mode 100644 index 000000000..50dbe3005 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/input.js @@ -0,0 +1,140 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/input + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import { env } from '@ckeditor/ckeditor5-utils'; +import InsertTextCommand from './inserttextcommand'; +import InsertTextObserver from './inserttextobserver'; +// Import config.typing declaration. +import './typingconfig'; +/** + * Handles text input coming from the keyboard or other input methods. + * + * @extends module:core/plugin~Plugin + */ +export default class Input extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'Input'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const model = editor.model; + const view = editor.editing.view; + const modelSelection = model.document.selection; + view.addObserver(InsertTextObserver); + // TODO The above default configuration value should be defined using editor.config.define() once it's fixed. + const insertTextCommand = new InsertTextCommand(editor, editor.config.get('typing.undoStep') || 20); + // Register `insertText` command and add `input` command as an alias for backward compatibility. + editor.commands.add('insertText', insertTextCommand); + editor.commands.add('input', insertTextCommand); + this.listenTo(view.document, 'insertText', (evt, data) => { + // Rendering is disabled while composing so prevent events that will be rendered by the engine + // and should not be applied by the browser. + if (!view.document.isComposing) { + data.preventDefault(); + } + const { text, selection: viewSelection, resultRange: viewResultRange } = data; + // If view selection was specified, translate it to model selection. + const modelRanges = Array.from(viewSelection.getRanges()).map(viewRange => { + return editor.editing.mapper.toModelRange(viewRange); + }); + let insertText = text; + // Typing in English on Android is firing composition events for the whole typed word. + // We need to check the target range text to only apply the difference. + if (env.isAndroid) { + const selectedText = Array.from(modelRanges[0].getItems()).reduce((rangeText, node) => { + return rangeText + (node.is('$textProxy') ? node.data : ''); + }, ''); + if (selectedText) { + if (selectedText.length <= insertText.length) { + if (insertText.startsWith(selectedText)) { + insertText = insertText.substring(selectedText.length); + modelRanges[0].start = modelRanges[0].start.getShiftedBy(selectedText.length); + } + } + else { + if (selectedText.startsWith(insertText)) { + // TODO this should be mapped as delete? + modelRanges[0].start = modelRanges[0].start.getShiftedBy(insertText.length); + insertText = ''; + } + } + } + } + const insertTextCommandData = { + text: insertText, + selection: model.createSelection(modelRanges) + }; + // @if CK_DEBUG_TYPING // if ( window.logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( '%c[Input]%c Execute insertText:', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // insertText, + // @if CK_DEBUG_TYPING // `[${ modelRanges[ 0 ].start.path }]-[${ modelRanges[ 0 ].end.path }]` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + if (viewResultRange) { + insertTextCommandData.resultRange = editor.editing.mapper.toModelRange(viewResultRange); + } + editor.execute('insertText', insertTextCommandData); + }); + if (env.isAndroid) { + // On Android with English keyboard, the composition starts just by putting caret + // at the word end or by selecting a table column. This is not a real composition started. + // Trigger delete content on first composition key pressed. + this.listenTo(view.document, 'keydown', (evt, data) => { + if (modelSelection.isCollapsed || data.keyCode != 229 || !view.document.isComposing) { + return; + } + // @if CK_DEBUG_TYPING // if ( window.logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( '%c[Input]%c KeyDown 229 -> model.deleteContent()', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // `[${ modelSelection.getFirstPosition().path }]-[${ modelSelection.getLastPosition().path }]` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + deleteSelectionContent(model, insertTextCommand); + }); + } + else { + // Note: The priority must precede the CompositionObserver handler to call it before + // the renderer is blocked, because we want to render this change. + this.listenTo(view.document, 'compositionstart', () => { + if (modelSelection.isCollapsed) { + return; + } + // @if CK_DEBUG_TYPING // if ( window.logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( '%c[Input]%c Composition start -> model.deleteContent()', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // `[${ modelSelection.getFirstPosition().path }]-[${ modelSelection.getLastPosition().path }]` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + deleteSelectionContent(model, insertTextCommand); + }); + } + } +} +function deleteSelectionContent(model, insertTextCommand) { + // By relying on the state of the input command we allow disabling the entire input easily + // by just disabling the input command. We could’ve used here the delete command but that + // would mean requiring the delete feature which would block loading one without the other. + // We could also check the editor.isReadOnly property, but that wouldn't allow to block + // the input without blocking other features. + if (!insertTextCommand.isEnabled) { + return; + } + const buffer = insertTextCommand.buffer; + buffer.lock(); + model.enqueueChange(buffer.batch, () => { + model.deleteContent(model.document.selection); + }); + buffer.unlock(); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/inserttextcommand.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/inserttextcommand.js new file mode 100644 index 000000000..7d796fc5c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/inserttextcommand.js @@ -0,0 +1,96 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/inserttextcommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +import ChangeBuffer from './utils/changebuffer'; +/** + * The insert text command. Used by the {@link module:typing/input~Input input feature} to handle typing. + * + * @extends module:core/command~Command + */ +export default class InsertTextCommand extends Command { + /** + * Creates an instance of the command. + * + * @param {module:core/editor/editor~Editor} editor + * @param {Number} undoStepSize The maximum number of atomic changes + * which can be contained in one batch in the command buffer. + */ + constructor(editor, undoStepSize) { + super(editor); + /** + * Typing's change buffer used to group subsequent changes into batches. + * + * @readonly + * @private + * @member {module:typing/utils/changebuffer~ChangeBuffer} #_buffer + */ + this._buffer = new ChangeBuffer(editor.model, undoStepSize); + } + /** + * The current change buffer. + * + * @type {module:typing/utils/changebuffer~ChangeBuffer} + */ + get buffer() { + return this._buffer; + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this._buffer.destroy(); + } + /** + * Executes the input command. It replaces the content within the given range with the given text. + * Replacing is a two step process, first the content within the range is removed and then the new text is inserted + * at the beginning of the range (which after the removal is a collapsed range). + * + * @fires execute + * @param {Object} [options] The command options. + * @param {String} [options.text=''] The text to be inserted. + * @param {module:engine/model/selection~Selection} [options.selection] The selection in which the text is inserted. + * Inserting a text into a selection deletes the current content within selection ranges. If the selection is not specified, + * the current selection in the model will be used instead. + * // TODO note that those 2 options are exclusive (either selection or range) + * @param {module:engine/model/range~Range} [options.range] The range in which the text is inserted. Defaults + * to the first range in the current selection. + * @param {module:engine/model/range~Range} [options.resultRange] The range where the selection + * should be placed after the insertion. If not specified, the selection will be placed right after + * the inserted text. + */ + execute(options = {}) { + const model = this.editor.model; + const doc = model.document; + const text = options.text || ''; + const textInsertions = text.length; + let selection = doc.selection; + if (options.selection) { + selection = options.selection; + } + else if (options.range) { + selection = model.createSelection(options.range); + } + const resultRange = options.resultRange; + model.enqueueChange(this._buffer.batch, writer => { + this._buffer.lock(); + model.deleteContent(selection); + if (text) { + model.insertContent(writer.createText(text, doc.selection.getAttributes()), selection); + } + if (resultRange) { + writer.setSelection(resultRange); + } + else if (!selection.is('documentSelection')) { + writer.setSelection(selection); + } + this._buffer.unlock(); + this._buffer.input(textInsertions); + }); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/inserttextobserver.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/inserttextobserver.js new file mode 100644 index 000000000..d091b4176 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/inserttextobserver.js @@ -0,0 +1,102 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/inserttextobserver + */ +import { env, EventInfo } from '@ckeditor/ckeditor5-utils'; +import { DomEventData, Observer } from '@ckeditor/ckeditor5-engine'; +const TYPING_INPUT_TYPES = [ + // For collapsed range: + // - This one is a regular typing (all browsers, all systems). + // - This one is used by Chrome when typing accented letter – 2nd step when the user selects the accent (Mac). + // For non-collapsed range: + // - This one is used by Chrome when typing accented letter – when the selection box first appears (Mac). + // - This one is used by Safari when accepting spell check suggestions from the context menu (Mac). + 'insertText', + // This one is used by Safari when typing accented letter (Mac). + // This one is used by Safari when accepting spell check suggestions from the autocorrection pop-up (Mac). + 'insertReplacementText' +]; +/** + * Text insertion observer introduces the {@link module:engine/view/document~Document#event:insertText} event. + * + * @extends module:engine/view/observer/observer~Observer + */ +export default class InsertTextObserver extends Observer { + /** + * @inheritDoc + */ + constructor(view) { + super(view); + // On Android composition events should immediately be applied to the model. Rendering is not disabled. + // On non-Android the model is updated only on composition end. + // On Android we can't rely on composition start/end to update model. + if (env.isAndroid) { + TYPING_INPUT_TYPES.push('insertCompositionText'); + } + const viewDocument = view.document; + viewDocument.on('beforeinput', (evt, data) => { + if (!this.isEnabled) { + return; + } + const { data: text, targetRanges, inputType, domEvent } = data; + if (!TYPING_INPUT_TYPES.includes(inputType)) { + return; + } + const eventInfo = new EventInfo(viewDocument, 'insertText'); + viewDocument.fire(eventInfo, new DomEventData(view, domEvent, { + text, + selection: view.createSelection(targetRanges) + })); + // Stop the beforeinput event if `delete` event was stopped. + // https://github.com/ckeditor/ckeditor5/issues/753 + if (eventInfo.stop.called) { + evt.stop(); + } + }); + // Note: The priority must be lower than the CompositionObserver handler to call it after the renderer is unblocked. + viewDocument.on('compositionend', (evt, { data, domEvent }) => { + // On Android composition events are immediately applied to the model. + // On non-Android the model is updated only on composition end. + // On Android we can't rely on composition start/end to update model. + if (!this.isEnabled || env.isAndroid) { + return; + } + // In case of aborted composition. + if (!data) { + return; + } + // @if CK_DEBUG_TYPING // if ( window.logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( `%c[InsertTextObserver]%c Fire insertText event, text: ${ JSON.stringify( data ) }`, + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + // How do we know where to insert the composed text? + // The selection observer is blocked and the view is not updated with the composition changes. + // There were three options: + // - Store the selection on `compositionstart` and use it now. This wouldn't work in RTC + // where the view would change and the stored selection might get incorrect. + // We'd need to fallback to the current view selection anyway. + // - Use the current view selection. This is a bit weird and non-intuitive because + // this isn't necessarily the selection on which the user started composing. + // We cannot even know whether it's still collapsed (there might be some weird + // editor feature that changed it in unpredictable ways for us). But it's by far + // the simplest solution and should be stable (the selection is definitely correct) + // and probably mostly predictable (features usually don't modify the selection + // unless called explicitly by the user). + // - Try to follow it from the `beforeinput` events. This would be really complex as each + // `beforeinput` would come with just the range it's changing and we'd need to calculate that. + // We decided to go with the 2nd option for its simplicity and stability. + viewDocument.fire('insertText', new DomEventData(view, domEvent, { + text: data, + selection: viewDocument.selection + })); + }, { priority: 'lowest' }); + } + /** + * @inheritDoc + */ + observe() { } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/texttransformation.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/texttransformation.js new file mode 100644 index 000000000..7b32629e1 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/texttransformation.js @@ -0,0 +1,236 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/texttransformation + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import TextWatcher from './textwatcher'; +import { escapeRegExp } from 'lodash-es'; +// All named transformations. +const TRANSFORMATIONS = { + // Common symbols: + copyright: { from: '(c)', to: '©' }, + registeredTrademark: { from: '(r)', to: '®' }, + trademark: { from: '(tm)', to: '™' }, + // Mathematical: + oneHalf: { from: /(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i, to: [null, '½', null] }, + oneThird: { from: /(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i, to: [null, '⅓', null] }, + twoThirds: { from: /(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i, to: [null, '⅔', null] }, + oneForth: { from: /(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i, to: [null, '¼', null] }, + threeQuarters: { from: /(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i, to: [null, '¾', null] }, + lessThanOrEqual: { from: '<=', to: '≤' }, + greaterThanOrEqual: { from: '>=', to: '≥' }, + notEqual: { from: '!=', to: '≠' }, + arrowLeft: { from: '<-', to: '←' }, + arrowRight: { from: '->', to: '→' }, + // Typography: + horizontalEllipsis: { from: '...', to: '…' }, + enDash: { from: /(^| )(--)( )$/, to: [null, '–', null] }, + emDash: { from: /(^| )(---)( )$/, to: [null, '—', null] }, + // Quotations: + // English, US + quotesPrimary: { from: buildQuotesRegExp('"'), to: [null, '“', null, '”'] }, + quotesSecondary: { from: buildQuotesRegExp('\''), to: [null, '‘', null, '’'] }, + // English, UK + quotesPrimaryEnGb: { from: buildQuotesRegExp('\''), to: [null, '‘', null, '’'] }, + quotesSecondaryEnGb: { from: buildQuotesRegExp('"'), to: [null, '“', null, '”'] }, + // Polish + quotesPrimaryPl: { from: buildQuotesRegExp('"'), to: [null, '„', null, '”'] }, + quotesSecondaryPl: { from: buildQuotesRegExp('\''), to: [null, '‚', null, '’'] } +}; +// Transformation groups. +const TRANSFORMATION_GROUPS = { + symbols: ['copyright', 'registeredTrademark', 'trademark'], + mathematical: [ + 'oneHalf', 'oneThird', 'twoThirds', 'oneForth', 'threeQuarters', + 'lessThanOrEqual', 'greaterThanOrEqual', 'notEqual', + 'arrowLeft', 'arrowRight' + ], + typography: ['horizontalEllipsis', 'enDash', 'emDash'], + quotes: ['quotesPrimary', 'quotesSecondary'] +}; +// A set of default transformations provided by the feature. +const DEFAULT_TRANSFORMATIONS = [ + 'symbols', + 'mathematical', + 'typography', + 'quotes' +]; +/** + * The text transformation plugin. + * + * @extends module:core/plugin~Plugin + */ +export default class TextTransformation extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return ['Delete', 'Input']; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'TextTransformation'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + editor.config.define('typing', { + transformations: { + include: DEFAULT_TRANSFORMATIONS + } + }); + } + /** + * @inheritDoc + */ + init() { + const model = this.editor.model; + const modelSelection = model.document.selection; + modelSelection.on('change:range', () => { + // Disable plugin when selection is inside a code block. + this.isEnabled = !modelSelection.anchor.parent.is('element', 'codeBlock'); + }); + this._enableTransformationWatchers(); + } + /** + * Create new TextWatcher listening to the editor for typing and selection events. + * + * @private + */ + _enableTransformationWatchers() { + const editor = this.editor; + const model = editor.model; + const deletePlugin = editor.plugins.get('Delete'); + const normalizedTransformations = normalizeTransformations(editor.config.get('typing.transformations')); + const testCallback = (text) => { + for (const normalizedTransformation of normalizedTransformations) { + const from = normalizedTransformation.from; + const match = from.test(text); + if (match) { + return { normalizedTransformation }; + } + } + }; + const watcher = new TextWatcher(editor.model, testCallback); + watcher.on('matched:data', (evt, data) => { + if (!data.batch.isTyping) { + return; + } + const { from, to } = data.normalizedTransformation; + const matches = from.exec(data.text); + const replaces = to(matches.slice(1)); + const matchedRange = data.range; + let changeIndex = matches.index; + model.enqueueChange(writer => { + for (let i = 1; i < matches.length; i++) { + const match = matches[i]; + const replaceWith = replaces[i - 1]; + if (replaceWith == null) { + changeIndex += match.length; + continue; + } + const replacePosition = matchedRange.start.getShiftedBy(changeIndex); + const replaceRange = model.createRange(replacePosition, replacePosition.getShiftedBy(match.length)); + const attributes = getTextAttributesAfterPosition(replacePosition); + model.insertContent(writer.createText(replaceWith, attributes), replaceRange); + changeIndex += replaceWith.length; + } + model.enqueueChange(() => { + deletePlugin.requestUndoOnBackspace(); + }); + }); + }); + watcher.bind('isEnabled').to(this); + } +} +// Normalizes the configuration `from` parameter value. +// The normalized value for the `from` parameter is a RegExp instance. If the passed `from` is already a RegExp instance, +// it is returned unchanged. +// +// @param {String|RegExp} from +// @returns {RegExp} +function normalizeFrom(from) { + if (typeof from == 'string') { + return new RegExp(`(${escapeRegExp(from)})$`); + } + // `from` is already a regular expression. + return from; +} +// Normalizes the configuration `to` parameter value. +// The normalized value for the `to` parameter is a function that takes an array and returns an array. See more in the +// configuration description. If the passed `to` is already a function, it is returned unchanged. +// +// @param {String|Array.|Function} to +// @returns {Function} +function normalizeTo(to) { + if (typeof to == 'string') { + return () => [to]; + } + else if (to instanceof Array) { + return () => to; + } + // `to` is already a function. + return to; +} +// For given `position` returns attributes for the text that is after that position. +// The text can be in the same text node as the position (`foo[]bar`) or in the next text node (`foo[]<$text bold="true">bar`). +// +// @param {module:engine/model/position~Position} position +// @returns {Iterable.<*>} +function getTextAttributesAfterPosition(position) { + const textNode = position.textNode ? position.textNode : position.nodeAfter; + return textNode.getAttributes(); +} +// Returns a RegExp pattern string that detects a sentence inside a quote. +// +// @param {String} quoteCharacter The character to create a pattern for. +// @returns {String} +function buildQuotesRegExp(quoteCharacter) { + return new RegExp(`(^|\\s)(${quoteCharacter})([^${quoteCharacter}]*)(${quoteCharacter})$`); +} +// Reads text transformation config and returns normalized array of transformations objects. +// +// @param {module:typing/texttransformation~TextTransformationDescription} config +// @returns {Array.<{from:String,to:Function}>} +function normalizeTransformations(config) { + const extra = config.extra || []; + const remove = config.remove || []; + const isNotRemoved = (transformation) => !remove.includes(transformation); + const configured = config.include.concat(extra).filter(isNotRemoved); + return expandGroupsAndRemoveDuplicates(configured) + .filter(isNotRemoved) // Filter out 'remove' transformations as they might be set in group. + .map(transformation => (typeof transformation == 'string' && TRANSFORMATIONS[transformation] ? TRANSFORMATIONS[transformation] : transformation)) + // Filter out transformations set as string that has not been found. + .filter((transformation) => typeof transformation === 'object') + .map(transformation => ({ + from: normalizeFrom(transformation.from), + to: normalizeTo(transformation.to) + })); +} +// Reads definitions and expands named groups if needed to transformation names. +// This method also removes duplicated named transformations if any. +// +// @param {Array.} definitions +// @returns {Array.} +function expandGroupsAndRemoveDuplicates(definitions) { + // Set is using to make sure that transformation names are not duplicated. + const definedTransformations = new Set(); + for (const transformationOrGroup of definitions) { + if (typeof transformationOrGroup == 'string' && TRANSFORMATION_GROUPS[transformationOrGroup]) { + for (const transformation of TRANSFORMATION_GROUPS[transformationOrGroup]) { + definedTransformations.add(transformation); + } + } + else { + definedTransformations.add(transformationOrGroup); + } + } + return Array.from(definedTransformations); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/textwatcher.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/textwatcher.js new file mode 100644 index 000000000..0d51d3e88 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/textwatcher.js @@ -0,0 +1,155 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/textwatcher + */ +import { ObservableMixin } from '@ckeditor/ckeditor5-utils'; +import getLastTextLine from './utils/getlasttextline'; +/** + * The text watcher feature. + * + * Fires the {@link module:typing/textwatcher~TextWatcher#event:matched:data `matched:data`}, + * {@link module:typing/textwatcher~TextWatcher#event:matched:selection `matched:selection`} and + * {@link module:typing/textwatcher~TextWatcher#event:unmatched `unmatched`} events on typing or selection changes. + * + * @private + * @mixes module:utils/observablemixin~ObservableMixin + */ +export default class TextWatcher extends ObservableMixin() { + /** + * Creates a text watcher instance. + * + * @param {module:engine/model/model~Model} model + * @param {Function} testCallback See {@link module:typing/textwatcher~TextWatcher#testCallback}. + */ + constructor(model, testCallback) { + super(); + /** + * The editor's model. + * + * @readonly + * @member {module:engine/model/model~Model} + */ + this.model = model; + /** + * The function used to match the text. + * + * The test callback can return 3 values: + * + * * `false` if there is no match, + * * `true` if there is a match, + * * an object if there is a match and we want to pass some additional information to the {@link #event:matched:data} event. + * + * @member {Function} #testCallback + * @returns {Object} testResult + */ + this.testCallback = testCallback; + /** + * Whether there is a match currently. + * + * @readonly + * @member {Boolean} + */ + this._hasMatch = false; + /** + * Flag indicating whether the `TextWatcher` instance is enabled or disabled. + * A disabled TextWatcher will not evaluate text. + * + * To disable TextWatcher: + * + * const watcher = new TextWatcher( editor.model, testCallback ); + * + * // After this a testCallback will not be called. + * watcher.isEnabled = false; + * + * @observable + * @member {Boolean} #isEnabled + */ + this.set('isEnabled', true); + // Toggle text watching on isEnabled state change. + this.on('change:isEnabled', () => { + if (this.isEnabled) { + this._startListening(); + } + else { + this.stopListening(model.document.selection); + this.stopListening(model.document); + } + }); + this._startListening(); + } + /** + * TODO + */ + get hasMatch() { + return this._hasMatch; + } + /** + * Starts listening to the editor for typing and selection events. + * + * @private + */ + _startListening() { + const model = this.model; + const document = model.document; + this.listenTo(document.selection, 'change:range', (evt, { directChange }) => { + // Indirect changes (i.e. when the user types or external changes are applied) are handled in the document's change event. + if (!directChange) { + return; + } + // Act only on collapsed selection. + if (!document.selection.isCollapsed) { + if (this.hasMatch) { + this.fire('unmatched'); + this._hasMatch = false; + } + return; + } + this._evaluateTextBeforeSelection('selection'); + }); + this.listenTo(document, 'change:data', (evt, batch) => { + if (batch.isUndo || !batch.isLocal) { + return; + } + this._evaluateTextBeforeSelection('data', { batch }); + }); + } + /** + * Checks the editor content for matched text. + * + * @fires matched:data + * @fires matched:selection + * @fires unmatched + * + * @private + * @param {'data'|'selection'} suffix A suffix used for generating the event name. + * @param {Object} data Data object for event. + */ + _evaluateTextBeforeSelection(suffix, data = {}) { + const model = this.model; + const document = model.document; + const selection = document.selection; + const rangeBeforeSelection = model.createRange(model.createPositionAt(selection.focus.parent, 0), selection.focus); + const { text, range } = getLastTextLine(rangeBeforeSelection, model); + const testResult = this.testCallback(text); + if (!testResult && this.hasMatch) { + this.fire('unmatched'); + } + this._hasMatch = !!testResult; + if (testResult) { + const eventData = Object.assign(data, { text, range }); + // If the test callback returns an object with additional data, assign the data as well. + if (typeof testResult == 'object') { + Object.assign(eventData, testResult); + } + this.fire(`matched:${suffix}`, eventData); + } + } +} +/** + * Fired whenever the text does not match anymore. Fired only when the text watcher found a match. + * + * @event unmatched + */ diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js new file mode 100644 index 000000000..96ec64d06 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js @@ -0,0 +1,429 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/twostepcaretmovement + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import { keyCodes } from '@ckeditor/ckeditor5-utils'; +/** + * This plugin enables the two-step caret (phantom) movement behavior for + * {@link module:typing/twostepcaretmovement~TwoStepCaretMovement#registerAttribute registered attributes} + * on arrow right () and left () key press. + * + * Thanks to this (phantom) caret movement the user is able to type before/after as well as at the + * beginning/end of an attribute. + * + * **Note:** This plugin support right–to–left (Arabic, Hebrew, etc.) content by mirroring its behavior + * but for the sake of simplicity examples showcase only left–to–right use–cases. + * + * # Forward movement + * + * ## "Entering" an attribute: + * + * When this plugin is enabled and registered for the `a` attribute and the selection is right before it + * (at the attribute boundary), pressing the right arrow key will not move the selection but update its + * attributes accordingly: + * + * * When enabled: + * + * foo{}<$text a="true">bar + * + * + * + * foo<$text a="true">{}bar + * + * * When disabled: + * + * foo{}<$text a="true">bar + * + * + * + * foo<$text a="true">b{}ar + * + * + * ## "Leaving" an attribute: + * + * * When enabled: + * + * <$text a="true">bar{}baz + * + * + * + * <$text a="true">bar{}baz + * + * * When disabled: + * + * <$text a="true">bar{}baz + * + * + * + * <$text a="true">barb{}az + * + * # Backward movement + * + * * When enabled: + * + * <$text a="true">bar{}baz + * + * + * + * <$text a="true">bar{}baz + * + * * When disabled: + * + * <$text a="true">bar{}baz + * + * + * + * <$text a="true">ba{}rb{}az + * + * # Multiple attributes + * + * * When enabled and many attributes starts or ends at the same position: + * + * <$text a="true" b="true">bar{}baz + * + * + * + * <$text a="true" b="true">bar{}baz + * + * * When enabled and one procedes another: + * + * <$text a="true">bar<$text b="true">{}bar + * + * + * + * <$text a="true">bar{}<$text b="true">bar + * + */ +export default class TwoStepCaretMovement extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'TwoStepCaretMovement'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + /** + * A set of attributes to handle. + * + * @protected + * @property {module:typing/twostepcaretmovement~TwoStepCaretMovement} + */ + this.attributes = new Set(); + /** + * The current UID of the overridden gravity, as returned by + * {@link module:engine/model/writer~Writer#overrideSelectionGravity}. + * + * @private + * @member {String} + */ + this._overrideUid = null; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const model = editor.model; + const view = editor.editing.view; + const locale = editor.locale; + const modelSelection = model.document.selection; + // Listen to keyboard events and handle the caret movement according to the 2-step caret logic. + this.listenTo(view.document, 'arrowKey', (evt, data) => { + // This implementation works only for collapsed selection. + if (!modelSelection.isCollapsed) { + return; + } + // When user tries to expand the selection or jump over the whole word or to the beginning/end then + // two-steps movement is not necessary. + if (data.shiftKey || data.altKey || data.ctrlKey) { + return; + } + const arrowRightPressed = data.keyCode == keyCodes.arrowright; + const arrowLeftPressed = data.keyCode == keyCodes.arrowleft; + // When neither left or right arrow has been pressed then do noting. + if (!arrowRightPressed && !arrowLeftPressed) { + return; + } + const contentDirection = locale.contentLanguageDirection; + let isMovementHandled = false; + if ((contentDirection === 'ltr' && arrowRightPressed) || (contentDirection === 'rtl' && arrowLeftPressed)) { + isMovementHandled = this._handleForwardMovement(data); + } + else { + isMovementHandled = this._handleBackwardMovement(data); + } + // Stop the keydown event if the two-step caret movement handled it. Avoid collisions + // with other features which may also take over the caret movement (e.g. Widget). + if (isMovementHandled === true) { + evt.stop(); + } + }, { context: '$text', priority: 'highest' }); + /** + * A flag indicating that the automatic gravity restoration should not happen upon the next + * gravity restoration. + * {@link module:engine/model/selection~Selection#event:change:range} event. + * + * @private + * @member {String} + */ + this._isNextGravityRestorationSkipped = false; + // The automatic gravity restoration logic. + this.listenTo(modelSelection, 'change:range', (evt, data) => { + // Skipping the automatic restoration is needed if the selection should change + // but the gravity must remain overridden afterwards. See the #handleBackwardMovement + // to learn more. + if (this._isNextGravityRestorationSkipped) { + this._isNextGravityRestorationSkipped = false; + return; + } + // Skip automatic restore when the gravity is not overridden — simply, there's nothing to restore + // at this moment. + if (!this._isGravityOverridden) { + return; + } + // Skip automatic restore when the change is indirect AND the selection is at the attribute boundary. + // It means that e.g. if the change was external (collaboration) and the user had their + // selection around the link, its gravity should remain intact in this change:range event. + if (!data.directChange && isBetweenDifferentAttributes(modelSelection.getFirstPosition(), this.attributes)) { + return; + } + this._restoreGravity(); + }); + } + /** + * Registers a given attribute for the two-step caret movement. + * + * @param {String} attribute Name of the attribute to handle. + */ + registerAttribute(attribute) { + this.attributes.add(attribute); + } + /** + * Updates the document selection and the view according to the two–step caret movement state + * when moving **forwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}. + * + * @private + * @param {module:engine/view/observer/domeventdata~DomEventData} data Data of the key press. + * @returns {Boolean} `true` when the handler prevented caret movement + */ + _handleForwardMovement(data) { + const attributes = this.attributes; + const model = this.editor.model; + const selection = model.document.selection; + const position = selection.getFirstPosition(); + // DON'T ENGAGE 2-SCM if gravity is already overridden. It means that we just entered + // + // foo<$text attribute>{}barbaz + // + // or left the attribute + // + // foo<$text attribute>bar{}baz + // + // and the gravity will be restored automatically. + if (this._isGravityOverridden) { + return false; + } + // DON'T ENGAGE 2-SCM when the selection is at the beginning of the block AND already has the + // attribute: + // * when the selection was initially set there using the mouse, + // * when the editor has just started + // + // <$text attribute>{}barbaz + // + if (position.isAtStart && hasAnyAttribute(selection, attributes)) { + return false; + } + // ENGAGE 2-SCM When at least one of the observed attributes changes its value (incl. starts, ends). + // + // foo<$text attribute>bar{}baz + // foo<$text attribute>bar{}<$text otherAttribute>baz + // foo<$text attribute=1>bar{}<$text attribute=2>baz + // foo{}<$text attribute>barbaz + // + if (isBetweenDifferentAttributes(position, attributes)) { + preventCaretMovement(data); + this._overrideGravity(); + return true; + } + return false; + } + /** + * Updates the document selection and the view according to the two–step caret movement state + * when moving **backwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}. + * + * @private + * @param {module:engine/view/observer/domeventdata~DomEventData} data Data of the key press. + * @returns {Boolean} `true` when the handler prevented caret movement + */ + _handleBackwardMovement(data) { + const attributes = this.attributes; + const model = this.editor.model; + const selection = model.document.selection; + const position = selection.getFirstPosition(); + // When the gravity is already overridden (by this plugin), it means we are on the two-step position. + // Prevent the movement, restore the gravity and update selection attributes. + // + // foo<$text attribute=1>bar<$text attribute=2>{}baz + // foo<$text attribute>bar<$text otherAttribute>{}baz + // foo<$text attribute>{}barbaz + // foo<$text attribute>bar{}baz + // + if (this._isGravityOverridden) { + preventCaretMovement(data); + this._restoreGravity(); + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + return true; + } + else { + // REMOVE SELECTION ATTRIBUTE when restoring gravity towards a non-existent content at the + // beginning of the block. + // + // {}<$text attribute>bar + // + if (position.isAtStart) { + if (hasAnyAttribute(selection, attributes)) { + preventCaretMovement(data); + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + return true; + } + return false; + } + // When we are moving from natural gravity, to the position of the 2SCM, we need to override the gravity, + // and make sure it won't be restored. Unless it's at the end of the block and an observed attribute. + // We need to check if the caret is a one position before the attribute boundary: + // + // foo<$text attribute=1>bar<$text attribute=2>b{}az + // foo<$text attribute>bar<$text otherAttribute>b{}az + // foo<$text attribute>b{}arbaz + // foo<$text attribute>barb{}az + // + if (isStepAfterAnyAttributeBoundary(position, attributes)) { + // ENGAGE 2-SCM if the selection has no attribute. This may happen when the user + // left the attribute using a FORWARD 2-SCM. + // + // <$text attribute>bar{} + // + if (position.isAtEnd && + !hasAnyAttribute(selection, attributes) && + isBetweenDifferentAttributes(position, attributes)) { + preventCaretMovement(data); + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + return true; + } + // Skip the automatic gravity restore upon the next selection#change:range event. + // If not skipped, it would automatically restore the gravity, which should remain + // overridden. + this._isNextGravityRestorationSkipped = true; + this._overrideGravity(); + // Don't return "true" here because we didn't call _preventCaretMovement. + // Returning here will destabilize the filler logic, which also listens to + // keydown (and the event would be stopped). + return false; + } + } + return false; + } + /** + * `true` when the gravity is overridden for the plugin. + * + * @readonly + * @private + * @type {Boolean} + */ + get _isGravityOverridden() { + return !!this._overrideUid; + } + /** + * Overrides the gravity using the {@link module:engine/model/writer~Writer model writer} + * and stores the information about this fact in the {@link #_overrideUid}. + * + * A shorthand for {@link module:engine/model/writer~Writer#overrideSelectionGravity}. + * + * @private + */ + _overrideGravity() { + this._overrideUid = this.editor.model.change(writer => { + return writer.overrideSelectionGravity(); + }); + } + /** + * Restores the gravity using the {@link module:engine/model/writer~Writer model writer}. + * + * A shorthand for {@link module:engine/model/writer~Writer#restoreSelectionGravity}. + * + * @private + */ + _restoreGravity() { + this.editor.model.change(writer => { + writer.restoreSelectionGravity(this._overrideUid); + this._overrideUid = null; + }); + } +} +// Checks whether the selection has any of given attributes. +// +// @param {module:engine/model/documentselection~DocumentSelection} selection +// @param {Iterable.} attributes +function hasAnyAttribute(selection, attributes) { + for (const observedAttribute of attributes) { + if (selection.hasAttribute(observedAttribute)) { + return true; + } + } + return false; +} +// Applies the given attributes to the current selection using using the +// values from the node before the current position. Uses +// the {@link module:engine/model/writer~Writer model writer}. +// +// @param {module:engine/model/model~Model} +// @param {Iterable.} attributess +// @param {module:engine/model/position~Position} position +function setSelectionAttributesFromTheNodeBefore(model, attributes, position) { + const nodeBefore = position.nodeBefore; + model.change(writer => { + if (nodeBefore) { + writer.setSelectionAttribute(nodeBefore.getAttributes()); + } + else { + writer.removeSelectionAttribute(attributes); + } + }); +} +// Prevents the caret movement in the view by calling `preventDefault` on the event data. +// +// @alias data.preventDefault +function preventCaretMovement(data) { + data.preventDefault(); +} +// Checks whether the step before `isBetweenDifferentAttributes()`. +// +// @param {module:engine/model/position~Position} position +// @param {String} attribute +function isStepAfterAnyAttributeBoundary(position, attributes) { + const positionBefore = position.getShiftedBy(-1); + return isBetweenDifferentAttributes(positionBefore, attributes); +} +// Checks whether the given position is between different values of given attributes. +// +// @param {module:engine/model/position~Position} position +// @param {Iterable.} attributes +function isBetweenDifferentAttributes(position, attributes) { + const { nodeBefore, nodeAfter } = position; + for (const observedAttribute of attributes) { + const attrBefore = nodeBefore ? nodeBefore.getAttribute(observedAttribute) : undefined; + const attrAfter = nodeAfter ? nodeAfter.getAttribute(observedAttribute) : undefined; + if (attrAfter !== attrBefore) { + return true; + } + } + return false; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/typing.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/typing.js new file mode 100644 index 000000000..2a971f5d9 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/typing.js @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/typing + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import Input from './input'; +import Delete from './delete'; +/** + * The typing feature. It handles typing. + * + * This is a "glue" plugin which loads the {@link module:typing/input~Input} and {@link module:typing/delete~Delete} + * plugins. + * + * @extends module:core/plugin~Plugin + */ +export default class Typing extends Plugin { + static get requires() { + return [Input, Delete]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Typing'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/typingconfig.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/typingconfig.js new file mode 100644 index 000000000..52f0f122b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/typingconfig.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js new file mode 100644 index 000000000..3e37d7aa8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js @@ -0,0 +1,166 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Change buffer allows to group atomic changes (like characters that have been typed) into + * {@link module:engine/model/batch~Batch batches}. + * + * Batches represent single undo steps, hence changes added to one single batch are undone together. + * + * The buffer has a configurable limit of atomic changes that it can accommodate. After the limit was + * exceeded (see {@link ~ChangeBuffer#input}), a new batch is created in {@link ~ChangeBuffer#batch}. + * + * To use the change buffer you need to let it know about the number of changes that were added to the batch: + * + * const buffer = new ChangeBuffer( model, LIMIT ); + * + * // Later on in your feature: + * buffer.batch.insert( pos, insertedCharacters ); + * buffer.input( insertedCharacters.length ); + * + */ +export default class ChangeBuffer { + /** + * Creates a new instance of the change buffer. + * + * @param {module:engine/model/model~Model} model + * @param {Number} [limit=20] The maximum number of atomic changes which can be contained in one batch. + */ + constructor(model, limit = 20) { + this._batch = null; + /** + * The model instance. + * + * @readonly + * @member {module:engine/model/model~Model} #model + */ + this.model = model; + /** + * The number of atomic changes in the buffer. Once it exceeds the {@link #limit}, + * the {@link #batch batch} is set to a new one. + * + * @readonly + * @member {Number} #size + */ + this._size = 0; + /** + * The maximum number of atomic changes which can be contained in one batch. + * + * @readonly + * @member {Number} #limit + */ + this.limit = limit; + /** + * Whether the buffer is locked. A locked buffer cannot be reset unless it gets unlocked. + * + * @readonly + * @member {Boolean} #isLocked + */ + this._isLocked = false; + // The function to be called in order to notify the buffer about batches which appeared in the document. + // The callback will check whether it is a new batch and in that case the buffer will be flushed. + // + // The reason why the buffer needs to be flushed whenever a new batch appears is that the changes added afterwards + // should be added to a new batch. For instance, when the user types, then inserts an image, and then types again, + // the characters typed after inserting the image should be added to a different batch than the characters typed before. + this._changeCallback = (evt, batch) => { + if (batch.isLocal && batch.isUndoable && batch !== this._batch) { + this._reset(true); + } + }; + this._selectionChangeCallback = () => { + this._reset(); + }; + this.model.document.on('change', this._changeCallback); + this.model.document.selection.on('change:range', this._selectionChangeCallback); + this.model.document.selection.on('change:attribute', this._selectionChangeCallback); + /** + * The current batch instance. + * + * @private + * @member #_batch + */ + /** + * The callback to document the change event which later needs to be removed. + * + * @private + * @member #_changeCallback + */ + /** + * The callback to document selection `change:attribute` and `change:range` events which resets the buffer. + * + * @private + * @member #_selectionChangeCallback + */ + } + /** + * The current batch to which a feature should add its operations. Once the {@link #size} + * is reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset. + * + * @type {module:engine/model/batch~Batch} + */ + get batch() { + if (!this._batch) { + this._batch = this.model.createBatch({ isTyping: true }); + } + return this._batch; + } + /** + * The number of atomic changes in the buffer. Once it exceeds the {@link #limit}, + * the {@link #batch batch} is set to a new one. + */ + get size() { + return this._size; + } + /** + * The input number of changes into the buffer. Once the {@link #size} is + * reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset. + * + * @param {Number} changeCount The number of atomic changes to input. + */ + input(changeCount) { + this._size += changeCount; + if (this._size >= this.limit) { + this._reset(true); + } + } + /** + * Whether the buffer is locked. A locked buffer cannot be reset unless it gets unlocked. + */ + get isLocked() { + return this._isLocked; + } + /** + * Locks the buffer. + */ + lock() { + this._isLocked = true; + } + /** + * Unlocks the buffer. + */ + unlock() { + this._isLocked = false; + } + /** + * Destroys the buffer. + */ + destroy() { + this.model.document.off('change', this._changeCallback); + this.model.document.selection.off('change:range', this._selectionChangeCallback); + this.model.document.selection.off('change:attribute', this._selectionChangeCallback); + } + /** + * Resets the change buffer. + * + * @private + * @param {Boolean} [ignoreLock] Whether internal lock {@link #isLocked} should be ignored. + */ + _reset(ignoreLock = false) { + if (!this.isLocked || ignoreLock) { + this._batch = null; + this._size = 0; + } + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js new file mode 100644 index 000000000..1a07dcd87 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js @@ -0,0 +1,39 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns a model range that covers all consecutive nodes with the same `attributeName` and its `value` + * that intersect the given `position`. + * + * It can be used e.g. to get the entire range on which the `linkHref` attribute needs to be changed when having a + * selection inside a link. + * + * @param {module:engine/model/position~Position} position The start position. + * @param {String} attributeName The attribute name. + * @param {String} value The attribute value. + * @param {module:engine/model/model~Model} model The model instance. + * @returns {module:engine/model/range~Range} The link range. + */ +export default function findAttributeRange(position, attributeName, value, model) { + return model.createRange(_findBound(position, attributeName, value, true, model), _findBound(position, attributeName, value, false, model)); +} +// Walks forward or backward (depends on the `lookBack` flag), node by node, as long as they have the same attribute value +// and returns a position just before or after (depends on the `lookBack` flag) the last matched node. +// +// @param {module:engine/model/position~Position} position The start position. +// @param {String} attributeName The attribute name. +// @param {String} value The attribute value. +// @param {Boolean} lookBack Whether the walk direction is forward (`false`) or backward (`true`). +// @returns {module:engine/model/position~Position} The position just before the last matched node. +function _findBound(position, attributeName, value, lookBack, model) { + // Get node before or after position (depends on `lookBack` flag). + // When position is inside text node then start searching from text node. + let node = position.textNode || (lookBack ? position.nodeBefore : position.nodeAfter); + let lastNode = null; + while (node && node.getAttribute(attributeName) == value) { + lastNode = node; + node = lookBack ? node.previousSibling : node.nextSibling; + } + return lastNode ? model.createPositionAt(lastNode, lookBack ? 'before' : 'after') : position; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js new file mode 100644 index 000000000..1e7f75665 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js @@ -0,0 +1,42 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns the last text line from the given range. + * + * "The last text line" is understood as text (from one or more text nodes) which is limited either by a parent block + * or by inline elements (e.g. ``). + * + * const rangeToCheck = model.createRange( + * model.createPositionAt( paragraph, 0 ), + * model.createPositionAt( paragraph, 'end' ) + * ); + * + * const { text, range } = getLastTextLine( rangeToCheck, model ); + * + * For model below, the returned `text` will be "Foo bar baz" and `range` will be set on whole `` content: + * + * Foo bar baz + * + * However, in below case, `text` will be set to "baz" and `range` will be set only on "baz". + * + * Foobarbaz + * + * @protected + * @param {module:engine/model/range~Range} range + * @param {module:engine/model/model~Model} model + * @returns {module:typing/utils/getlasttextline~LastTextLineData} + */ +export default function getLastTextLine(range, model) { + let start = range.start; + const text = Array.from(range.getItems()).reduce((rangeText, node) => { + // Trim text to a last occurrence of an inline element and update range start. + if (!(node.is('$text') || node.is('$textProxy'))) { + start = model.createPositionAfter(node); + return ''; + } + return rangeText + node.data; + }, ''); + return { text, range: model.createRange(start, range.end) }; +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js new file mode 100644 index 000000000..d33996b57 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js @@ -0,0 +1,72 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import findAttributeRange from './findattributerange'; +/** + * @module typing/utils/inlinehighlight + */ +/** + * Adds a visual highlight style to an attribute element in which the selection is anchored. + * Together with two-step caret movement, they indicate that the user is typing inside the element. + * + * Highlight is turned on by adding the given class to the attribute element in the view: + * + * * The class is removed before the conversion has started, as callbacks added with the `'highest'` priority + * to {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher} events. + * * The class is added in the view post fixer, after other changes in the model tree were converted to the view. + * + * This way, adding and removing the highlight does not interfere with conversion. + * + * Usage: + * + * import inlineHighlight from '@ckeditor/ckeditor5-typing/src/utils/inlinehighlight'; + * + * // Make `ck-link_selected` class be applied on an `a` element + * // whenever the corresponding `linkHref` attribute element is selected. + * inlineHighlight( editor, 'linkHref', 'a', 'ck-link_selected' ); + * + * @param {module:core/editor/editor~Editor} editor The editor instance. + * @param {String} attributeName The attribute name to check. + * @param {String} tagName The tagName of a view item. + * @param {String} className The class name to apply in the view. + */ +export default function inlineHighlight(editor, attributeName, tagName, className) { + const view = editor.editing.view; + const highlightedElements = new Set(); + // Adding the class. + view.document.registerPostFixer(writer => { + const selection = editor.model.document.selection; + let changed = false; + if (selection.hasAttribute(attributeName)) { + const modelRange = findAttributeRange(selection.getFirstPosition(), attributeName, selection.getAttribute(attributeName), editor.model); + const viewRange = editor.editing.mapper.toViewRange(modelRange); + // There might be multiple view elements in the `viewRange`, for example, when the `a` element is + // broken by a UIElement. + for (const item of viewRange.getItems()) { + if (item.is('element', tagName) && !item.hasClass(className)) { + writer.addClass(className, item); + highlightedElements.add(item); + changed = true; + } + } + } + return changed; + }); + // Removing the class. + editor.conversion.for('editingDowncast').add(dispatcher => { + // Make sure the highlight is removed on every possible event, before conversion is started. + dispatcher.on('insert', removeHighlight, { priority: 'highest' }); + dispatcher.on('remove', removeHighlight, { priority: 'highest' }); + dispatcher.on('attribute', removeHighlight, { priority: 'highest' }); + dispatcher.on('selection', removeHighlight, { priority: 'highest' }); + function removeHighlight() { + view.change(writer => { + for (const item of highlightedElements.values()) { + writer.removeClass(className, item); + highlightedElements.delete(item); + } + }); + } + }); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/CHANGELOG.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/CHANGELOG.md new file mode 100644 index 000000000..2b8274237 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/CHANGELOG.md @@ -0,0 +1,542 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v18.0.0...v19.0.0) (2020-04-29) + +### MAJOR BREAKING CHANGES + +* `ViewCollection` no longer has the `locale` property. +* The `ViewCollection#constructor()` no longer accepts the `locale` parameter. +* `LabeledView` component was renamed to `LabeledFieldView`. Also, its instance of a labeled component's view is available through `LabeledFieldView#fieldView`. It replaced the `LabeledView#view`. + +### MINOR BREAKING CHANGES + +* The `DropdownView#focusTracker` property has been removed as it served no purpose. + +### Features + +* Allowed defining initial items of `ViewCollection` and `BodyCollection` in the constructor. See [ckeditor/ckeditor5#6319](https://github.com/ckeditor/ckeditor5/issues/6319). ([6cd15de](https://github.com/ckeditor/ckeditor5-ui/commit/6cd15de)) + + The `View#createCollection()` method now also accepts an iterator of views. +* Introduce `FormHeaderView` UI component. Closes [ckeditor/ckeditor5#6109](https://github.com/ckeditor/ckeditor5/issues/6109). ([eb1ce18](https://github.com/ckeditor/ckeditor5-ui/commit/eb1ce18)) +* The `BlockToolbar` should group items when there is no place to show them all. Closes [ckeditor/ckeditor5#6449](https://github.com/ckeditor/ckeditor5/issues/6449). Closes [ckeditor/ckeditor5#6575](https://github.com/ckeditor/ckeditor5/issues/6575). Closes [ckeditor/ckeditor5#6570](https://github.com/ckeditor/ckeditor5/issues/6570). ([fcd9c4e](https://github.com/ckeditor/ckeditor5-ui/commit/fcd9c4e)) + + Improved `ToolbarView#maxWidth` and items grouping when the toolbar is invisible. + +### Bug fixes + +* Call `ResizeObserver.destroy()` when destroying block toolbar. ([59449d2](https://github.com/ckeditor/ckeditor5-ui/commit/59449d2)) + +### Other changes + +* Removed the obsolete `DropdownView#focusTracker`. Closes [ckeditor/ckeditor5#6548](https://github.com/ckeditor/ckeditor5/issues/6548). ([ac750c7](https://github.com/ckeditor/ckeditor5-ui/commit/ac750c7)) +* Rename `LabeledView` component to `LabeledFieldView`. See [ckeditor/ckeditor5#6110](https://github.com/ckeditor/ckeditor5/issues/6110). ([5a7aca7](https://github.com/ckeditor/ckeditor5-ui/commit/5a7aca7)) +* Updated translations. ([2a391d6](https://github.com/ckeditor/ckeditor5-ui/commit/2a391d6)) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v17.0.0...v18.0.0) (2020-03-19) + +### MAJOR BREAKING CHANGES + +* The `BalloonToolbar` plugin now groups the overflowing items by default. This can be disabled by setting [`config.balloonToolbar.shouldNotGroupWhenFull`](https://ckeditor.com/docs/ckeditor5/latest/api/module_ui_toolbar_toolbarview-ToolbarOptions.html#member-shouldGroupWhenFull) configuration to `true`. + +### Features + +* The `BalloonToolbar` plugin should group items when its width is close to related editable's width. Closes [ckeditor/ckeditor5#5597](https://github.com/ckeditor/ckeditor5/issues/5597). Closes [ckeditor/ckeditor5#5501](https://github.com/ckeditor/ckeditor5/issues/5501). ([d36fd23](https://github.com/ckeditor/ckeditor5-ui/commit/d36fd23)) + + [`BalloonPanelView.defaultPositions`](https://ckeditor.com/docs/ckeditor5/latest/api/module_ui_panel_balloon_balloonpanelview-BalloonPanelView.html#static-member-defaultPositions) has been extended with additional positions. Please refer to the documentation to learn more. + +### Other changes + +* Updated translations. ([ace38eb](https://github.com/ckeditor/ckeditor5-ui/commit/ace38eb)) + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v16.0.0...v17.0.0) (2020-02-19) + +### Features + +* Created the `LabeledView` class (see https://github.com/ckeditor/ckeditor5-table/pull/227). ([ec39406](https://github.com/ckeditor/ckeditor5-ui/commit/ec39406)) + + Also added `id` properties to the `DropdownView` and `LabelView` for compatibility with the `LabeledView`. +* Implemented the `Toolbar#isCompact` property to turn regular toolbars into compact ones (with less spacing) (see [ckeditor/ckeditor5#6112](https://github.com/ckeditor/ckeditor5/issues/6112)). ([a6b9c09](https://github.com/ckeditor/ckeditor5-ui/commit/a6b9c09)) +* Reintroduced the concept of body collections with a focus on better management of multiple editors and support for context plugins (plugins which leave outside an editor instance). Closes [ckeditor/ckeditor5#5888](https://github.com/ckeditor/ckeditor5/issues/5888). ([23d12e9](https://github.com/ckeditor/ckeditor5-ui/commit/23d12e9)) + +### Bug fixes + +* Make `BlockToolbar` work with an empty configuration. Closes [ckeditor/ckeditor5#5980](https://github.com/ckeditor/ckeditor5/issues/5980). ([1e05098](https://github.com/ckeditor/ckeditor5-ui/commit/1e05098)) + +### Other changes + +* Replaced the `getResizeObserver()` helper with new `ResizeObserver` class in `ToolbarView`. ([be98aa4](https://github.com/ckeditor/ckeditor5-ui/commit/be98aa4)) + + Follow-up on: https://github.com/ckeditor/ckeditor5-utils/pull/320 +* Updated translations. ([b8bd38e](https://github.com/ckeditor/ckeditor5-ui/commit/b8bd38e)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v15.0.0...v16.0.0) (2019-12-04) + +### Features + +* Enabled keystroke preview in `ButtonView`. Implemented the `ButtonView#withKeystroke` property. Closes [ckeditor/ckeditor5#5782](https://github.com/ckeditor/ckeditor5/issues/5782). ([dac8ce0](https://github.com/ckeditor/ckeditor5-ui/commit/dac8ce0)) + +### Bug fixes + +* Use relative positioning for dropdowns to prevent ugly blurring in Chrome. Closes [ckeditor/ckeditor5#1053](https://github.com/ckeditor/ckeditor5/issues/1053). ([95404e3](https://github.com/ckeditor/ckeditor5-ui/commit/95404e3)) + +### Other changes + +* Updated translations. ([16ee253](https://github.com/ckeditor/ckeditor5-ui/commit/16ee253)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v14.0.0...v15.0.0) (2019-10-23) + +### MAJOR BREAKING CHANGES + +* The internal structure of the toolbar component has changed. Toolbar items are no longer direct descendants of the toolbar in the DOM, which may affect some integrations (mainly CSS selectors if adjustments were made to the styles). + +### Features + +* The editor toolbar is now responsive. Closes [ckeditor/ckeditor5#416](https://github.com/ckeditor/ckeditor5/issues/416). ([46911bf](https://github.com/ckeditor/ckeditor5-ui/commit/46911bf)) + +### Other changes + +* Updated translations. ([c233bb7](https://github.com/ckeditor/ckeditor5-ui/commit/c233bb7)) ([f8f07b2](https://github.com/ckeditor/ckeditor5-ui/commit/f8f07b2)) + + +## [14.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v13.0.2...v14.0.0) (2019-08-26) + +### Features + +* Brought support for right–to–left (RTL) languages to various UI components. See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([d6c7f55](https://github.com/ckeditor/ckeditor5-ui/commit/d6c7f55)) + +### Bug fixes + +* `ColorGrid` should set the `#isOn` property value of new `ColorTiles`. See [ckeditor/ckeditor5-font#51](https://github.com/ckeditor/ckeditor5-font/issues/51). ([e89ad60](https://github.com/ckeditor/ckeditor5-ui/commit/e89ad60)) +* All editor toolbars should come with the `role` and `aria-label` attributes. Closes [ckeditor/ckeditor5#1404](https://github.com/ckeditor/ckeditor5/issues/1404). ([bdede90](https://github.com/ckeditor/ckeditor5-ui/commit/bdede90)) +* Screen reader will now properly prompt errors for text inputs. Closes [ckeditor/ckeditor5#1406](https://github.com/ckeditor/ckeditor5/issues/1406). ([3a164b7](https://github.com/ckeditor/ckeditor5-ui/commit/3a164b7)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([451df7b](https://github.com/ckeditor/ckeditor5-ui/commit/451df7b)) +* Updated translations. ([eca9fe6](https://github.com/ckeditor/ckeditor5-ui/commit/eca9fe6)) + +### BREAKING CHANGES + +* The `ToolbarView` class requires the [editor locale](https://ckeditor.com/docs/ckeditor5/latest/api/module_utils_locale-Locale.html) to be passed into the constructor. + + +## [13.0.2](https://github.com/ckeditor/ckeditor5-ui/compare/v13.0.1...v13.0.2) (2019-07-10) + +### Other changes + +* Updated translations. ([ad189b6](https://github.com/ckeditor/ckeditor5-ui/commit/ad189b6)) + + +## [13.0.1](https://github.com/ckeditor/ckeditor5-ui/compare/v13.0.0...v13.0.1) (2019-07-04) + +### Other changes + +* Updated translations. ([1964cc0](https://github.com/ckeditor/ckeditor5-ui/commit/1964cc0)) ([11cfd41](https://github.com/ckeditor/ckeditor5-ui/commit/11cfd41)) + + +## [13.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v12.1.0...v13.0.0) (2019-06-05) + +### Features + +* Implemented the single view mode for the `ContextualBalloon` plugin. See https://github.com/ckeditor/ckeditor5-mention/issues/74. ([c000c93](https://github.com/ckeditor/ckeditor5-ui/commit/c000c93)) +* Introduced rotatable panels for `ContextualBalloon`. Closes https://github.com/ckeditor/ckeditor5-ui/issues/491. ([581d8f7](https://github.com/ckeditor/ckeditor5-ui/commit/581d8f7)) + +### Other changes + +* Renamed a misspelled `InputTextViewariaDesribedById` property to `InputTextView#ariaDescribedById`. Closes [#483](https://github.com/ckeditor/ckeditor5-ui/issues/483). ([2288bf3](https://github.com/ckeditor/ckeditor5-ui/commit/2288bf3)) +* The `_rwd.css` mixin was moved to this package from `@ckeditor/ckeditor5-theme-lark`. See [ckeditor/ckeditor5#1662](https://github.com/ckeditor/ckeditor5/issues/1662). ([96e3a3c](https://github.com/ckeditor/ckeditor5-ui/commit/96e3a3c)) +* The `ContextualBalloon#add()` method should accept the `withArrow` option. Closes [#487](https://github.com/ckeditor/ckeditor5-ui/issues/487). ([0e7f670](https://github.com/ckeditor/ckeditor5-ui/commit/0e7f670)) +* Updated translations. ([4699d8b](https://github.com/ckeditor/ckeditor5-ui/commit/4699d8b)) ([d4c5714](https://github.com/ckeditor/ckeditor5-ui/commit/d4c5714)) + +### BREAKING CHANGES + +* The (misspelled) `InputTextView#ariaDesribedById` property is no longer available. Use `ariaDescribedById` instead. + + +## [12.1.0](https://github.com/ckeditor/ckeditor5-ui/compare/v12.0.0...v12.1.0) (2019-04-10) + +### Features + +* Implemented `ColorGridView` and `ColorTileView` components. See [ckeditor/ckeditor5#1457](https://github.com/ckeditor/ckeditor5/issues/1457). ([6be52b4](https://github.com/ckeditor/ckeditor5-ui/commit/6be52b4)) + +### Bug fixes + +* Fixed `View#render` collision when moving focus from a one editable to the other in multi-root editor. Closes https://github.com/ckeditor/ckeditor5/issues/1676. ([17e86f9](https://github.com/ckeditor/ckeditor5-ui/commit/17e86f9)) + +### Other changes + +* Optimized icons. ([5325ea8](https://github.com/ckeditor/ckeditor5-ui/commit/5325ea8)) +* Updated translations. ([dcdca2e](https://github.com/ckeditor/ckeditor5-ui/commit/dcdca2e)) + + +## [12.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v11.2.0...v12.0.0) (2019-02-28) + +### Bug fixes + +* Prevented from changing the view document during the render phase. Closes https://github.com/ckeditor/ckeditor5/issues/1530. ([7cf835e](https://github.com/ckeditor/ckeditor5-ui/commit/7cf835e)) +* Fixed memory leaks during editor initialization and destruction (see [ckeditor/ckeditor5#1341](https://github.com/ckeditor/ckeditor5/issues/1341)). ([fd18fb9](https://github.com/ckeditor/ckeditor5-ui/commit/fd18fb9)) + +### Other changes + +* The `class` property should control the DOM class attribute in all UI components. Closes [#450](https://github.com/ckeditor/ckeditor5-ui/issues/450). ([b9b68c6](https://github.com/ckeditor/ckeditor5-ui/commit/b9b68c6)) +* Updated translations. ([b9caee9](https://github.com/ckeditor/ckeditor5-ui/commit/b9caee9)) ([a3afaaa](https://github.com/ckeditor/ckeditor5-ui/commit/a3afaaa)) ([909e676](https://github.com/ckeditor/ckeditor5-ui/commit/909e676)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) +* The `BallonPanelView#className` property was renamed to `#class`. +* The `ToolbarView#className` property was renamed to `#class`. +* The `EditableUIView#externalElement` property (which held the element on which the editor was created if it was explicitly passed) was removed. +* The `EditorUIView#editableElement` property was made private. Use `editor.ui.getEditableElement()` method instead. + + +## [11.2.0](https://github.com/ckeditor/ckeditor5-ui/compare/v11.1.0...v11.2.0) (2018-12-05) + +### Features + +* Added the `.ck-read-only` CSS class to the `EditableUIView` when `#isReadOnly` is `true`. ([4119822](https://github.com/ckeditor/ckeditor5-ui/commit/4119822)) +* Added the optional `DropdownView#class` property to set a custom CSS class on the main element in DOM. Closes [#447](https://github.com/ckeditor/ckeditor5-ui/issues/447). ([9cdcd4a](https://github.com/ckeditor/ckeditor5-ui/commit/9cdcd4a)) + + Thanks to [@lucasreppewelander](https://github.com/lucasreppewelander)! +* Implemented `LabeledInputView#infoText` to display useful hints next to the input (see [ckeditor/ckeditor5-media-embed#35](https://github.com/ckeditor/ckeditor5-media-embed/issues/35)). ([6ac03ea](https://github.com/ckeditor/ckeditor5-ui/commit/6ac03ea)) +* Implemented configurable, smart `DropdownView` panel positioning. Closes [#123](https://github.com/ckeditor/ckeditor5-ui/issues/123). ([8094f19](https://github.com/ckeditor/ckeditor5-ui/commit/8094f19)) + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([ed88305](https://github.com/ckeditor/ckeditor5-ui/commit/ed88305)) +* Updated translations. ([2e409a9](https://github.com/ckeditor/ckeditor5-ui/commit/2e409a9)) ([611bd04](https://github.com/ckeditor/ckeditor5-ui/commit/611bd04)) ([c6689e4](https://github.com/ckeditor/ckeditor5-ui/commit/c6689e4)) ([07c4fdb](https://github.com/ckeditor/ckeditor5-ui/commit/07c4fdb)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-ui/compare/v11.0.0...v11.1.0) (2018-10-08) + +### Features + +* Allowed displaying an error message next to the `LabeledInputVIew` (see [ckeditor/ckeditor5-media-embed#1](https://github.com/ckeditor/ckeditor5-media-embed/issues/1)). ([81aaea4](https://github.com/ckeditor/ckeditor5-ui/commit/81aaea4)) + +### Bug fixes + +* Made the `Edit block` string translatable. Closes [#445](https://github.com/ckeditor/ckeditor5-ui/issues/445). ([1fa84e9](https://github.com/ckeditor/ckeditor5-ui/commit/1fa84e9)) + +### Other changes + +* Updated translations. ([baff3c9](https://github.com/ckeditor/ckeditor5-ui/commit/baff3c9)) +* Updated translations. ([e58bcbb](https://github.com/ckeditor/ckeditor5-ui/commit/e58bcbb)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v10.1.0...v11.0.0) (2018-07-18) + +### Features + +* Implemented the `SwitchButtonView`. Closes [#402](https://github.com/ckeditor/ckeditor5-ui/issues/402). Closes [#403](https://github.com/ckeditor/ckeditor5-ui/issues/403). ([105fbea](https://github.com/ckeditor/ckeditor5-ui/commit/105fbea)) + + Also: + + * Simplified the `ListItemView` class, which is now just a container for `ButtonView` (and others), + * Moved `ListItemView#style` and `#class` to the `ButtonView` (as `#class` and `#labelStyle`), + * Enhanced the `addListToDropdown` utility with a better configuration (`ListDropdownItemDefinition`) and the support for buttons, switch buttons, and separators, + * `.ck-button` and `.ck-list` became `flex` containers; the first one to allow complex inner structures (like the toggle) and the later to take control of complex list items (like `.ck-switchbutton`). + +### Bug fixes + +* The `BalloonToolbar` should hide when the editable is blurred. Closes [#418](https://github.com/ckeditor/ckeditor5-ui/issues/418). ([f6a02d4](https://github.com/ckeditor/ckeditor5-ui/commit/f6a02d4)) +* The `BlockToolbar` should add elements to the `FocusTracker` only after `uiReady` is fired to avoid errors. Closes [#424](https://github.com/ckeditor/ckeditor5-ui/issues/424). ([ae9fa09](https://github.com/ckeditor/ckeditor5-ui/commit/ae9fa09)) +* The `BlockToolbar` should hide when the editor is blurred. Closes [#408](https://github.com/ckeditor/ckeditor5-ui/issues/408). ([e3bbccf](https://github.com/ckeditor/ckeditor5-ui/commit/e3bbccf)) + +### Other changes + +* Allowed list item's buttons to have an outer, visible box-shadow. Ensured the balloon panel's arrow does not cover panel's children. Closes [#394](https://github.com/ckeditor/ckeditor5-ui/issues/394). ([8a64ee2](https://github.com/ckeditor/ckeditor5-ui/commit/8a64ee2)) +* Updated translations. ([949585d](https://github.com/ckeditor/ckeditor5-ui/commit/949585d)) + +### BREAKING CHANGES + +* Most of the `ListItemView` functionality is now handled by the `ButtonView`, +* The API of the `addListToDropdown` has changed; see `ListDropdownItemDefinition` to learn more, +* The `.ck-button` and `.ck-list` classes are using `flex` which may have an impact on rendering. + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-ui/compare/v10.0.0...v10.1.0) (2018-06-21) + +### Features + +* Implemented list component separators (see [ckeditor/ckeditor5-table#24](https://github.com/ckeditor/ckeditor5-table/issues/24)). ([0808a8c](https://github.com/ckeditor/ckeditor5-ui/commit/0808a8c)) +* Introduced the `BlockToolbar` plugin. Closes [#391](https://github.com/ckeditor/ckeditor5-ui/issues/391). ([5868516](https://github.com/ckeditor/ckeditor5-ui/commit/5868516)) + +### Bug fixes + +* The action should be executed upon the first click on a tooltip-enabled UI in iOS. Closes [ckeditor/ckeditor5#920](https://github.com/ckeditor/ckeditor5/issues/920). ([6508ba2](https://github.com/ckeditor/ckeditor5-ui/commit/6508ba2)) +* The balloon toolbar should be attached correctly in case of a multi-range selection. Closes [#385](https://github.com/ckeditor/ckeditor5-ui/issues/385). ([714ef21](https://github.com/ckeditor/ckeditor5-ui/commit/714ef21)) +* The buttons in the editor should provide basic accessibility. Closes [ckeditor/ckeditor5#1013](https://github.com/ckeditor/ckeditor5/issues/1013). ([9e17d13](https://github.com/ckeditor/ckeditor5-ui/commit/9e17d13)) + +### Other changes + +* Disabling a `ListItemView` should be possible using the `isEnabled` property. Closes [#389](https://github.com/ckeditor/ckeditor5-ui/issues/389). ([76a4d47](https://github.com/ckeditor/ckeditor5-ui/commit/76a4d47)) +* Made the `ContextualBalloon` always use the position of the topmost view in the stack (see: [ckeditor/ckeditor5-table#28](https://github.com/ckeditor/ckeditor5-table/issues/28)). Closes [ckeditor/ckeditor5#900](https://github.com/ckeditor/ckeditor5/issues/900). ([a2ef073](https://github.com/ckeditor/ckeditor5-ui/commit/a2ef073)) +* Updated translations. ([084e8c6](https://github.com/ckeditor/ckeditor5-ui/commit/084e8c6)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-beta.4...v10.0.0) (2018-04-25) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([f1e5fbf](https://github.com/ckeditor/ckeditor5-ui/commit/f1e5fbf)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-beta.2...v1.0.0-beta.4) (2018-04-19) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2018-04-10) + +### Other changes + +* Renamed plural method names to singular. See [ckeditor/ckeditor5#742](https://github.com/ckeditor/ckeditor5/issues/742). ([48cd53d](https://github.com/ckeditor/ckeditor5-ui/commit/48cd53d)) + +### BREAKING CHANGES + +* `View#registerChildren()` and `View#deregisterChildren()` have been renamed to `View#registerChild()` and `View#deregisterChild()`. + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (2018-03-15) + +### Features + +* Implemented the `IconView#fillColor` observable which fills child `.ck-icon__fill` paths with the color (see [ckeditor/ckeditor5-theme-lark#148](https://github.com/ckeditor/ckeditor5-theme-lark/issues/148)). ([728a691](https://github.com/ckeditor/ckeditor5-ui/commit/728a691)) +* Initial implementation of the `ButtonDropdownView`. Closes [#333](https://github.com/ckeditor/ckeditor5-ui/issues/333). ([6e9c6e4](https://github.com/ckeditor/ckeditor5-ui/commit/6e9c6e4)) + + Also: + + * Allowed vertical layout of the `ToolbarView` thanks to the `#isVertical` attribute. + * Implemented `ToolbarView#className` attribute. + * Implemented `DropdownView#isEnabled` attribute along with the CSS class binding. +* Updated UI components to bring the support for the refreshed Lark theme (see [ckeditor/ckeditor5#645](https://github.com/ckeditor/ckeditor5/issues/645)). ([623d536](https://github.com/ckeditor/ckeditor5-ui/commit/623d536)) + +### Bug fixes + +* Button icon styles should not touch the dropdown's arrow. Closes [ckeditor/ckeditor5#831](https://github.com/ckeditor/ckeditor5/issues/831). ([507549f](https://github.com/ckeditor/ckeditor5-ui/commit/507549f)) + +### Other changes + +* Added a CSS class to the SplitButtonView when the arrow is on (see [ckeditor/ckeditor5-theme-lark#134](https://github.com/ckeditor/ckeditor5-theme-lark/issues/134)). ([d490d61](https://github.com/ckeditor/ckeditor5-ui/commit/d490d61)) +* Added the `.ck-content` CSS class to the `EditableUIView` in order to simplify styling the editor content. Closes [#176](https://github.com/ckeditor/ckeditor5-ui/issues/176). ([f38ae70](https://github.com/ckeditor/ckeditor5-ui/commit/f38ae70)) +* Align feature class naming to a new scheme. ([1c500f6](https://github.com/ckeditor/ckeditor5-ui/commit/1c500f6)) +* Aligned code to changes (`config.lang` to `config.languages`). Part of the Translation Service v2 ([ckeditor/ckeditor5#624](https://github.com/ckeditor/ckeditor5/issues/624)). ([876f681](https://github.com/ckeditor/ckeditor5-ui/commit/876f681)) +* ComponentFactory.names() will return original component names (instead of normalized names). Closes [#376](https://github.com/ckeditor/ckeditor5-ui/issues/376). ([b6b39d7](https://github.com/ckeditor/ckeditor5-ui/commit/b6b39d7)) +* CSS classes should be prefixed with `ck-` instead of `cke-`. Closes [#112](https://github.com/ckeditor/ckeditor5-ui/issues/112). ([7973f83](https://github.com/ckeditor/ckeditor5-ui/commit/7973f83)) +* Introduced `SplitButtonView` and new dropdown creation helpers (`createDropdown()`, `addListToDropdown()` and `addToolbarToDropdown()`) Closes [#344](https://github.com/ckeditor/ckeditor5-ui/issues/344). Closes [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). ([0f26ca8](https://github.com/ckeditor/ckeditor5-ui/commit/0f26ca8)) +* Migrated the package styles from SASS to PostCSS to bring theme support and avoid duplicates in some editor builds. Closes [#144](https://github.com/ckeditor/ckeditor5-ui/issues/144). Closes [ckeditor/ckeditor5#420](https://github.com/ckeditor/ckeditor5/issues/420). ([f152dfc](https://github.com/ckeditor/ckeditor5-ui/commit/f152dfc)) +* Moved ck-button-icon mixin from ckeditor5-theme-lark. ([8757d27](https://github.com/ckeditor/ckeditor5-ui/commit/8757d27)) +* Removed the `.ck-editor-toolbar` and `.ck-editor-toolbar-container` classes (see [ckeditor/ckeditor5-theme-lark#135](https://github.com/ckeditor/ckeditor5-theme-lark/issues/135)). ([352d056](https://github.com/ckeditor/ckeditor5-ui/commit/352d056)) +* Rename `ContextualToolbar` to `BalloonToolbar`. Closes [ckeditor/ckeditor5#550](https://github.com/ckeditor/ckeditor5/issues/550). ([28f59df](https://github.com/ckeditor/ckeditor5-ui/commit/28f59df)) +* The `closeDropdownOnBlur()` helper should use `clickOutsideHandler()`. Decorated the `View#render()` method. Closes [#311](https://github.com/ckeditor/ckeditor5-ui/issues/311). ([269e97b](https://github.com/ckeditor/ckeditor5-ui/commit/269e97b)) +* Updated translations. ([f657be2](https://github.com/ckeditor/ckeditor5-ui/commit/f657be2)) + +### BREAKING CHANGES + +* Renamed `contextual/contextualtoolbar~ContextualToolbar` to `balloon/balloontoolbar~BalloonToolbar`. +* Renamed `contextualToolbar` configuration option to `balloonToolbar`. +* Removed `DropdownModel` interface – you can use dropdown properties directly now. See [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). +* Removed `createButtonDropdown()` and `ButtonDropdownView`. See [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). +* Removed `createListDropdown()` and `ListDropdownView`. See [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). +* The DOM structure of the dropdown component has changed. Please refer to the documentation to find out more. +* Basic properties of the balloon panel component have changed (i.e. the location of the arrow, the default positions), which may have an impact on existing integrations. +* The styles are no longer developed in SASS which means the `.scss` files became unavailable. Please refer to the [Theme Customization](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/ui/theme-customization.html) guide to learn more about migration to PostCSS. + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2017-11-14) + +### Bug fixes + +* `Template#getViews()` generator should not traverse native HTML elements. Closes [#337](https://github.com/ckeditor/ckeditor5-ui/issues/337). Closes [ckeditor/ckeditor5#657](https://github.com/ckeditor/ckeditor5/issues/657). ([894bad0](https://github.com/ckeditor/ckeditor5-ui/commit/894bad0)) +* Improved binding of the `value` attribute in `InputTextView`. Closes [#335](https://github.com/ckeditor/ckeditor5-ui/issues/335). ([823120b](https://github.com/ckeditor/ckeditor5-ui/commit/823120b)) + +### Other changes + +* Implemented `View#render()` method which replaces rendering the `#element` upon the first access and incorporates the `#init()` method functionality. Closes [#262](https://github.com/ckeditor/ckeditor5-ui/issues/262). Closes [#302](https://github.com/ckeditor/ckeditor5-ui/issues/302). ([bf90ad5](https://github.com/ckeditor/ckeditor5-ui/commit/bf90ad5)) + + In other words – the `View#render()` method needs to be called to render a view and it sets the `View#element` itself. It can be called only once and it is done automatically if a view is added to some other view (as its child). If you need to add any additional logic to your component's initialization, then override the `render()` method (and remember to call `super.render()`). + + Additionally, from now on `View#setTemplate()` and `View#extendTemplate()` methods are recommended as a shorthand for `view.template = new Template( { ... } )` and `Template.extend( view.template )`. + + Please refer to the updated [documentation](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/intro.html#ui-library) to learn more. +* Removed legacy `width` and `height` attributes from the `BoxedEditorUIView`. Closes [#25](https://github.com/ckeditor/ckeditor5-ui/issues/25). ([ffa419a](https://github.com/ckeditor/ckeditor5-ui/commit/ffa419a)) +* The `ComponentFactory` should be case-insensitive. Closes [#324](https://github.com/ckeditor/ckeditor5-ui/issues/324). ([94417e9](https://github.com/ckeditor/ckeditor5-ui/commit/94417e9)) +* Updated translations. ([186f365](https://github.com/ckeditor/ckeditor5-ui/commit/186f365)) + +### BREAKING CHANGES + +* The `View#init()` method in UI components has been renamed to `render()`. Please refer to the [documentation](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/intro.html#UI-library) to learn more. +* The `View#element` is no longer a getter which renders an element when first referenced. Use the `View#render()` method instead. +* `Template#children` property became an `Array` (previously `ViewCollection`). +* `View#addChildren()` and `View#removeChildren()` methods became `#registerChildren()` and `#deregisterChildren()`. +* The DOM structure of the `StickyPanelView` has changed along with the class names. Please refer to the component documentation to learn more. + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-ui/compare/v0.10.0...v1.0.0-alpha.1) (2017-10-03) + +### Bug fixes + +* `ContextualBalloon` should remember position passed to `#updatePosition()`. Closes [#305](https://github.com/ckeditor/ckeditor5-ui/issues/305). Closes [ckeditor/ckeditor5-image#141](https://github.com/ckeditor/ckeditor5-image/issues/141). ([c787c0d](https://github.com/ckeditor/ckeditor5-ui/commit/c787c0d)) +* `ContextualToolbar` should not be positioned to a zero–width DOM rect when invoked for a multi-line forward selection. Closes [#308](https://github.com/ckeditor/ckeditor5-ui/issues/308). ([00b701b](https://github.com/ckeditor/ckeditor5-ui/commit/00b701b)) +* `ContextualToolbar` will accept the object format of `config.contextualToolbar`. Closes [#316](https://github.com/ckeditor/ckeditor5-ui/issues/316). ([d71cad8](https://github.com/ckeditor/ckeditor5-ui/commit/d71cad8)) +* Fixed sticky panel's `z-index` so it's correctly rendered above images (or other relatively positioned elements). Closes [#315](https://github.com/ckeditor/ckeditor5-ui/issues/315). ([00f2add](https://github.com/ckeditor/ckeditor5-ui/commit/00f2add)) +* The content of the `BalloonPanelView` should be selectable. Closes [#294](https://github.com/ckeditor/ckeditor5-ui/issues/294). Closes https://github.com/ckeditor/ckeditor5/issues/498. ([e5315df](https://github.com/ckeditor/ckeditor5-ui/commit/e5315df)) + +### Features + +* Implemented `View#removeChildren()`, the opposite of `View#addChildren()`. Closes [#303](https://github.com/ckeditor/ckeditor5-ui/issues/303). ([0f1ea5a](https://github.com/ckeditor/ckeditor5-ui/commit/0f1ea5a)) +* Replaced `StickyToolbarView` with a generic `StickyPanelView`. Closes [#297](https://github.com/ckeditor/ckeditor5-ui/issues/297). ([b10b43c](https://github.com/ckeditor/ckeditor5-ui/commit/b10b43c)) + +### Other changes + +* `ToolbarView#fillFromConfig()` will warn when the factory does not provide a component. Closes [#291](https://github.com/ckeditor/ckeditor5-ui/issues/291). Closes [ckeditor/ckeditor5#526](https://github.com/ckeditor/ckeditor5/issues/526). ([2e63e70](https://github.com/ckeditor/ckeditor5-ui/commit/2e63e70)) +* The `escPressHandler` function should be replaced by the `KeystrokeHandler`. Closes [#150](https://github.com/ckeditor/ckeditor5-ui/issues/150). ([b322744](https://github.com/ckeditor/ckeditor5-ui/commit/b322744)) + +### BREAKING CHANGES + +* `Toolbar#fillFromConfig()` cannot be now called with an `undefined`. Make sure to use `normalizeToolbarConfig()` to get a reliable object. +* The `escPressHandler` is no longer available. Please +refer to the `KeystrokeHandler` helper to learn more. +* The `StickyToolbarView` and corresponding CSS `.ck-sticky-panel` classes are no longer available. `StickyPanelView` + `ToolbarView` combo should be used instead. + + +## [0.10.0](https://github.com/ckeditor/ckeditor5-ui/compare/v0.9.0...v0.10.0) (2017-09-03) + +### Bug fixes + +* `ContextualToolbar` should have proper editor toolbar styling. Closes [#230](https://github.com/ckeditor/ckeditor5-ui/issues/230). ([4e2ee36](https://github.com/ckeditor/ckeditor5-ui/commit/4e2ee36)) +* BalloonPanelView should prevent native #selectstart event. Closes [#243](https://github.com/ckeditor/ckeditor5-ui/issues/243). ([cba3fb1](https://github.com/ckeditor/ckeditor5-ui/commit/cba3fb1)) +* Button tooltip should not look blurry on low-DPI screens. Closes [#142](https://github.com/ckeditor/ckeditor5-ui/issues/142). Closes [#133](https://github.com/ckeditor/ckeditor5-ui/issues/133). ([a497aff](https://github.com/ckeditor/ckeditor5-ui/commit/a497aff)) +* Clicking and dragging in a dropdown panel should not break the selection. Closes [#228](https://github.com/ckeditor/ckeditor5-ui/issues/228). ([6066a09](https://github.com/ckeditor/ckeditor5-ui/commit/6066a09)) +* Contextual toolbar should re–position correctly on window scroll. Closes [#227](https://github.com/ckeditor/ckeditor5-ui/issues/227). ([e5ea25f](https://github.com/ckeditor/ckeditor5-ui/commit/e5ea25f)) +* `DropdownView` should open upon arrow down key press. Closes [#249](https://github.com/ckeditor/ckeditor5-ui/issues/249). ([c1e6afc](https://github.com/ckeditor/ckeditor5-ui/commit/c1e6afc)) +* List items should handle Enter and Space key press when focused. Closes [#153](https://github.com/ckeditor/ckeditor5-ui/issues/153). ([403b64a](https://github.com/ckeditor/ckeditor5-ui/commit/403b64a)) +* The `clickOutsideHandler` helper should use `mousedown` instead of `mouseup` event. Closes [#281](https://github.com/ckeditor/ckeditor5-ui/issues/281). ([6b980b6](https://github.com/ckeditor/ckeditor5-ui/commit/6b980b6)) +* The `Template` class should not throw an error when a child view in the definition has an `id` attribute set without a value. Closes [#289](https://github.com/ckeditor/ckeditor5-ui/issues/289). ([d7072ba](https://github.com/ckeditor/ckeditor5-ui/commit/d7072ba)) +* The `TooltipView` should hide when the `TooltipView#text` is empty. The `ButtonView's` ability to get a tooltip should not be restricted after `View` initialization. Closes [#283](https://github.com/ckeditor/ckeditor5-ui/issues/283). ([1588c82](https://github.com/ckeditor/ckeditor5-ui/commit/1588c82)) +* The dropdown menu should not open using the keyboard when disabled. Closes [#238](https://github.com/ckeditor/ckeditor5-ui/issues/238). ([fc524b8](https://github.com/ckeditor/ckeditor5-ui/commit/fc524b8)) + +### Features + +* `StickyToolbarView` now supports a configurable vertical offset from the top of the page. Closes [#277](https://github.com/ckeditor/ckeditor5-ui/issues/277). ([245f0fa](https://github.com/ckeditor/ckeditor5-ui/commit/245f0fa)) + + Also implemented the `normalizeToolbarConfig()` utility. +* Added `TextInputView#isReadOnly` and `LabeledInputView#isReadOnly` states. Closes [#266](https://github.com/ckeditor/ckeditor5-ui/issues/266). Closes [#268](https://github.com/ckeditor/ckeditor5-ui/issues/268). ([111a728](https://github.com/ckeditor/ckeditor5-ui/commit/111a728)) +* Added optional notification title. Closes [#241](https://github.com/ckeditor/ckeditor5-ui/issues/241). ([abbb68f](https://github.com/ckeditor/ckeditor5-ui/commit/abbb68f)) +* Allowed `BalloonPanelView` position limiter defined as a function. Made `ContextualBalloon` position limiter configurable via `#positionLimiter` property. Closes [#260](https://github.com/ckeditor/ckeditor5-ui/issues/260). ([322563e](https://github.com/ckeditor/ckeditor5-ui/commit/322563e)) +* Implemented placeholder in `InputTextView`. Closes [#220](https://github.com/ckeditor/ckeditor5-ui/issues/220). ([5d91d18](https://github.com/ckeditor/ckeditor5-ui/commit/5d91d18)) +* Introduced `CommandFactory#names()`. Closes [#287](https://github.com/ckeditor/ckeditor5-ui/issues/287). ([4038da2](https://github.com/ckeditor/ckeditor5-ui/commit/4038da2)) + +### Other changes + +* Add support for multiple context elements in the `clickOutsideHandler` helper. Closes [#261](https://github.com/ckeditor/ckeditor5-ui/issues/261). ([9da5bf7](https://github.com/ckeditor/ckeditor5-ui/commit/9da5bf7)) +* Added the `beforeShow` event to the `ContextualToolbar` plugin. Closes [#222](https://github.com/ckeditor/ckeditor5-ui/issues/222). ([835d0ac](https://github.com/ckeditor/ckeditor5-ui/commit/835d0ac)) +* Implemented public `show()` and `hide()` methods in the `ContextualToolbar` plugin. Closes [#263](https://github.com/ckeditor/ckeditor5-ui/issues/263). ([eb4caab](https://github.com/ckeditor/ckeditor5-ui/commit/eb4caab)) +* Improvements in the `BalloonPanelView`–based components for the balloon toolbar editor. Closes [#236](https://github.com/ckeditor/ckeditor5-ui/issues/236). Closes [#234](https://github.com/ckeditor/ckeditor5-ui/issues/234). Closes [#224](https://github.com/ckeditor/ckeditor5-ui/issues/224). ([737b55f](https://github.com/ckeditor/ckeditor5-ui/commit/737b55f)) +* Made the UI component initialization and destruction processes synchronous. Closes [#225](https://github.com/ckeditor/ckeditor5-ui/issues/225). ([07e1502](https://github.com/ckeditor/ckeditor5-ui/commit/07e1502)) +* Made the UI destruction a fail–safe, repeatable process. Closes [#248](https://github.com/ckeditor/ckeditor5-ui/issues/248). ([6f5ec0d](https://github.com/ckeditor/ckeditor5-ui/commit/6f5ec0d)) +* The `ContextualToolbar` should not show up when all child items are disabled. The `ContextualToolbar#beforeShow` event has been replaced by `ContextualToolbar#show`. Closes [#269](https://github.com/ckeditor/ckeditor5-ui/issues/269). Closes [#232](https://github.com/ckeditor/ckeditor5-ui/issues/232). ([d83d07d](https://github.com/ckeditor/ckeditor5-ui/commit/d83d07d)) + +### BREAKING CHANGES + +* `StickyToolbarView#limiterOffset` has been renamed to `StickyToolbarView#limiterBottomOffset`. +* `ContextualToolbar#beforeShow` is no longer available. Please refer to `ContextualToolbar#show` instead. +* The `clickOutsideHandler` helper's `contextElement` config option is now an `Array` named `contextElements`. +* `View#init()`, `View#destroy()` (also `ViewCollection#init()`, `ViewCollection#destroy()` and `ViewCollection#add()`) no longer return `Promise`. It may require updates in UI components which inherit from `View` and rely on the value returned by these methods. +* Various UI components switched to synchronous `init()` and `destroy()` (no longer returning `Promise`), which means that features using these components may need some updates to work properly. +* The position names in `BalloonPanelView.defaultPositions` and their results have changed. Please refer to the latest API documentation to learn more. + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-ui/compare/v0.8.0...v0.9.0) (2017-05-07) + +### Bug fixes + +* `BalloonPanelView` should not be focusable. Closes [#206](https://github.com/ckeditor/ckeditor5-ui/issues/206). ([f9e3bb7](https://github.com/ckeditor/ckeditor5-ui/commit/f9e3bb7)) + + T/206a: BalloonPanelView should not be focusable +* ContextualBalloon plugin should use BalloonPanelView#pin instead of #attachTo. Closes [#192](https://github.com/ckeditor/ckeditor5-ui/issues/192). ([28dd457](https://github.com/ckeditor/ckeditor5-ui/commit/28dd457)) +* ContextualBalloon.view#element should be registered in editor's focus tracker. Closes [#193](https://github.com/ckeditor/ckeditor5-ui/issues/193). ([cfbe329](https://github.com/ckeditor/ckeditor5-ui/commit/cfbe329)) +* FocusCycler should ignore invisible views. Closes [#209](https://github.com/ckeditor/ckeditor5-ui/issues/209). ([b8fbaf1](https://github.com/ckeditor/ckeditor5-ui/commit/b8fbaf1)) + + T/209: FocusCycler should not consider invisible views. +* ViewCollection#destroy should wait for all ViewCollection#add promises to resolve to avoid errors. Closes [#203](https://github.com/ckeditor/ckeditor5-ui/issues/203). ([a7e7c94](https://github.com/ckeditor/ckeditor5-ui/commit/a7e7c94)) + +### Features + +* Added keepAttachedTo() method to the BalloonPanelView. Closes [#170](https://github.com/ckeditor/ckeditor5-ui/issues/170). ([101b465](https://github.com/ckeditor/ckeditor5-ui/commit/101b465)) +* Introduced `ContextualToolbar` plugin. Closes [#182](https://github.com/ckeditor/ckeditor5-ui/issues/182). Closes [#187](https://github.com/ckeditor/ckeditor5-ui/issues/187). ([66a30b1](https://github.com/ckeditor/ckeditor5-ui/commit/66a30b1)) + + Introduced several new positions in `BalloonPanelView#defaultPositions`. Added `className` attribute to the `BalloonPanelView` interface. + + BREAKING CHANGE: Default positions of the `BalloonPanelView` have been renamed. + + BREAKING CHANGE: Class names controlling the arrow of the panel have been renamed. +* Introduced ContextualBalloon plugin for managing contextual balloons. Closes [#134](https://github.com/ckeditor/ckeditor5-ui/issues/134). ([3ceb6a6](https://github.com/ckeditor/ckeditor5-ui/commit/3ceb6a6)) +* Introduced notification plugin. Closes [#189](https://github.com/ckeditor/ckeditor5-ui/issues/189). ([f2dd63f](https://github.com/ckeditor/ckeditor5-ui/commit/f2dd63f)) + +### Other changes + +* Improved ContextualBalloon so it supports asynchronous Views. Closes [#200](https://github.com/ckeditor/ckeditor5-ui/issues/200). ([09067aa](https://github.com/ckeditor/ckeditor5-ui/commit/09067aa)) +* Merged `FloatingPanelView` into `BalloonPanelView`. Closes [#191](https://github.com/ckeditor/ckeditor5-ui/issues/191). ([4b90faa](https://github.com/ckeditor/ckeditor5-ui/commit/4b90faa)) + + BREAKING CHANGE: `FloatingPanelView` is no longer available. + BREAKING CHANGE: `BalloonPanelView#keepAttachedTo()` has been replaced by `pin()`. + BREAKING CHANGE: Default position names in `BalloonPanelView.defaultPositions` have changed. Now prefixed with `arrow_`. +* Updated translations. ([3455fe7](https://github.com/ckeditor/ckeditor5-ui/commit/3455fe7)) + +### BREAKING CHANGES + +* Default positions of the `BalloonPanelView` have been renamed. +* Class names controlling the arrow of the panel have been renamed. +* `FloatingPanelView` is no longer available. +* `BalloonPanelView#keepAttachedTo()` has been replaced by `pin()`. +* Default position names in `BalloonPanelView.defaultPositions` have changed. Now prefixed with `arrow_`. + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-ui/compare/v0.7.1...v0.8.0) (2017-04-05) + +### Features + +* Allowed marking ListItemView active using the #isActive attribute. Closes [#166](https://github.com/ckeditor/ckeditor5-ui/issues/166). ([a19d6c4](https://github.com/ckeditor/ckeditor5-ui/commit/a19d6c4)) +* Enabled styling via "class" attribute in ListItemView. Closes [#162](https://github.com/ckeditor/ckeditor5-ui/issues/162). ([672bf82](https://github.com/ckeditor/ckeditor5-ui/commit/672bf82)) +* Implemented features necessary for creating inline editors UI – `FloatingPanelView` class, `Template.revert()` method and `enableToolbarKeyboardFocus()` util. Closes [#152](https://github.com/ckeditor/ckeditor5-ui/issues/152). ([cb606d7](https://github.com/ckeditor/ckeditor5-ui/commit/cb606d7)) + +### Other changes + +* `ComponentFactory` will throw an error when attempting to create a non-existent component. Closes [#174](https://github.com/ckeditor/ckeditor5-ui/issues/174). ([ef0a7f8](https://github.com/ckeditor/ckeditor5-ui/commit/ef0a7f8)) +* Imported "ck-hidden" CSS class from ckeditor5-theme-lark. Closes [#164](https://github.com/ckeditor/ckeditor5-ui/issues/164). ([486bb22](https://github.com/ckeditor/ckeditor5-ui/commit/486bb22)) +* Moved `ViewCollection#bindTo` method to `Collection` class in `ckeditor5-utils`. Closes [#168](https://github.com/ckeditor/ckeditor5-ui/issues/168). ([5b55987](https://github.com/ckeditor/ckeditor5-ui/commit/5b55987)) +* Updated translations. ([3b27e51](https://github.com/ckeditor/ckeditor5-ui/commit/3b27e51)) + +### BREAKING CHANGES + +* `ViewCollection#bindTo.as` is renamed to `Collection#bindTo.using` when mapping function is a parameter. See`Collection#bindTo` docs. +* The `ui/balloonpanel/balloonpanelview` module was renamed to `ui/panel/balloon/balloonpanelview`. See [#152](https://github.com/ckeditor/ckeditor5-ui/issues/152). + + +## [0.7.1](https://github.com/ckeditor/ckeditor5-ui/compare/v0.7.0...v0.8.0) (2017-03-06) + +### Bug fixes + +* Removed title from the editable element. Fixes [#121](https://github.com/ckeditor/ckeditor5/issues/121). ([71fb3eb](https://github.com/ckeditor/ckeditor5-ui/commit/71fb3eb)) + +### Features + +* Added support for toolbar item separators. Closes [#154](https://github.com/ckeditor/ckeditor5/issues/154). ([f3cb75d](https://github.com/ckeditor/ckeditor5-ui/commit/f3cb75d)) + +### Other changes + +* Uploaded translations. ([67ba32b](https://github.com/ckeditor/ckeditor5-ui/commit/67ba32b)) diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/LICENSE.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/LICENSE.md new file mode 100644 index 000000000..6c425d1de --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/LICENSE.md @@ -0,0 +1,21 @@ +Software License Agreement +========================== + +**CKEditor 5 UI framework** – https://github.com/ckeditor/ckeditor5-ui
      +Copyright (c) 2003-2023, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +The following libraries are included in CKEditor under the [MIT license](https://opensource.org/licenses/MIT): + +* lodash - Copyright (c) JS Foundation and other contributors https://js.foundation/. Based on Underscore.js, copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors http://underscorejs.org/. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/README.md b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/README.md new file mode 100644 index 000000000..999c0e29d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/README.md @@ -0,0 +1,21 @@ +CKEditor 5 UI framework +=========================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-ui.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) +![Dependency Status](https://img.shields.io/librariesio/release/npm/@ckeditor/ckeditor5-ui) + +This package implements a simple UI framework and CKEditor 5's standard UI library. + +## Demo + +Check out the [editor toolbar demo](https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html#demo) and [block toolbar demo](https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/blocktoolbar.html#demo) in CKEditor 5 documentation. + +## Documentation + +See the [`@ckeditor/ckeditor5-ui` package](https://ckeditor.com/docs/ckeditor5/latest/api/ui.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json new file mode 100644 index 000000000..f68952bd8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + { + "name": "Block toolbar", + "className": "BlockToolbar", + "description": "Provides an additional configurable toolbar on the left-hand side of the content area, next to the selected block element. It comes in handy when the main editor toolbar cannot be accessed.", + "docs": "features/toolbar/blocktoolbar.html", + "path": "src/toolbar/block/blocktoolbar.js" + } + ] +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/contexts.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/contexts.json new file mode 100644 index 000000000..782d26eca --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/contexts.json @@ -0,0 +1,26 @@ +{ + "Rich Text Editor": "Title of the CKEditor5 editor.", + "Editor editing area: %0": "Accessible label of the specific editing area belonging to a container with an ARIA application role.", + "Edit block": "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)", + "Next": "Label for a button showing the next thing (tab, page, etc.).", + "Previous": "Label for a button showing the previous thing (tab, page, etc.).", + "Editor toolbar": "Label used by assistive technologies describing a generic editor toolbar.", + "Dropdown toolbar": "Label used by assistive technologies describing a toolbar displayed inside a dropdown.", + "Black": "Label of a button that applies a black color in color pickers.", + "Dim grey": "Label of a button that applies a dim grey color in color pickers.", + "Grey": "Label of a button that applies a grey color in color pickers.", + "Light grey": "Label of a button that applies a light grey color in color pickers.", + "White": "Label of a button that applies a white color in color pickers.", + "Red": "Label of a button that applies a red color in color pickers.", + "Orange": "Label of a button that applies a orange color in color pickers.", + "Yellow": "Label of a button that applies a yellow color in color pickers.", + "Light green": "Label of a button that applies a light green color in color pickers.", + "Green": "Label of a button that applies a green color in color pickers.", + "Aquamarine": "Label of a button that applies a aquamarine color in color pickers.", + "Turquoise": "Label of a button that applies a turquoise color in color pickers.", + "Light blue": "Label of a button that applies a light blue color in color pickers.", + "Blue": "Label of a button that applies a blue color in color pickers.", + "Purple": "Label of a button that applies a purple color in color pickers.", + "Editor block content toolbar": "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs).", + "Editor contextual toolbar": "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ar.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ar.po new file mode 100644 index 000000000..5e0ec8ed8 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ar.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://www.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "معالج نصوص" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "منطقة تحرير المحرر: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "كتلة التحرير" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "التالي" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "السابق" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "شريط أدوات المحرر" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "شريط أدوات القائمة المنسدلة" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "أسود" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "رمادي خافت" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "رمادي" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "رمادي فاتح" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "أبيض" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "أحمر" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "برتقالي" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "أصفر" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "أخضر فاتح" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "أخضر" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "أخضر زبرجد" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "فيروزي" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "أزرق فاتح" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "أزرق" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "أرجواني" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "شريط المحرر لأدوات كتلة المحتوى" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "شريط المحرر للأدوات السياقية" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ast.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ast.po new file mode 100644 index 000000000..a84e60cf5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ast.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Asturian (https://www.transifex.com/ckeditor/teams/11143/ast/)\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de testu arriquecíu" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/az.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/az.po new file mode 100644 index 000000000..9f7390d21 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/az.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://www.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Redaktoru" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redaktə etmək bloku" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Növbəti" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Əvvəlki" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktorun paneli" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Açılan paneli" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Qara" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tünd boz" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Boz" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Açıq boz" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Ağ" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Qırmızı" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narıncı" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sarı" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Açıq yaşıl" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Yaşıl" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Firuzəyi" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Açıq mavi" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Mavi" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Bənövşəyi" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/bg.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/bg.po new file mode 100644 index 000000000..fae0d679f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/bg.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://www.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Богат текстов редактор" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Зона за редактиране на редактора: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Редактирай блок" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Следващ" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Предишен" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Лента за редакция" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Лента с падащо меню" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Черен" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Тъмно сив" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Сив" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Светло сив" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Бял" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Червен" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Оранжев" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жълт" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Светло зелен" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелен" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамарин" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Тюркоазен" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Светло син" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Син" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Лилав" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Лента с инструменти за блокиране на съдържанието на редактора" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстна лента с инструменти на редактора" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/bn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/bn.po new file mode 100644 index 000000000..7f329e25b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/bn.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://www.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "রিচ টেক্সট এডিটর" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "সম্পাদক সম্পাদনার ক্ষেত্র: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "এডিট ব্লক" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "পরবর্তী" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "পূর্ববর্তী" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "সম্পাদক টুলবার" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "ড্রপডাউন টুলবার" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "কালো" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "আবছা ধূসর" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "ধূসর" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "হালকা ধূসর" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "সাদা" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "লাল" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "কমলা" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "হলুদ " + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "হালকা সবুজ" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "সবুজ" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "ফেকাশে সবুজবর্ণ" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "ফিরোজা" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "হালকা নীল" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "নীল " + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "বেগুনি" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "সম্পাদক ব্লক কন্টেন্ট টুলবার" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "সম্পাদক প্রাসঙ্গিক টুলবার" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ca.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ca.po new file mode 100644 index 000000000..60ce787f0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ca.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://www.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de text enriquit" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Àrea d'edició d'editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editar bloc" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Següent" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra d'eines de l'editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra d'eines desplegable" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negre" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris fosc" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris clar" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Blanc" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermell" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Taronja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Groc" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verd clar" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verd" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aiguamarina" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Blau clar" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blau" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lila" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra d'eines de contingut del bloc de l'editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra d'eines contextual de l'editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/cs.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/cs.po new file mode 100644 index 000000000..27aa1722d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/cs.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://www.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Textový editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editační oblast editoru: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Upravit blok" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Další" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Předchozí" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Panel nástrojů editoru" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Rozbalovací panel nástrojů" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Černá" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tmavě šedá" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Šedá" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Světle šedá" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bílá" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Červená" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžová" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žlutá" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Světle zelená" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelená" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarínová" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tyrkysová" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Světle modrá" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Modrá" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Fialová" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Panel nástrojů obsahu bloku editoru" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontextový panel nástrojů editoru" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/da.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/da.po new file mode 100644 index 000000000..767c9e2fc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/da.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://www.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Wysiwyg editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redigeringsområde: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redigér blok" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Næste" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Forrige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor værktøjslinje" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown værktøjslinje" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Sort" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dunkel grå" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grå" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Lys grå" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Hvid" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rød" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gyl" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Lys grøn" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grøn" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Marineblå" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Lys blå" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blå" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lilla" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Redigeringskasse indholdsværktøjslinje" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstuel værktøjslinje til redigeringsprogram" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po new file mode 100644 index 000000000..8aa129dcb --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://www.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich-Text-Edito" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/de.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/de.po new file mode 100644 index 000000000..9742abbb0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/de.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://www.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Bearbeitungsbereich des Editors: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Absatz bearbeiten" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Nächste" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "vorherige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor Werkzeugleiste" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown-Liste Werkzeugleiste" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Schwarz" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dunkelgrau" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grau" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Hellgrau" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Weiß" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rot" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gelb" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Hellgrün" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grün" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarinblau" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Türkis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Hellblau" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blau" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violett" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editor Blockinhalt-Toolbar" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editor kontextuelle Toolbar" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/el.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/el.po new file mode 100644 index 000000000..c0b822a89 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/el.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://www.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Επεξεργαστής εμπλουτισμένου κειμένου" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Περιοχή επεξεργασίας προγράμματος επεξεργασίας: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Επεξεργασία τμήματος" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Επόμενο" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Προηγούμενο" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Γραμμή εργαλείων επεξεργαστή" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Γραμμή εργαλείων αναδυόμενου μενού" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Μαύρο" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Θολό γκρι" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Γκρι" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Φωτινό γκρι" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Λευκό" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Κόκκινο" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Πορτοκαλί" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Κίτρινο" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Φωτινό πράσινο" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Πράσινο" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Ακουαμαρίνα" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Τιρκουάζ" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Φωτινό μπλε" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Μπλε" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Πορφυρό" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Γραμμή εργαλείων επεξεργασίας περιεχομένου αποκλεισμού" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Γραμμή εργαλείων επεξεργασίας συμφραζομένων" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en-au.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en-au.po new file mode 100644 index 000000000..7fb638eb2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en-au.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://www.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editor editing area: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor toolbar" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown toolbar" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po new file mode 100644 index 000000000..8d0f59a7e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://www.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en.po new file mode 100644 index 000000000..75689b93d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/en.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editor editing area: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor toolbar" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown toolbar" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editor block content toolbar" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editor contextual toolbar" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/eo.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/eo.po new file mode 100644 index 000000000..87fd89db5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/eo.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Esperanto (https://www.transifex.com/ckeditor/teams/11143/eo/)\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Redaktilo de Riĉa Teksto" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/es.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/es.po new file mode 100644 index 000000000..42a970a1b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/es.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://www.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de Texto Enriquecido" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edición del editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Cuadro de edición" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Siguiente" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra de herramientas de edición" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de herramientas desplegable" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negro" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris Oscuro" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris Claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Blanco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rojo" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Anaranjado" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarillo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde Claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aguamarina" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul Claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Morado" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de herramientas de contenido del bloque del editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de herramientas contextual del editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/et.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/et.po new file mode 100644 index 000000000..5f2104c1d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/et.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://www.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tekstiredaktor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redaktori redigeerimisala: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Muuda plokki" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Järgmine" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Eelmine" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktori tööriistariba" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Avatav tööriistariba" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Must" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tumehall" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Hall" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Helehall" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Valge" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Punane" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranž" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Kollane" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Heleroheline" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Roheline" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamariin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Türkiis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Helesinine" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Sinine" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lilla" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Redigeerija ploki sisu tööriistariba" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Redigeerija kontekstuaalne tööriistariba" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/eu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/eu.po new file mode 100644 index 000000000..f7a9b5e5c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/eu.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://www.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Testu aberastuaren editorea" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fa.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fa.po new file mode 100644 index 000000000..174df3170 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fa.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://www.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "ویرایشگر متن غنی" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "ویرایش قطعه" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "بعدی" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "قبلی" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "نوارابزار ویرایشگر" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "نوارابزار کشویی" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "سیاه" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "خاکستری تیره" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "خاکستری" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "خاکستری روشن" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "سفید" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "قرمز" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "نارنجی" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "زرد" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "سبز روشن" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "سبز" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "زمرد کبود" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "فیروزه ای" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "آبی روشن" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "آبی" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "بنفش" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fi.po new file mode 100644 index 000000000..b6eaaec79 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fi.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://www.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rikas tekstieditori" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editorin muokkausalue: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Muokkaa lohkoa" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seuraava" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Edellinen" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editorin työkalupalkki" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Pudotusvalikon työkalupalkki" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Musta" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Vaaleanharmaa" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Harmaa" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Vaaleanharmaa" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Valkoinen" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Punainen" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranssi" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Keltainen" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Vaaleanvihreä" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Vihreä" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamariini" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkoosi" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Vaaleansininen" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Sininen" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purppura" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editorin lohkon sisällön työkalupalkki" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editorin kontekstuaalinen työkalupalkki" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fr.po new file mode 100644 index 000000000..118274901 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/fr.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://www.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Éditeur de texte enrichi" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Zone d'édition de l'éditeur : %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Modifier le bloc" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Suivant" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Précedent" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barre d'outils de l'éditeur" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barre d'outils dans un menu déroulant" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Noir" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris pâle" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris clair" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Blanc" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rouge" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Jaune" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Vert clair" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Vert" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Bleu vert" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Bleu clair" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Bleu" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violet" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barre d'outils du contenu du bloc éditeur" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barre d'outils contextuelle de l'éditeur" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/gl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/gl.po new file mode 100644 index 000000000..3ec757594 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/gl.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://www.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de texto mellorado" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edición do editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editar bloque" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seguinte" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra de ferramentas do editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de ferramentas despregábel" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negro" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris fume" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Branco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermello" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Laranxa" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarelo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Augamariña" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Púrpura" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/he.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/he.po new file mode 100644 index 000000000..66e16537c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/he.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://www.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "עורך טקסט עשיר" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "אזור עריכה של העורך: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "הגדרות בלוק" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "הבא" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "הקודם" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "סרגל הכלים" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "סרגל כלים נפתח" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "שחור" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "אפור עמום" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "אפור" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "אפור בהיר" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "לבן" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "אדום" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "כתום" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "צהוב" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "ירוק בהיר" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "ירוק" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "ירוק-כחלחל" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "טורקיז" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "כחול בהיר" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "כחול" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "סגול" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "סרגל כלים של תוכן בלוק של העורך" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "סרגל כלים הקשרי של העורך" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hi.po new file mode 100644 index 000000000..951744305 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hi.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://www.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "संपादक संपादन क्षेत्र: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor toolbar" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown toolbar" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "एडीटर ब्लॉक कंटेंट टूलबार" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "एडीटर कॉन्टेक्स्टूअल टूलबार" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hr.po new file mode 100644 index 000000000..ef2220d3f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hr.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://www.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Uredi blok" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Sljedeći" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Prethodni" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Traka uređivača" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Traka padajućeg izbornika" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Crna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tamnosiva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Siva" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Svijetlosiva" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bijela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Crvena" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narančasta" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žuta" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Svijetlozelena" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelena" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tirkizna" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Svijetloplava" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Plava" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ljubičasta" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hu.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hu.po new file mode 100644 index 000000000..f8c695a72 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/hu.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://www.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Bővített szövegszerkesztő" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Szerkesztő szerkesztési területe: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blokk szerkesztése" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Következő" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Előző" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Szerkesztő eszköztár" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Lenyíló eszköztár" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Fekete" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Halvány szürke" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Szürke" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Világosszürke" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Fehér" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Piros" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narancs" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sárga" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Világoszöld" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zöld" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Kékeszöld" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Türkiz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Világoskék" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Kék" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lila" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Szerkesztő - tartalomblokk eszköztár" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Szerkesztő - szövegre vonatkozó eszköztár" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/id.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/id.po new file mode 100644 index 000000000..056aad9f2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/id.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://www.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor Teks Kaya" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Area edit editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Sunting blok" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Berikutnya" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Sebelumnya" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Alat editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Alat dropdown" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Hitam" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Kelabu gelap" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Kelabu" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Kelabu terang" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Putih" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Merah" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Jingga" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Kuning" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Hijau terang" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Hijau" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Biru laut" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkish" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Biru terang" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Biru" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ungu" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Bilah alat konten blok editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Bilah alat kontekstual editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/it.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/it.po new file mode 100644 index 000000000..e0c437e5d --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/it.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://www.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor di testo formattato" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Area di modifica dell'editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Modifica blocco" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Avanti" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Indietro" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra degli strumenti dell'editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra degli strumenti del menu a discesa" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Nero" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Grigio tenue" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grigio" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Grigio chiaro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bianco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rosso" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Arancio" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Giallo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde chiaro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarina" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turchese" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azzurro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blu" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Porpora" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra degli strumenti contestuale dell'editor del blocco" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra degli strumenti contestuale dell'editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ja.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ja.po new file mode 100644 index 000000000..e01e92e0b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ja.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://www.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "リッチテキストエディター" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "エディタ編集エリア:%0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "ブロックを編集" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "次へ" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "前へ" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "エディタツールバー" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "ドロップダウンツールバー" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "黒" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "暗い灰色" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "灰色" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "明るい灰色" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "白" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "赤" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "オレンジ" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "黄" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "明るい緑" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "緑" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "薄い青緑" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "水色" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "明るい青" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "青" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "紫" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "エディター ブロック コンテンツ ツールバー" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "エディター コンテクスト ツールバー" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/km.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/km.po new file mode 100644 index 000000000..e6e269082 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/km.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://www.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "កម្មវិធី​កែសម្រួល​អត្ថបទ​សម្បូរបែប" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/kn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/kn.po new file mode 100644 index 000000000..a105613a3 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/kn.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://www.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "‍ಸಮೃದ್ಧ ಪಠ್ಯ ಸಂಪಾದಕ‍‍" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ko.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ko.po new file mode 100644 index 000000000..794ed6e49 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ko.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://www.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "서식 있는 텍스트 편집기" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "편집기 편집 영역: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "편집 영역" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "다음" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "이전" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "편집기 툴바" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "드롭다운 툴바" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "검은색" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "진한 회색" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "회색" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "밝은 회색" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "흰색" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "빨간색" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "주황색" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "노랑색" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "연한 초록색" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "초록색" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "연한 청록색" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "청록색" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "연한 파랑색" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "파랑색" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "보라색" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "편집기 영역 내용 툴바" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "편집기 문맥 툴바" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ku.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ku.po new file mode 100644 index 000000000..18996cc18 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ku.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://www.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "سەرنوسەری دەقی بەپیت" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "دەستکاری بلۆک" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "دواتر" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "پێشتر" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "تووڵامرازی دەسکاریکەر" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "تووڵامرازی لیستەیی" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "ڕەش" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "ڕەساسی تاریک" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "ڕەساسی" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "ڕەساسی ڕووناک" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "سپی" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "سور" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "پرتەقاڵی" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "زەرد" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "سەوزی ڕووناک" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "سەوز" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "شینی دەریایی" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "شینی ئاسمانی" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "شینی ڕووناک" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "شین" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "مۆر" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/lt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/lt.po new file mode 100644 index 000000000..2deda3033 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/lt.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://www.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Raiškiojo teksto redaktorius" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redaktoriaus redagavimo sritis: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redaguoti bloką" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Kitas" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Buvęs" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktoriaus įrankių juosta" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Įrankių juosta pasirenkamajame sąraše" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Juoda" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Pilkšva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Pilka" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Šviesiai pilka" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Balta" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Raudona" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžinė" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Geltona" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Šviesiai žalia" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Žalia" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkio" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Šviesiai mėlyna" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Mėlyna" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violetinė" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Redaktoriaus bloko turinio įrankių juosta" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Redaktoriaus kontekstinė įrankių juosta" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/lv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/lv.po new file mode 100644 index 000000000..964e3fc11 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/lv.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://www.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Bagātinātais Teksta Redaktors" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redaktora rediģēšanas zona: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Labot bloku" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Nākamā" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Iepriekšējā" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktora rīkjosla" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Papildus izvēlnes rīkjosla" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Melns" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Blāvi pelēks" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Pelēks" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gaiši pelēks" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Balts" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Sarkans" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžs" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Dzeltens" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Gaiši zaļš" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zaļš" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarīns" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tirkīza" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Gaiši zils" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Zils" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violets" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Rediģēšanas bloka satura rīkjosla" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Redaktora konteksta rīkjosla" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ms.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ms.po new file mode 100644 index 000000000..0696a9f4e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ms.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://www.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Penyunting Teks Kaya" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Ruang suntingan editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Sunting blok" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seterusnya" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Sebelumnya" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Bar alat capaian suntingan" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Bar alat capaian tetingkap" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Hitam" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Kelabu malap" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Kelabu" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Kelabu cerah" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Putih" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Merah" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oren" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Kuning" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Hijau cerah" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Hijau" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akuamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Firus" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Biru cerah" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Biru" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ungu" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Bar alat sekat kandungan editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Bar alat kontekstual editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/nb.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/nb.po new file mode 100644 index 000000000..d06fe9188 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/nb.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://www.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rikteksteditor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ne.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ne.po new file mode 100644 index 000000000..3600260a2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ne.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://www.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "धनी पाठ सम्पादक" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "ब्लक सम्पादन गर्न" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "अर्को" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "अघिल्लो" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "कालो" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "धमिलो खैरो" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "खैरो" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "हल्का खैरो" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "सेतो" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "रातो" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "सुन्तला रंग" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "पहेंलो" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "हल्का हरियो" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "हरियो" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "अव्कवामरिन" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "त्रकोइस" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "हल्का निलो" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "निलो" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "बैंगनी रंग" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/nl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/nl.po new file mode 100644 index 000000000..fab73055f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/nl.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://www.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tekstbewerker" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Bewerkingsgebied: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blok aanpassen" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Volgende" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Vorige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor welkbalk" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Drop-down werkbalk" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Zwart" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gedimd grijs" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grijs" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Lichtgrijs" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Wit" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rood" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranje" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Geel" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Lichtgroen" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Groen" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarijn" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Lichtblauw" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blauw" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Paars" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Inhoud werkbalk voor editorblok" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Contextuele werkbalk van editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/no.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/no.po new file mode 100644 index 000000000..8ae64648a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/no.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://www.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tekstredigeringsverktøy for rik tekst" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redigeringsområde for redigeringsverktøyet: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Rediger blokk" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Neste" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Forrige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Verktøylinje for redigeringsverktøy" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Verktøylinje for nedtrekksliste" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Svart" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Svak grå" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grå" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Lysegrå" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Hvit" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rød" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oransje" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gul" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Lysegrønn" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grønn" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Lyseblå" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blå" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lilla" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Verktøylinje for blokkinnhold i redigeringsverktøy" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Verktøylinje for kontekst i redigeringsverktøy" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pl.po new file mode 100644 index 000000000..e8fd14974 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pl.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://www.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Edytor tekstu sformatowanego" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Obszar edycji edytora: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edytuj blok" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Następny" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Poprzedni" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Pasek narzędzi edytora" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Rozwijany pasek narzędzi" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Czarny" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Ciemnoszary" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Szary" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Jasnoszary" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Biały" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Czerwony" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Pomarańczowy" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Żółty" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Jasnozielony" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zielony" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akwamaryna" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkusowy" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Jasnoniebieski" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Niebieski" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purpurowy" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Pasek zadań treści blokowej edytora" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstowy pasek zadań edytora" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po new file mode 100644 index 000000000..25f2b7ccc --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de Formatação" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edição do editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editor de bloco" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Próximo" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Ferramentas do Editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de Ferramentas da Lista Suspensa" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Preto" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Cinza escuro" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Cinza" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Cinza claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Branco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermelho" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Laranja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarelo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Água-marinha" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Púrpura" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de ferramentas de bloco do Editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de ferramentas contextuais do Editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pt.po new file mode 100644 index 000000000..24d13958c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/pt.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://www.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de texto avançado" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edição do editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editar bloco" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seguinte" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra de ferramentas do editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de ferramentas do dropdown" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Preto" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Cinzento-escuro" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Cinzento" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Cinzento-claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Branco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermelho" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Laranja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarelo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde-claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Verde-azulado" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul-claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Roxo" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de ferramentas de edição do conteúdo de blocos" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de ferramentas contextual de edição" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ro.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ro.po new file mode 100644 index 000000000..f861c7b03 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ro.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://www.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de text" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Zonă editare editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editează bloc" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Înainte" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Înapoi" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Bară editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Bară listă opțiuni" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negru" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gri slab" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gri" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gri deschis" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Alb" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Roșu" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Portocaliu" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Galben" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde deschis" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Acvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turcoaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Albastru deschis" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Albastru" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violet" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Bară de instrumente editor pentru blocuri de conținut" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Bară contextuală de instrumente editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ru.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ru.po new file mode 100644 index 000000000..2642c3299 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ru.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://www.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Редактор" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Область редактирования редактора: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Редактировать блок" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Следующий" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Предыдущий" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Панель инструментов редактора" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Выпадающая панель инструментов" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Чёрный" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Тёмно-серый" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Серый" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Светло-серый" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Белый" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Красный" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Оранжевый" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жёлтый" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Салатовый" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелёный" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамариновый" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Бирюзовый" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Голубой" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Синий" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Фиолетовый" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Панель инструментов редактора" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстуальная панель инструментов редактора" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sk.po new file mode 100644 index 000000000..a3203435a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sk.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://www.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor s formátovaním" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Oblasť úprav editora: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Upraviť odsek" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Ďalšie" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Predchádzajúce" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Panel nástrojov editora" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Panel nástrojov roletového menu" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Čierna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tmavosivá" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Sivá" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Bledosivá" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Biela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Červená" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžová" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žltá" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Bledozelená" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelená" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarínová" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tyrkysová" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Bledomodrá" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Modrá" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Fialová" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Panel s nástrojmi obsahu bloku editora" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontextový panel nástrojov editora" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sl.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sl.po new file mode 100644 index 000000000..cc80cbaf0 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sl.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://www.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Črna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Temno siva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Siva" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Svetlo siva" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rdeča" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžna" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Rumena" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Svetlo zelena" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelena" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkizna" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Svetlo modra" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Modra" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Vijolična" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sq.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sq.po new file mode 100644 index 000000000..065809b05 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sq.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://www.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Redaktues i Tekstit të Pasur" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po new file mode 100644 index 000000000..e57aec5fa --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://www.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Prošireni uređivač teksta" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Oblast za uređivanje urednika: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blok uređivač" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Sledeći" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Prethodni" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Uređivač traka sa alatkama" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Padajuća traka sa alatkama" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Crna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Bledo siva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Siva" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Svetlo siva" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Crvena" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narandžasta" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žuta" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Svetlo zelena" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelena" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Zelenkastoplava" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tirkizna" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Svetloplava" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Plava" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ljubičasta" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Traka sa alatkama za blokiranje sadržaja uređivača" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstualna traka sa alatkama Editor" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sr.po new file mode 100644 index 000000000..17bc23462 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sr.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://www.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Проширен уређивач текста" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Област за уређивање уредника: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Блок уређивач" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Следећи" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Претходни" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Уређивач трака са алаткама" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Падајућа трака са алаткама" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Црна" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Бледо сива" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Сива" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Светло сива" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Бела" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Црвена" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Нараџаста" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жута" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Светлозелена" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелена" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Зеленкастоплава" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Тиркизна" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Светлоплава" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Плава" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Љубичаста" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Трака са алаткама за блокирање садржаја уређивача" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстуална трака са алаткама Едитор" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sv.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sv.po new file mode 100644 index 000000000..22709b3b6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/sv.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://www.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text-editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Ordbehandlares redigeringsområde: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redigera block" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Nästa" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Föregående" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redigeringsverktygsfält" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Rullgardinsverktygsfält" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Svart" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dunkelgrå" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grå" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Ljusgrå" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Vit" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Röd" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gul" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Ljusgrön" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grön" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkos" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Ljusblå" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blå" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lila" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Verktygsfält vid block av innehåll" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Ordbehandlarens kontextuella verktygsfält" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/th.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/th.po new file mode 100644 index 000000000..93ffc3c9a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/th.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://www.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "โปรแกรมแก้ไข Rich Text" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "พื้นที่แก้ไขของตัวแก้ไข: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "แก้ไขบล็อก" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "ถัดไป" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "ก่อนหน้า" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "แถบเครื่องมือแก้ไข" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "แถบเครื่องมือแบบเลื่อนลง" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "สีดำ" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "สีเทาเข้ม" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "สีเทา" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "สีเทาอ่อน" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "สีขาว" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "สีแดง" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "สีส้ม" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "สีเหลือง" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "สีเขียวอ่อน" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "สีเขียว" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "พลอยสีฟ้า" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "สีเขียวขุ่น" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "สีฟ้า" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "สีน้ำเงิน" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "สีม่วง" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "แถบเครื่องมือแก้ไขบล็อกเนื้อหา" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "แถบเครื่องมือแก้ไขข้อความ" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tk.po new file mode 100644 index 000000000..1ca7d4a40 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tk.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://www.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Baý Tekst Redaktory" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Bloky redaktirläň" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Indiki" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Öňki" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktor gurallar paneli" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Açylýan gurallar paneli" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Gara" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Goýy çal" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Çal" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Açyk çal" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Ak" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Gyzyl" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Mämişi" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sary" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Açyk ýaşyl" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Ýaşyl" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akuamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkuaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Açyk gök" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Gök" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Gyrmyzy" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tr.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tr.po new file mode 100644 index 000000000..09bd61012 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tr.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://www.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Zengin İçerik Editörü" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editör düzenleme alanı: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Bloğu Düzenle" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Sonraki" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Önceki" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Düzenleme araç çubuğu" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Açılır araç çubuğu" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Siyah" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Koyu Gri" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gri" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Açık Gri" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Beyaz" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Kırmızı" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Turuncu" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sarı" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Açık Yeşil" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Yeşil" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Su Yeşili" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkuaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Açık Mavi" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Mavi" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Mor" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Düzenleyici engelleme içerik araç çubuğu" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Düzenleyici içeriksel araç çubuğu" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tt.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tt.po new file mode 100644 index 000000000..3d32f67e6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/tt.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Tatar (https://www.transifex.com/ckeditor/teams/11143/tt/)\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Кара" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Соры" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Ачык соры" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Ак" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Кызыл" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Кызгылт" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Сары" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Ачык яшел" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Яшел" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамарин" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Фервоз" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Ачык зәңгәр" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Зәңгәр" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Шәмәхә" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ug.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ug.po new file mode 100644 index 000000000..68ec21b58 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ug.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://www.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "تېكىست تەھرىرلىگۈچ" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/uk.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/uk.po new file mode 100644 index 000000000..ccf4a2a61 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/uk.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://www.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Розширений текстовий редактор" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Область редагування редактора: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Редагувати блок" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Наступний" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Попередній" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Панель інструментів редактора" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Випадаюча панель інструментів" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Чорний" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Темно-сірий" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Сірий" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Світло-сірий" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Білий" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Червоний" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Помаранчевий" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жовтий" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Світло-зелений" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелений" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамариновий" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Бірюзовий" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Світло-синій" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Синій" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Фіолетовий" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Панель інструментів вмісту блоку редактора" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстна панель інструментів редактора" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ur.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ur.po new file mode 100644 index 000000000..dbb7c9905 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/ur.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://www.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "خانۂ ترمیم" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "رقبہ خانۂ ترمیم: 0%" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "خانہ کی تدوین" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "اگلا" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "پچھلا" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "ایڈیٹر آلہ جات" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "آلہ جات برائے فہرست " + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "سیاہ" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "پھیکا سرمئی" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "سرمئی" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "ہلکا سرمئی" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "سفید" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "سرخ" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "نارنجی" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "پیلا" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "ہلکا سبز" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "سبز" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "نیلگوں بلور" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "فیروزی" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "ہلکا نیلا" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "نیلا" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "ارغوانی" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/uz.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/uz.po new file mode 100644 index 000000000..864ae9815 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/uz.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://www.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tahrirlovchi" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blokni tahrirlash" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Keyingi" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Oldingi" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Tahrirlovchi asboblar paneli" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Ochiladigan asboblar paneli" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Qora" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "To'q kulrang" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Kulrang" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Och kulrang" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Oq" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Qizil" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "To'q sariq" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sariq" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Och yashil" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Yashil" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akuamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkuaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Moviy" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Ko'k" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Siyohrang" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/vi.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/vi.po new file mode 100644 index 000000000..cf4ee04c6 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/vi.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://www.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Trình soạn thảo văn bản" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Vùng chỉnh sửa của trình chỉnh sửa: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Chỉnh sửa đoạn" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Tiếp theo" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Quay lại" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Thanh công cụ biên tập" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Thanh công cụ danh mục" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Đen" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Xám mờ" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Xám" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Xám nhạt" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Trắng" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Đỏ" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Cam" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Vàng" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Xanh lá nhạt" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Xanh lá" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Xanh ngọc biển" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Xanh ngọc bích" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Xanh dương" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Xanh biển" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Tím" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Thanh công cụ chỉnh sửa khối nội dung" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Thanh công cụ chỉnh sửa theo ngữ cảnh" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po new file mode 100644 index 000000000..6767b0316 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://www.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "富文本编辑器" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "编辑器编辑区域:%0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "编辑框" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "下一步" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "上一步" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "编辑器工具栏" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "下拉工具栏" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "黑色" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "暗灰色" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "灰色" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "浅灰色" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "白色" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "红色" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "橙色" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "黄色" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "浅绿色" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "绿色" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "海蓝色" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "青色" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "浅蓝色" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "蓝色" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "紫色" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "编辑器块内容工具栏" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "编辑器上下文工具栏" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/zh.po b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/zh.po new file mode 100644 index 000000000..17d44541f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/lang/translations/zh.po @@ -0,0 +1,113 @@ +# Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "豐富文字編輯器" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "編輯器編輯區:%0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "編輯區塊" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "下一" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "上一" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "編輯器工具" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "下拉選單" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "黑色" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "淡灰色" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "灰色" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "亮灰色" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "白色" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "紅色" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "橘色" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "黃色" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "亮綠色" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "綠色" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "淺綠色" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "藍綠色" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "亮藍色" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "藍色" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "紫色" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "編輯器區塊內容工具列" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "編輯器關聯式工具列" diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/package.json b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/package.json new file mode 100644 index 000000000..06253fc8e --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/package.json @@ -0,0 +1,66 @@ +{ + "name": "@ckeditor/ckeditor5-ui", + "version": "36.0.1", + "description": "The UI framework and standard UI library of CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-lib", + "ckeditor5-dll" + ], + "main": "src/index.js", + "dependencies": { + "@ckeditor/ckeditor5-utils": "^36.0.1", + "@ckeditor/ckeditor5-core": "^36.0.1", + "lodash-es": "^4.17.15" + }, + "devDependencies": { + "@ckeditor/ckeditor5-basic-styles": "^36.0.1", + "@ckeditor/ckeditor5-block-quote": "^36.0.1", + "@ckeditor/ckeditor5-editor-balloon": "^36.0.1", + "@ckeditor/ckeditor5-editor-classic": "^36.0.1", + "@ckeditor/ckeditor5-engine": "^36.0.1", + "@ckeditor/ckeditor5-enter": "^36.0.1", + "@ckeditor/ckeditor5-essentials": "^36.0.1", + "@ckeditor/ckeditor5-font": "^36.0.1", + "@ckeditor/ckeditor5-find-and-replace": "^36.0.1", + "@ckeditor/ckeditor5-heading": "^36.0.1", + "@ckeditor/ckeditor5-image": "^36.0.1", + "@ckeditor/ckeditor5-link": "^36.0.1", + "@ckeditor/ckeditor5-list": "^36.0.1", + "@ckeditor/ckeditor5-mention": "^36.0.1", + "@ckeditor/ckeditor5-paragraph": "^36.0.1", + "@ckeditor/ckeditor5-horizontal-line": "^36.0.1", + "@ckeditor/ckeditor5-table": "^36.0.1", + "@ckeditor/ckeditor5-typing": "^36.0.1", + "typescript": "^4.8.4", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=5.7.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-ui" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc -p ./tsconfig.release.json", + "postversion": "npm run build" + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js new file mode 100644 index 000000000..8084649d2 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js @@ -0,0 +1,99 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/addkeyboardhandlingforgrid + */ +/** + * A helper that adds a keyboard navigation support (arrow up/down/left/right) for grids. + * + * @param {Object} options Configuration options. + * @param {module:utils/keystrokehandler~KeystrokeHandler} options.keystrokeHandler Keystroke handler to register navigation with arrow + * keys. + * @param {module:utils/focustracker~FocusTracker} options.focusTracker A focus tracker for grid elements. + * @param {module:ui/viewcollection~ViewCollection} options.gridItems A collection of grid items. + * @param {Number|Function} options.numberOfColumns Number of columns in the grid. Can be specified as a function that returns + * the number (e.g. for responsive grids). + * @param {String|undefined} options.uiLanguageDirection String of ui language direction. + */ +export default function addKeyboardHandlingForGrid({ keystrokeHandler, focusTracker, gridItems, numberOfColumns, uiLanguageDirection }) { + const getNumberOfColumns = typeof numberOfColumns === 'number' ? () => numberOfColumns : numberOfColumns; + keystrokeHandler.set('arrowright', getGridItemFocuser((focusedElementIndex, gridItems) => { + return uiLanguageDirection === 'rtl' ? + getLeftElementIndex(focusedElementIndex, gridItems.length) : + getRightElementIndex(focusedElementIndex, gridItems.length); + })); + keystrokeHandler.set('arrowleft', getGridItemFocuser((focusedElementIndex, gridItems) => { + return uiLanguageDirection === 'rtl' ? + getRightElementIndex(focusedElementIndex, gridItems.length) : + getLeftElementIndex(focusedElementIndex, gridItems.length); + })); + keystrokeHandler.set('arrowup', getGridItemFocuser((focusedElementIndex, gridItems) => { + let nextIndex = focusedElementIndex - getNumberOfColumns(); + if (nextIndex < 0) { + nextIndex = focusedElementIndex + getNumberOfColumns() * Math.floor(gridItems.length / getNumberOfColumns()); + if (nextIndex > gridItems.length - 1) { + nextIndex -= getNumberOfColumns(); + } + } + return nextIndex; + })); + keystrokeHandler.set('arrowdown', getGridItemFocuser((focusedElementIndex, gridItems) => { + let nextIndex = focusedElementIndex + getNumberOfColumns(); + if (nextIndex > gridItems.length - 1) { + nextIndex = focusedElementIndex % getNumberOfColumns(); + } + return nextIndex; + })); + function getGridItemFocuser(getIndexToFocus) { + return (evt) => { + const focusedElement = gridItems.find(item => item.element === focusTracker.focusedElement); + const focusedElementIndex = gridItems.getIndex(focusedElement); + const nextIndexToFocus = getIndexToFocus(focusedElementIndex, gridItems); + gridItems.get(nextIndexToFocus).focus(); + evt.stopPropagation(); + evt.preventDefault(); + }; + } + // Function returning the next index. + // + // before: [ ][x][ ] after: [ ][ ][x] + // index = 1 index = 2 + // + // If current index is last, function returns first index. + // + // before: [ ][ ][x] after: [x][ ][ ] + // index = 2 index = 0 + // + // @param {number} [elementIndex] Number of current index. + // @param {number} [collectionLength] A count of collection items. + function getRightElementIndex(elementIndex, collectionLength) { + if (elementIndex === collectionLength - 1) { + return 0; + } + else { + return elementIndex + 1; + } + } + // Function returning the previous index. + // + // before: [ ][x][ ] after: [x][ ][ ] + // index = 1 index = 0 + // + // If current index is first, function returns last index. + // + // before: [x][ ][ ] after: [ ][ ][x] + // index = 0 index = 2 + // + // @param {number} [elementIndex] Number of current index. + // @param {number} [collectionLength] A count of collection items. + function getLeftElementIndex(elementIndex, collectionLength) { + if (elementIndex === 0) { + return collectionLength - 1; + } + else { + return elementIndex - 1; + } + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js new file mode 100644 index 000000000..834f8f511 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js @@ -0,0 +1,37 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* global document */ +/** + * Handles clicking **outside** of a specified set of elements, then fires an action. + * + * **Note**: Actually, the action is executed upon `mousedown`, not `click`. It prevents + * certain issues when the user keeps holding the mouse button and the UI cannot react + * properly. + * + * @param {Object} options Configuration options. + * @param {module:utils/dom/emittermixin~Emitter} options.emitter The emitter to which this behavior + * should be added. + * @param {Function} options.activator Function returning a `Boolean`, to determine whether the handler is active. + * @param {Array.} options.contextElements Array of HTML elements or a callback returning an array of HTML elements + * that determine the scope of the handler. Clicking any of them or their descendants will **not** fire the callback. + * @param {Function} options.callback An action executed by the handler. + */ +export default function clickOutsideHandler({ emitter, activator, callback, contextElements }) { + emitter.listenTo(document, 'mousedown', (evt, domEvt) => { + if (!activator()) { + return; + } + // Check if `composedPath` is `undefined` in case the browser does not support native shadow DOM. + // Can be removed when all supported browsers support native shadow DOM. + const path = typeof domEvt.composedPath == 'function' ? domEvt.composedPath() : []; + const contextElementsList = typeof contextElements == 'function' ? contextElements() : contextElements; + for (const contextElement of contextElementsList) { + if (contextElement.contains(domEvt.target) || path.includes(contextElement)) { + return; + } + } + callback(); + }); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js new file mode 100644 index 000000000..f5efc1de7 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js @@ -0,0 +1,68 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/injectcsstransitiondisabler + */ +/** + * A decorator that brings the possibility to temporarily disable CSS transitions using + * {@link module:ui/view~View} methods. It is helpful when, for instance, the transitions should not happen + * when the view is first displayed but they should work normal in other cases. + * + * The methods to control the CSS transitions are: + * * `disableCssTransitions()` – Adds the `.ck-transitions-disabled` class to the + * {@link module:ui/view~View#element view element}. + * * `enableCssTransitions()` – Removes the `.ck-transitions-disabled` class from the + * {@link module:ui/view~View#element view element}. + * + * **Note**: This helper extends the {@link module:ui/view~View#template template} and must be used **after** + * {@link module:ui/view~View#setTemplate} is called: + * + * import injectCssTransitionDisabler from '@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler'; + * + * class MyView extends View { + * constructor() { + * super(); + * + * // ... + * + * this.setTemplate( { ... } ); + * + * // ... + * + * injectCssTransitionDisabler( this ); + * + * // ... + * } + * } + * + * The usage comes down to: + * + * const view = new MyView(); + * + * // ... + * + * view.disableCssTransitions(); + * view.show(); + * view.enableCssTransitions(); + * + * @param {module:ui/view~View} view View instance that should get this functionality. + */ +export default function injectCssTransitionDisabler(view) { + const decorated = view; + decorated.set('_isCssTransitionsDisabled', false); + decorated.disableCssTransitions = () => { + decorated._isCssTransitionsDisabled = true; + }; + decorated.enableCssTransitions = () => { + decorated._isCssTransitionsDisabled = false; + }; + decorated.extendTemplate({ + attributes: { + class: [ + decorated.bindTemplate.if('_isCssTransitionsDisabled', 'ck-transitions-disabled') + ] + } + }); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js new file mode 100644 index 000000000..3cb161db5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js @@ -0,0 +1,36 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/preventdefault + */ +/** + * A helper which executes a native `Event.preventDefault()` if the target of an event equals the + * {@link module:ui/view~View#element element of the view}. It shortens the definition of a + * {@link module:ui/view~View#template template}. + * + * // In a class extending View. + * import preventDefault from '@ckeditor/ckeditor5-ui/src/bindings/preventdefault'; + * + * // ... + * + * this.setTemplate( { + * tag: 'div', + * + * on: { + * // Prevent the default mousedown action on this view. + * mousedown: preventDefault( this ) + * } + * } ); + * + * @param {module:ui/view~View} view View instance that defines the template. + * @returns {module:ui/template~TemplateToBinding} + */ +export default function preventDefault(view) { + return view.bindTemplate.to(evt => { + if (evt.target === view.element) { + evt.preventDefault(); + } + }); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js new file mode 100644 index 000000000..f9df1e019 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/submithandler + */ +/** + * A handler useful for {@link module:ui/view~View views} working as HTML forms. It intercepts a native DOM + * `submit` event, prevents the default web browser behavior (navigation and page reload) and + * fires the `submit` event on a view instead. Such a custom event can be then used by any + * {@link module:utils/dom/emittermixin~Emitter emitter}, e.g. to serialize the form data. + * + * import submitHandler from '@ckeditor/ckeditor5-ui/src/bindings/submithandler'; + * + * // ... + * + * class AnyFormView extends View { + * constructor() { + * super(); + * + * // ... + * + * submitHandler( { + * view: this + * } ); + * } + * } + * + * // ... + * + * const view = new AnyFormView(); + * + * // A sample listener attached by an emitter working with the view. + * this.listenTo( view, 'submit', () => { + * saveTheFormData(); + * hideTheForm(); + * } ); + * + * @param {Object} [options] Configuration options. + * @param {module:ui/view~View} options.view The view which DOM `submit` events should be handled. + */ +export default function submitHandler({ view }) { + view.listenTo(view.element, 'submit', (evt, domEvt) => { + domEvt.preventDefault(); + view.fire('submit'); + }, { useCapture: true }); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/button.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/button.js new file mode 100644 index 000000000..52f0f122b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/button.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/buttonview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/buttonview.js new file mode 100644 index 000000000..218537581 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/buttonview.js @@ -0,0 +1,252 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/buttonview + */ +import View from '../view'; +import IconView from '../icon/iconview'; +import { env, getEnvKeystrokeText, uid } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/button/button.css'; +/** + * The button view class. + * + * const view = new ButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true, + * withText: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * + * @extends module:ui/view~View + * @implements module:ui/button/button~Button + */ +export default class ButtonView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + const ariaLabelUid = uid(); + // Implement the Button interface. + this.set('class', undefined); + this.set('labelStyle', undefined); + this.set('icon', undefined); + this.set('isEnabled', true); + this.set('isOn', false); + this.set('isVisible', true); + this.set('isToggleable', false); + this.set('keystroke', undefined); + this.set('label', undefined); + this.set('tabindex', -1); + this.set('tooltip', false); + this.set('tooltipPosition', 's'); + this.set('type', 'button'); + this.set('withText', false); + this.set('withKeystroke', false); + /** + * Collection of the child views inside of the button {@link #element}. + * + * @readonly + * @member {module:ui/viewcollection~ViewCollection} + */ + this.children = this.createCollection(); + /** + * Label of the button view. It is configurable using the {@link #label label attribute}. + * + * @readonly + * @member {module:ui/view~View} #labelView + */ + this.labelView = this._createLabelView(ariaLabelUid); + /** + * The icon view of the button. Will be added to {@link #children} when the + * {@link #icon icon attribute} is defined. + * + * @readonly + * @member {module:ui/icon/iconview~IconView} #iconView + */ + this.iconView = new IconView(); + this.iconView.extendTemplate({ + attributes: { + class: 'ck-button__icon' + } + }); + /** + * A view displaying the keystroke of the button next to the {@link #labelView label}. + * Added to {@link #children} when the {@link #withKeystroke `withKeystroke` attribute} + * is defined. + * + * @readonly + * @member {module:ui/view/view~View} #keystrokeView + */ + this.keystrokeView = this._createKeystrokeView(); + /** + * Tooltip of the button bound to the template. + * + * @see #tooltip + * @see #_getTooltipString + * @private + * @observable + * @member {String|undefined} #_tooltipString + */ + this.bind('_tooltipString').to(this, 'tooltip', this, 'label', this, 'keystroke', this._getTooltipString.bind(this)); + const template = { + tag: 'button', + attributes: { + class: [ + 'ck', + 'ck-button', + bind.to('class'), + bind.if('isEnabled', 'ck-disabled', value => !value), + bind.if('isVisible', 'ck-hidden', value => !value), + bind.to('isOn', value => value ? 'ck-on' : 'ck-off'), + bind.if('withText', 'ck-button_with-text'), + bind.if('withKeystroke', 'ck-button_with-keystroke') + ], + type: bind.to('type', value => value ? value : 'button'), + tabindex: bind.to('tabindex'), + 'aria-labelledby': `ck-editor__aria-label_${ariaLabelUid}`, + 'aria-disabled': bind.if('isEnabled', true, value => !value), + 'aria-pressed': bind.to('isOn', value => this.isToggleable ? String(!!value) : false), + 'data-cke-tooltip-text': bind.to('_tooltipString'), + 'data-cke-tooltip-position': bind.to('tooltipPosition') + }, + children: this.children, + on: { + click: bind.to(evt => { + // We can't make the button disabled using the disabled attribute, because it won't be focusable. + // Though, shouldn't this condition be moved to the button controller? + if (this.isEnabled) { + this.fire('execute'); + } + else { + // Prevent the default when button is disabled, to block e.g. + // automatic form submitting. See ckeditor/ckeditor5-link#74. + evt.preventDefault(); + } + }) + } + }; + // On Safari we have to force the focus on a button on click as it's the only browser + // that doesn't do that automatically. See #12115. + if (env.isSafari) { + template.on.mousedown = bind.to(evt => { + this.focus(); + evt.preventDefault(); + }); + } + this.setTemplate(template); + } + /** + * @inheritDoc + */ + render() { + super.render(); + if (this.icon) { + this.iconView.bind('content').to(this, 'icon'); + this.children.add(this.iconView); + } + this.children.add(this.labelView); + if (this.withKeystroke && this.keystroke) { + this.children.add(this.keystrokeView); + } + } + /** + * Focuses the {@link #element} of the button. + */ + focus() { + this.element.focus(); + } + /** + * Creates a label view instance and binds it with button attributes. + * + * @private + * @param {String} ariaLabelUid The aria label UID. + * @returns {module:ui/view~View} + */ + _createLabelView(ariaLabelUid) { + const labelView = new View(); + const bind = this.bindTemplate; + labelView.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__label' + ], + style: bind.to('labelStyle'), + id: `ck-editor__aria-label_${ariaLabelUid}` + }, + children: [ + { + text: this.bindTemplate.to('label') + } + ] + }); + return labelView; + } + /** + * Creates a view that displays a keystroke next to a {@link #labelView label } + * and binds it with button attributes. + * + * @private + * @returns {module:ui/view~View} + */ + _createKeystrokeView() { + const keystrokeView = new View(); + keystrokeView.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__keystroke' + ] + }, + children: [ + { + text: this.bindTemplate.to('keystroke', text => getEnvKeystrokeText(text)) + } + ] + }); + return keystrokeView; + } + /** + * Gets the text for the tooltip from the combination of + * {@link #tooltip}, {@link #label} and {@link #keystroke} attributes. + * + * @private + * @see #tooltip + * @see #_tooltipString + * @param {Boolean|String|Function} tooltip Button tooltip. + * @param {String} label Button label. + * @param {String} keystroke Button keystroke. + * @returns {String} + */ + _getTooltipString(tooltip, label, keystroke) { + if (tooltip) { + if (typeof tooltip == 'string') { + return tooltip; + } + else { + if (keystroke) { + keystroke = getEnvKeystrokeText(keystroke); + } + if (tooltip instanceof Function) { + return tooltip(label, keystroke); + } + else { + return `${label}${keystroke ? ` (${keystroke})` : ''}`; + } + } + } + return ''; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js new file mode 100644 index 000000000..a49259445 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js @@ -0,0 +1,84 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/switchbuttonview + */ +import View from '../view'; +import ButtonView from './buttonview'; +import '../../theme/components/button/switchbutton.css'; +/** + * The switch button view class. + * + * const view = new SwitchButtonView(); + * + * view.set( { + * withText: true, + * label: 'Switch me!' + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * + * @extends module:ui/button/buttonview~ButtonView + */ +export default class SwitchButtonView extends ButtonView { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.isToggleable = true; + /** + * The toggle switch of the button. + * + * @readonly + * @member {module:ui/view~View} #toggleSwitchView + */ + this.toggleSwitchView = this._createToggleView(); + this.extendTemplate({ + attributes: { + class: 'ck-switchbutton' + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this.toggleSwitchView); + } + /** + * Creates a toggle child view. + * + * @private + * @returns {module:ui/view~View} + */ + _createToggleView() { + const toggleSwitchView = new View(); + toggleSwitchView.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__toggle' + ] + }, + children: [ + { + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__toggle__inner' + ] + } + } + ] + }); + return toggleSwitchView; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js new file mode 100644 index 000000000..a75aedd86 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js @@ -0,0 +1,156 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/colorgrid + */ +import View from '../view'; +import ColorTileView from './colortileview'; +import KeystrokeHandler from '@ckeditor/ckeditor5-utils/src/keystrokehandler'; +import addKeyboardHandlingForGrid from '../bindings/addkeyboardhandlingforgrid'; +import { FocusTracker } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/colorgrid/colorgrid.css'; +/** + * A grid of {@link module:ui/colorgrid/colortile~ColorTileView color tiles}. + * + * @extends module:ui/view~View + */ +export default class ColorGridView extends View { + /** + * Creates an instance of a color grid containing {@link module:ui/colorgrid/colortile~ColorTileView tiles}. + * + * @param {module:utils/locale~Locale} [locale] The localization services instance. + * @param {Object} options Component configuration + * @param {Array.} [options.colorDefinitions] Array with definitions + * required to create the {@link module:ui/colorgrid/colortile~ColorTileView tiles}. + * @param {Number} [options.columns=5] A number of columns to display the tiles. + */ + constructor(locale, options) { + super(locale); + const colorDefinitions = options && options.colorDefinitions || []; + /** + * A number of columns for the tiles grid. + * + * @readonly + * @member {Number} + */ + this.columns = options && options.columns ? options.columns : 5; + const viewStyleAttribute = { + gridTemplateColumns: `repeat( ${this.columns}, 1fr)` + }; + /** + * The color of the currently selected color tile in {@link #items}. + * + * @observable + * @type {String} + */ + this.set('selectedColor', undefined); + /** + * Collection of the child tile views. + * + * @readonly + * @member {module:ui/viewcollection~ViewCollection} + */ + this.items = this.createCollection(); + /** + * Tracks information about DOM focus in the grid. + * + * @readonly + * @member {module:utils/focustracker~FocusTracker} + */ + this.focusTracker = new FocusTracker(); + /** + * Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. + * + * @readonly + * @member {module:utils/keystrokehandler~KeystrokeHandler} + */ + this.keystrokes = new KeystrokeHandler(); + this.items.on('add', (evt, colorTile) => { + colorTile.isOn = colorTile.color === this.selectedColor; + }); + colorDefinitions.forEach(color => { + const colorTile = new ColorTileView(); + colorTile.set({ + color: color.color, + label: color.label, + tooltip: true, + hasBorder: color.options.hasBorder + }); + colorTile.on('execute', () => { + this.fire('execute', { + value: color.color, + hasBorder: color.options.hasBorder, + label: color.label + }); + }); + this.items.add(colorTile); + }); + this.setTemplate({ + tag: 'div', + children: this.items, + attributes: { + class: [ + 'ck', + 'ck-color-grid' + ], + style: viewStyleAttribute + } + }); + this.on('change:selectedColor', (evt, name, selectedColor) => { + for (const item of this.items) { + item.isOn = item.color === selectedColor; + } + }); + } + /** + * Focuses the first focusable in {@link #items}. + */ + focus() { + if (this.items.length) { + this.items.first.focus(); + } + } + /** + * Focuses the last focusable in {@link #items}. + */ + focusLast() { + if (this.items.length) { + this.items.last.focus(); + } + } + /** + * @inheritDoc + */ + render() { + super.render(); + // Items added before rendering should be known to the #focusTracker. + for (const item of this.items) { + this.focusTracker.add(item.element); + } + this.items.on('add', (evt, item) => { + this.focusTracker.add(item.element); + }); + this.items.on('remove', (evt, item) => { + this.focusTracker.remove(item.element); + }); + // Start listening for the keystrokes coming from #element. + this.keystrokes.listenTo(this.element); + addKeyboardHandlingForGrid({ + keystrokeHandler: this.keystrokes, + focusTracker: this.focusTracker, + gridItems: this.items, + numberOfColumns: this.columns, + uiLanguageDirection: this.locale && this.locale.uiLanguageDirection + }); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this.focusTracker.destroy(); + this.keystrokes.destroy(); + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js new file mode 100644 index 000000000..3748f633f --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js @@ -0,0 +1,53 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/colortile + */ +import ButtonView from '../button/buttonview'; +import checkIcon from '../../theme/icons/color-tile-check.svg'; +/** + * This class represents a single color tile in the {@link module:ui/colorgrid/colorgrid~ColorGridView}. + * + * @extends module:ui/button/buttonview~ButtonView + */ +export default class ColorTileView extends ButtonView { + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + /** + * String representing a color shown as tile's background. + * + * @type {String} + */ + this.set('color', undefined); + /** + * A flag that toggles a special CSS class responsible for displaying + * a border around the button. + * + * @type {Boolean} + */ + this.set('hasBorder', false); + this.icon = checkIcon; + this.extendTemplate({ + attributes: { + style: { + backgroundColor: bind.to('color') + }, + class: [ + 'ck', + 'ck-color-grid__tile', + bind.if('hasBorder', 'ck-color-table__color-tile_bordered') + ] + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.iconView.fillColor = 'hsl(0, 0%, 100%)'; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js new file mode 100644 index 000000000..a4929c9ff --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js @@ -0,0 +1,90 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns color configuration options as defined in `editor.config.(fontColor|fontBackgroundColor).colors` or + * `editor.config.table.(tableProperties|tableCellProperties).(background|border).colors + * but processed to account for editor localization in the correct language. + * + * Note: The reason behind this method is that there is no way to use {@link module:utils/locale~Locale#t} + * when the user configuration is defined because the editor does not exist yet. + * + * @param {module:utils/locale~Locale} locale The {@link module:core/editor/editor~Editor#locale} instance. + * @param {Array.} options + * @returns {Array.}. + */ +export function getLocalizedColorOptions(locale, options) { + const t = locale.t; + const localizedColorNames = { + Black: t('Black'), + 'Dim grey': t('Dim grey'), + Grey: t('Grey'), + 'Light grey': t('Light grey'), + White: t('White'), + Red: t('Red'), + Orange: t('Orange'), + Yellow: t('Yellow'), + 'Light green': t('Light green'), + Green: t('Green'), + Aquamarine: t('Aquamarine'), + Turquoise: t('Turquoise'), + 'Light blue': t('Light blue'), + Blue: t('Blue'), + Purple: t('Purple') + }; + return options.map(colorOption => { + const label = localizedColorNames[colorOption.label]; + if (label && label != colorOption.label) { + colorOption.label = label; + } + return colorOption; + }); +} +/** + * Creates a unified color definition object from color configuration options. + * The object contains the information necessary to both render the UI and initialize the conversion. + * + * @param {module:ui/colorgrid/colorgrid~ColorDefinition} options + * @returns {Array.} + */ +export function normalizeColorOptions(options) { + return options + .map(normalizeSingleColorDefinition) + .filter(option => !!option); +} +// Creates a normalized color definition from the user-defined configuration. +// The "normalization" means it will create full +// {@link module:ui/colorgrid/colorgrid~ColorDefinition `ColorDefinition-like`} +// object for string values, and add a `view` property, for each definition. +// +// @param {String|module:ui/colorgrid/colorgrid~ColorDefinition} +// @returns {module:ui/colorgrid/colorgrid~ColorDefinition} +export function normalizeSingleColorDefinition(color) { + if (typeof color === 'string') { + return { + model: color, + label: color, + hasBorder: false, + view: { + name: 'span', + styles: { + color + } + } + }; + } + else { + return { + model: color.color, + label: color.label || color.color, + hasBorder: color.hasBorder === undefined ? false : color.hasBorder, + view: { + name: 'span', + styles: { + color: `${color.color}` + } + } + }; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/componentfactory.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/componentfactory.js new file mode 100644 index 000000000..275179494 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/componentfactory.js @@ -0,0 +1,118 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/componentfactory + */ +import { CKEditorError } from '@ckeditor/ckeditor5-utils'; +/** + * A helper class implementing the UI component ({@link module:ui/view~View view}) factory. + * + * It allows functions producing specific UI components to be registered under their unique names + * in the factory. A registered component can be then instantiated by providing its name. + * Note that the names are case insensitive. + * + * // The editor provides localization tools for the factory. + * const factory = new ComponentFactory( editor ); + * + * factory.add( 'foo', locale => new FooView( locale ) ); + * factory.add( 'bar', locale => new BarView( locale ) ); + * + * // An instance of FooView. + * const fooInstance = factory.create( 'foo' ); + * + * // Names are case insensitive so this is also allowed: + * const barInstance = factory.create( 'Bar' ); + * + * The {@link module:core/editor/editor~Editor#locale editor locale} is passed to the factory + * function when {@link module:ui/componentfactory~ComponentFactory#create} is called. + */ +export default class ComponentFactory { + /** + * Creates an instance of the factory. + * + * @constructor + * @param {module:core/editor/editor~Editor} editor The editor instance. + */ + constructor(editor) { + /** + * The editor instance that the factory belongs to. + * + * @readonly + * @member {module:core/editor/editor~Editor} + */ + this.editor = editor; + /** + * Registered component factories. + * + * @private + * @member {Map} + */ + this._components = new Map(); + } + /** + * Returns an iterator of registered component names. Names are returned in lower case. + * + * @returns {Iterable.} + */ + *names() { + for (const value of this._components.values()) { + yield value.originalName; + } + } + /** + * Registers a component factory function that will be used by the + * {@link #create create} method and called with the + * {@link module:core/editor/editor~Editor#locale editor locale} as an argument, + * allowing localization of the {@link module:ui/view~View view}. + * + * @param {String} name The name of the component. + * @param {Function} callback The callback that returns the component. + */ + add(name, callback) { + this._components.set(getNormalized(name), { callback, originalName: name }); + } + /** + * Creates an instance of a component registered in the factory under a specific name. + * + * When called, the {@link module:core/editor/editor~Editor#locale editor locale} is passed to + * the previously {@link #add added} factory function, allowing localization of the + * {@link module:ui/view~View view}. + * + * @param {String} name The name of the component. + * @returns {module:ui/view~View} The instantiated component view. + */ + create(name) { + if (!this.has(name)) { + /** + * The required component is not registered in the component factory. Please make sure + * the provided name is correct and the component has been correctly + * {@link #add added} to the factory. + * + * @error componentfactory-item-missing + * @param {String} name The name of the missing component. + */ + throw new CKEditorError('componentfactory-item-missing', this, { name }); + } + return this._components.get(getNormalized(name)).callback(this.editor.locale); + } + /** + * Checks if a component of a given name is registered in the factory. + * + * @param {String} name The name of the component. + * @returns {Boolean} + */ + has(name) { + return this._components.has(getNormalized(name)); + } +} +// +// Ensures that the component name used as the key in the internal map is in lower case. +// +// @private +// @param {String} name +// @returns {String} +function getNormalized(name) { + return String(name).toLowerCase(); +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js new file mode 100644 index 000000000..52f0f122b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js new file mode 100644 index 000000000..58d54b4d5 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js @@ -0,0 +1,76 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/dropdownbuttonview + */ +import ButtonView from '../../button/buttonview'; +import dropdownArrowIcon from '../../../theme/icons/dropdown-arrow.svg'; +import IconView from '../../icon/iconview'; +/** + * The default dropdown button view class. + * + * const view = new DropdownButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * + * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}. + * + * @implements module:ui/dropdown/button/dropdownbutton~DropdownButton + * @extends module:ui/button/buttonview~ButtonView + */ +export default class DropdownButtonView extends ButtonView { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + /** + * An icon that displays arrow to indicate a dropdown button. + * + * @readonly + * @member {module:ui/icon/iconview~IconView} + */ + this.arrowView = this._createArrowView(); + this.extendTemplate({ + attributes: { + 'aria-haspopup': true, + 'aria-expanded': this.bindTemplate.to('isOn', value => String(value)) + } + }); + // The DropdownButton interface expects the open event upon which will open the dropdown. + this.delegate('execute').to(this, 'open'); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this.arrowView); + } + /** + * Creates a {@link module:ui/icon/iconview~IconView} instance as {@link #arrowView}. + * + * @private + * @returns {module:ui/icon/iconview~IconView} + */ + _createArrowView() { + const arrowView = new IconView(); + arrowView.content = dropdownArrowIcon; + arrowView.extendTemplate({ + attributes: { + class: 'ck-dropdown__arrow' + } + }); + return arrowView; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js new file mode 100644 index 000000000..9d7f44d8a --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js @@ -0,0 +1,193 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/splitbuttonview + */ +import View from '../../view'; +import ButtonView from '../../button/buttonview'; +import { KeystrokeHandler, FocusTracker } from '@ckeditor/ckeditor5-utils'; +import dropdownArrowIcon from '../../../theme/icons/dropdown-arrow.svg'; +import '../../../theme/components/dropdown/splitbutton.css'; +/** + * The split button view class. + * + * const view = new SplitButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * + * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}. + * + * @implements module:ui/dropdown/button/dropdownbutton~DropdownButton + * @extends module:ui/view~View + */ +export default class SplitButtonView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + // Implement the Button interface. + this.set('class', undefined); + this.set('labelStyle', undefined); + this.set('icon', undefined); + this.set('isEnabled', true); + this.set('isOn', false); + this.set('isToggleable', false); + this.set('isVisible', true); + this.set('keystroke', undefined); + this.set('withKeystroke', false); + this.set('label', undefined); + this.set('tabindex', -1); + this.set('tooltip', false); + this.set('tooltipPosition', 's'); + this.set('type', 'button'); + this.set('withText', false); + /** + * Collection of the child views inside of the split button {@link #element}. + * + * @readonly + * @member {module:ui/viewcollection~ViewCollection} + */ + this.children = this.createCollection(); + /** + * A main button of split button. + * + * @readonly + * @member {module:ui/button/buttonview~ButtonView} + */ + this.actionView = this._createActionView(); + /** + * A secondary button of split button that opens dropdown. + * + * @readonly + * @member {module:ui/button/buttonview~ButtonView} + */ + this.arrowView = this._createArrowView(); + /** + * Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. It manages + * keystrokes of the split button: + * + * * moves focus to arrow view when action view is focused, + * * moves focus to action view when arrow view is focused. + * + * @readonly + * @member {module:utils/keystrokehandler~KeystrokeHandler} + */ + this.keystrokes = new KeystrokeHandler(); + /** + * Tracks information about DOM focus in the dropdown. + * + * @readonly + * @member {module:utils/focustracker~FocusTracker} + */ + this.focusTracker = new FocusTracker(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-splitbutton', + bind.to('class'), + bind.if('isVisible', 'ck-hidden', value => !value), + this.arrowView.bindTemplate.if('isOn', 'ck-splitbutton_open') + ] + }, + children: this.children + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this.actionView); + this.children.add(this.arrowView); + this.focusTracker.add(this.actionView.element); + this.focusTracker.add(this.arrowView.element); + this.keystrokes.listenTo(this.element); + // Overrides toolbar focus cycling behavior. + this.keystrokes.set('arrowright', (evt, cancel) => { + if (this.focusTracker.focusedElement === this.actionView.element) { + this.arrowView.focus(); + cancel(); + } + }); + // Overrides toolbar focus cycling behavior. + this.keystrokes.set('arrowleft', (evt, cancel) => { + if (this.focusTracker.focusedElement === this.arrowView.element) { + this.actionView.focus(); + cancel(); + } + }); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this.focusTracker.destroy(); + this.keystrokes.destroy(); + } + /** + * Focuses the {@link #actionView#element} of the action part of split button. + */ + focus() { + this.actionView.focus(); + } + /** + * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #actionView} and binds it with main split button + * attributes. + * + * @private + * @returns {module:ui/button/buttonview~ButtonView} + */ + _createActionView() { + const actionView = new ButtonView(); + actionView.bind('icon', 'isEnabled', 'isOn', 'isToggleable', 'keystroke', 'label', 'tabindex', 'tooltip', 'tooltipPosition', 'type', 'withText').to(this); + actionView.extendTemplate({ + attributes: { + class: 'ck-splitbutton__action' + } + }); + actionView.delegate('execute').to(this); + return actionView; + } + /** + * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #arrowView} and binds it with main split button + * attributes. + * + * @private + * @returns {module:ui/button/buttonview~ButtonView} + */ + _createArrowView() { + const arrowView = new ButtonView(); + const bind = arrowView.bindTemplate; + arrowView.icon = dropdownArrowIcon; + arrowView.extendTemplate({ + attributes: { + class: [ + 'ck-splitbutton__arrow' + ], + 'data-cke-tooltip-disabled': bind.to('isOn'), + 'aria-haspopup': true, + 'aria-expanded': bind.to('isOn', value => String(value)) + } + }); + arrowView.bind('isEnabled').to(this); + arrowView.bind('label').to(this); + arrowView.bind('tooltip').to(this); + arrowView.delegate('execute').to(this, 'open'); + return arrowView; + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js new file mode 100644 index 000000000..52f0f122b --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js new file mode 100644 index 000000000..bab43072c --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js @@ -0,0 +1,119 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/dropdownpanelview + */ +import View from '../view'; +import { logWarning } from '@ckeditor/ckeditor5-utils'; +/** + * The dropdown panel view class. + * + * See {@link module:ui/dropdown/dropdownview~DropdownView} to learn about the common usage. + * + * @extends module:ui/view~View + */ +export default class DropdownPanelView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + /** + * Controls whether the panel is visible. + * + * @observable + * @member {Boolean} #isVisible + */ + this.set('isVisible', false); + /** + * The position of the panel, relative to the parent. + * + * This property is reflected in the CSS class set to {@link #element} that controls + * the position of the panel. + * + * @observable + * @default 'se' + * @member {'s'|'se'|'sw'|'sme'|'smw'|'n'|'ne'|'nw'|'nme'|'nmw'} #position + */ + this.set('position', 'se'); + /** + * Collection of the child views in this panel. + * + * A common child type is the {@link module:ui/list/listview~ListView} and {@link module:ui/toolbar/toolbarview~ToolbarView}. + * See {@link module:ui/dropdown/utils~addListToDropdown} and + * {@link module:ui/dropdown/utils~addToolbarToDropdown} to learn more about child views of dropdowns. + * + * @readonly + * @member {module:ui/viewcollection~ViewCollection} + */ + this.children = this.createCollection(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-reset', + 'ck-dropdown__panel', + bind.to('position', value => `ck-dropdown__panel_${value}`), + bind.if('isVisible', 'ck-dropdown__panel-visible') + ] + }, + children: this.children, + on: { + // Drag and drop in the panel should not break the selection in the editor. + // https://github.com/ckeditor/ckeditor5-ui/issues/228 + selectstart: bind.to(evt => evt.preventDefault()) + } + }); + } + /** + * Focuses the first view in the {@link #children} collection. + * + * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}. + */ + focus() { + if (this.children.length) { + const firstChild = this.children.first; + if (typeof firstChild.focus === 'function') { + firstChild.focus(); + } + else { + /** + * The child view of a dropdown could not be focused because it is missing the `focus()` method. + * + * This warning appears when a dropdown {@link module:ui/dropdown/dropdownview~DropdownView#isOpen gets open} and it + * attempts to focus the {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView#children first child} of its panel + * but the child does not implement the + * {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable focusable interface}. + * + * Focusing the content of a dropdown on open greatly improves the accessibility. Please make sure the view instance + * provides the `focus()` method for the best user experience. + * + * @error ui-dropdown-panel-focus-child-missing-focus + * @param {module:ui/view~View} childView + * @param {module:ui/dropdown/dropdownpanelview~DropdownPanelView} dropdownPanel + */ + logWarning('ui-dropdown-panel-focus-child-missing-focus', { childView: this.children.first, dropdownPanel: this }); + } + } + } + /** + * Focuses the view element or last item in view collection on opening dropdown's panel. + * + * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}. + */ + focusLast() { + if (this.children.length) { + const lastChild = this.children.last; + if (typeof lastChild.focusLast === 'function') { + lastChild.focusLast(); + } + else { + lastChild.focus(); + } + } + } +} diff --git a/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.js b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.js new file mode 100644 index 000000000..f69106b63 --- /dev/null +++ b/public/bundles/ibexaadminuiassets/vendors/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.js @@ -0,0 +1,479 @@ +/** + * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/dropdownview + */ +import View from '../view'; +import { KeystrokeHandler, FocusTracker, getOptimalPosition } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/dropdown/dropdown.css'; +/** + * The dropdown view class. It manages the dropdown button and dropdown panel. + * + * In most cases, the easiest way to create a dropdown is by using the {@link module:ui/dropdown/utils~createDropdown} + * util: + * + * const dropdown = createDropdown( locale ); + * + * // Configure dropdown's button properties: + * dropdown.buttonView.set( { + * label: 'A dropdown', + * withText: true + * } ); + * + * dropdown.render(); + * + * dropdown.panelView.element.textContent = 'Content of the panel'; + * + * // Will render a dropdown with a panel containing a "Content of the panel" text. + * document.body.appendChild( dropdown.element ); + * + * If you want to add a richer content to the dropdown panel, you can use the {@link module:ui/dropdown/utils~addListToDropdown} + * and {@link module:ui/dropdown/utils~addToolbarToDropdown} helpers. See more examples in + * {@link module:ui/dropdown/utils~createDropdown} documentation. + * + * If you want to create a completely custom dropdown, then you can compose it manually: + * + * const button = new DropdownButtonView( locale ); + * const panel = new DropdownPanelView( locale ); + * const dropdown = new DropdownView( locale, button, panel ); + * + * button.set( { + * label: 'A dropdown', + * withText: true + * } ); + * + * dropdown.render(); + * + * panel.element.textContent = 'Content of the panel'; + * + * // Will render a dropdown with a panel containing a "Content of the panel" text. + * document.body.appendChild( dropdown.element ); + * + * However, dropdown created this way will contain little behavior. You will need to implement handlers for actions + * such as {@link module:ui/bindings/clickoutsidehandler~clickOutsideHandler clicking outside an open dropdown} + * (which should close it) and support for arrow keys inside the panel. Therefore, unless you really know what + * you do and you really need to do it, it is recommended to use the {@link module:ui/dropdown/utils~createDropdown} helper. + * + * @extends module:ui/view~View + */ +export default class DropdownView extends View { + /** + * Creates an instance of the dropdown. + * + * Also see {@link #render}. + * + * @param {module:utils/locale~Locale} [locale] The localization services instance. + * @param {module:ui/dropdown/button/dropdownbutton~DropdownButton} buttonView + * @param {module:ui/dropdown/dropdownpanelview~DropdownPanelView} panelView + */ + constructor(locale, buttonView, panelView) { + super(locale); + const bind = this.bindTemplate; + /** + * Button of the dropdown view. Clicking the button opens the {@link #panelView}. + * + * @readonly + * @member {module:ui/button/buttonview~ButtonView} #buttonView + */ + this.buttonView = buttonView; + /** + * Panel of the dropdown. It opens when the {@link #buttonView} is + * {@link module:ui/button/buttonview~ButtonView#event:execute executed} (i.e. clicked). + * + * Child views can be added to the panel's `children` collection: + * + * dropdown.panelView.children.add( childView ); + * + * See {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView#children} and + * {@link module:ui/viewcollection~ViewCollection#add}. + * + * @readonly + * @member {module:ui/dropdown/dropdownpanelview~DropdownPanelView} #panelView + */ + this.panelView = panelView; + /** + * Controls whether the dropdown view is open, i.e. shows or hides the {@link #panelView panel}. + * + * **Note**: When the dropdown gets open, it will attempt to call `focus()` on the first child of its {@link #panelView}. + * See {@link module:ui/dropdown/utils~addToolbarToDropdown}, {@link module:ui/dropdown/utils~addListToDropdown}, and + * {@link module:ui/dropdown/utils~focusChildOnDropdownOpen} to learn more about focus management in dropdowns. + * + * @observable + * @member {Boolean} #isOpen + */ + this.set('isOpen', false); + /** + * Controls whether the dropdown is enabled, i.e. it can be clicked and execute an action. + * + * See {@link module:ui/button/buttonview~ButtonView#isEnabled}. + * + * @observable + * @member {Boolean} #isEnabled + */ + this.set('isEnabled', true); + /** + * (Optional) The additional CSS class set on the dropdown {@link #element}. + * + * @observable + * @member {String} #class + */ + this.set('class', undefined); + /** + * (Optional) The `id` attribute of the dropdown (i.e. to pair with a `