diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 00000000..8253d6f2 --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,256 @@ +name: craft-base-install +type: craftcms +docroot: public +php_version: '8.2' +webserver_type: apache-fpm +router_http_port: '80' +router_https_port: '443' +xdebug_enabled: false +additional_hostnames: [] +additional_fqdns: ['basecraft.local.statik.be'] +database: + type: mysql + version: '5.7' +nfs_mount_enabled: false +mutagen_enabled: false +use_dns_when_possible: true +composer_version: '2' +web_environment: [] +nodejs_version: '16' +# Key features of ddev's config.yaml: + +# name: # Name of the project, automatically provides +# http://projectname.ddev.site and https://projectname.ddev.site + +# type: # drupal6/7/8, backdrop, typo3, wordpress, php + +# docroot: # Relative path to the directory containing index.php. + +# php_version: "7.4" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2" + +# You can explicitly specify the webimage but this +# is not recommended, as the images are often closely tied to ddev's' behavior, +# so this can break upgrades. + +# webimage: # nginx/php docker image. + +# database: +# type: # mysql, mariadb +# version: # database version, like "10.3" or "8.0" +# Note that mariadb_version or mysql_version from v1.18 and earlier +# will automatically be converted to this notation with just a "ddev config --auto" + +# router_http_port: # Port to be used for http (defaults to port 80) +# router_https_port: # Port for https (defaults to 443) + +# xdebug_enabled: false # Set to true to enable xdebug and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xdebug" to enable xdebug and "ddev xdebug off" to disable it work better, +# as leaving xdebug enabled all the time is a big performance hit. + +# xhprof_enabled: false # Set to true to enable xhprof and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xhprof" to enable xhprof and "ddev xhprof off" to disable it work better, +# as leaving xhprof enabled all the time is a big performance hit. + +# webserver_type: nginx-fpm # or apache-fpm + +# timezone: Europe/Berlin +# This is the timezone used in the containers and by PHP; +# it can be set to any valid timezone, +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# For example Europe/Dublin or MST7MDT + +# composer_root: +# Relative path to the composer root directory from the project root. This is +# the directory which contains the composer.json and where all Composer related +# commands are executed. + +# composer_version: "2" +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 +# to use the latest major version available at the time your container is built. +# It is also possible to use each other Composer version channel. This includes: +# - 2.2 (latest Composer LTS version) +# - stable +# - preview +# - snapshot +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". +# To reinstall Composer after the image was built, run "ddev debug refresh". + +# nodejs_version: "16" +# change from the default system Node.js version to another supported version, like 12, 14, 17, 18. +# Note that you can use 'ddev nvm' or nvm inside the web container to provide nearly any +# Node.js version, including v6, etc. + +# additional_hostnames: +# - somename +# - someothername +# would provide http and https URLs for "somename.ddev.site" +# and "someothername.ddev.site". + +# additional_fqdns: +# - example.com +# - sub1.example.com +# would provide http and https URLs for "example.com" and "sub1.example.com" +# Please take care with this because it can cause great confusion. + +# upload_dir: custom/upload/dir +# would set the destination path for ddev import-files to /custom/upload/dir +# When mutagen is enabled this path is bind-mounted so that all the files +# in the upload_dir don't have to be synced into mutagen + +# working_dir: +# web: /var/www/html +# db: /home +# would set the default working directory for the web and db services. +# These values specify the destination directory for ddev ssh and the +# directory in which commands passed into ddev exec are run. + +# omit_containers: [db, dba, ddev-ssh-agent] +# Currently only these containers are supported. Some containers can also be +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit +# the "db" container, several standard features of ddev that access the +# database container will be unusable. In the global configuration it is also +# possible to omit ddev-router, but not here. + +# nfs_mount_enabled: false +# Great performance improvement but requires host configuration first. +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#nfs + +# mutagen_enabled: false +# Performance improvement using mutagen asynchronous updates. +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen + +# fail_on_hook_fail: False +# Decide whether 'ddev start' should be interrupted by a failing hook + +# host_https_port: "59002" +# The host port binding for https can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_webserver_port: "59001" +# The host port binding for the ddev-webserver can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_db_port: "59002" +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic +# unless explicitly specified. + +# phpmyadmin_port: "8036" +# phpmyadmin_https_port: "8037" +# The PHPMyAdmin ports can be changed from the default 8036 and 8037 + +# host_phpmyadmin_port: "8036" +# The phpmyadmin (dba) port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be specified and bound. + +# mailhog_port: "8025" +# mailhog_https_port: "8026" +# The MailHog ports can be changed from the default 8025 and 8026 + +# host_mailhog_port: "8025" +# The mailhog port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be bound directly to localhost if specified here. + +# webimage_extra_packages: [php7.4-tidy, php-bcmath] +# Extra Debian packages that are needed in the webimage can be added here + +# dbimage_extra_packages: [telnet,netcat] +# Extra Debian packages that are needed in the dbimage can be added here + +# use_dns_when_possible: true +# If the host has internet access and the domain configured can +# successfully be looked up, DNS will be used for hostname resolution +# instead of editing /etc/hosts +# Defaults to true + +# project_tld: ddev.site +# The top-level domain used for project URLs +# The default "ddev.site" allows DNS lookup via a wildcard +# If you prefer you can change this to "ddev.local" to preserve +# pre-v1.9 behavior. + +# ngrok_args: --basic-auth username:pass1234 +# Provide extra flags to the "ngrok http" command, see +# https://ngrok.com/docs#http or run "ngrok http -h" + +# disable_settings_management: false +# If true, ddev will not create CMS-specific settings files like +# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php +# In this case the user must provide all such settings. + +# You can inject environment variables into the web container with: +# web_environment: +# - SOMEENV=somevalue +# - SOMEOTHERENV=someothervalue + +# no_project_mount: false +# (Experimental) If true, ddev will not mount the project into the web container; +# the user is responsible for mounting it manually or via a script. +# This is to enable experimentation with alternate file mounting strategies. +# For advanced users only! + +# bind_all_interfaces: false +# If true, host ports will be bound on all network interfaces, +# not just the localhost interface. This means that ports +# will be available on the local network if the host firewall +# allows it. + +# default_container_timeout: 120 +# The default time that ddev waits for all containers to become ready can be increased from +# the default 120. This helps in importing huge databases, for example. + +#web_extra_exposed_ports: +#- name: nodejs +# container_port: 3000 +# http_port: 2999 +# https_port: 3000 +#- name: something +# container_port: 4000 +# https_port: 4000 +# http_port: 3999 +# Allows a set of extra ports to be exposed via ddev-router +# The port behavior on the ddev-webserver must be arranged separately, for example +# using web_extra_daemons. +# For example, with a web app on port 3000 inside the container, this config would +# expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 +# web_extra_exposed_ports: +# - container_port: 3000 +# http_port: 9998 +# https_port: 9999 + +#web_extra_daemons: +#- name: "http-1" +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" +# directory: /var/www/html +#- name: "http-2" +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" +# directory: /var/www/html + +# override_config: false +# By default, config.*.yaml files are *merged* into the configuration +# But this means that some things can't be overridden +# For example, if you have 'nfs_mount_enabled: true'' you can't override it with a merge +# and you can't erase existing hooks or all environment variables. +# However, with "override_config: true" in a particular config.*.yaml file, +# 'nfs_mount_enabled: false' can override the existing values, and +# hooks: +# post-start: [] +# or +# web_environment: [] +# or +# additional_hostnames: [] +# can have their intended affect. 'override_config' affects only behavior of the +# config.*.yaml file it exists in. + +# Many ddev commands can be extended to run tasks before or after the +# ddev command is executed, for example "post-start", "post-import-db", +# "pre-composer", "post-composer" +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more +# information on the commands that can be extended and the tasks you can define +# for them. Example: +#hooks: diff --git a/.env.example b/.env.example index a7d7c3a1..6ff84c27 100644 --- a/.env.example +++ b/.env.example @@ -1,12 +1,9 @@ -# This needs to be true is you want to use the frontend dev server. -FRONTEND_DEV=true +# The environment Craft is currently running in (dev, staging, production, etc.) +CRAFT_ENVIRONMENT=dev # The application ID used to to uniquely store session and cache data, mutex locks, and more CRAFT_APP_ID= -# The environment Craft is currently running in (dev, staging, production, etc.) -CRAFT_ENVIRONMENT=dev - # The secure key Craft will use for hashing and encrypting data CRAFT_SECURITY_KEY= @@ -29,5 +26,14 @@ POSTMARK_API_KEY="" # Address to which Craft's testToEmailAddress will be site DEBUG_EMAIL="" +# System Email Address from where emails will be sent +SYSTEM_EMAIL="no-reply@mailer.today" + # The base url of the site. -BASE_URL="/" \ No newline at end of file +BASE_URL="/" + +# Accounts in this website +PUBLIC_ACCOUNT_FLOW= + +# Vite Frontend Dev: This needs to be true is you want to use the frontend dev server +FRONTEND_DEV=false \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1bde369f..66e937eb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,6 @@ on: push: branches: - master - - feature/formie jobs: FTP-Deploy-Action: name: SFTP deploy & post install commands @@ -17,7 +16,7 @@ jobs: FTP_PASSWORD: ${{ secrets.PASSWORD }} METHOD: sftp LOCAL_DIR: . - REMOTE_DIR: ${{ secrets.SUB_DIR }} + REMOTE_DIR: ${{ secrets.SUB_DIR_LIVE }} ARGS: --verbose --delete --exclude=.git --parallel=10 --exclude=.env --exclude=vendor --exclude=node_modules - name: Post deploy script uses: appleboy/ssh-action@master @@ -28,8 +27,5 @@ jobs: port: ${{ secrets.PORT }} timeout: 60000s script: | - cd ${{ secrets.SUB_DIR }} - composer install - ./craft migrate/all - ./craft project-config/apply - chmod +x post-deploy-craft3.sh && ./post-deploy-craft3.sh --env=staging + cd ${{ secrets.SUB_DIR_LIVE }} + chmod +x post-deploy-craft3.sh && ./post-deploy-craft3.sh --env=production diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml new file mode 100644 index 00000000..1027f9d7 --- /dev/null +++ b/.github/workflows/staging.yml @@ -0,0 +1,31 @@ +on: + push: + branches: + - develop +jobs: + FTP-Deploy-Action: + name: SFTP deploy & post install commands + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: FTP-Deploy-Action + uses: SamKirkland/FTP-Deploy-Action@2.0.0 + env: + FTP_SERVER: ${{ secrets.HOST }} + FTP_USERNAME: ${{ secrets.USERNAME }} + FTP_PASSWORD: ${{ secrets.PASSWORD }} + METHOD: sftp + LOCAL_DIR: . + REMOTE_DIR: ${{ secrets.SUB_DIR_STAGING }} + ARGS: --verbose --delete --exclude=.git --parallel=10 --exclude=.env --exclude=vendor --exclude=node_modules + - name: Post deploy script + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + port: ${{ secrets.PORT }} + timeout: 60000s + script: | + cd ${{ secrets.SUB_DIR_STAGING }} + chmod +x post-deploy-craft3.sh && ./post-deploy-craft3.sh --env=staging diff --git a/.gitignore b/.gitignore index b1b6b2c8..25845ef7 100644 --- a/.gitignore +++ b/.gitignore @@ -17,11 +17,11 @@ yarn-debug.log* yarn-error.log* *.crt *.key +*.pem /storage/config-backups /storage/composer-backups templates/_site/_snippet/_global/_headerAssets.twig -templates/_site/_snippet/_global/_headerIEAssets.twig templates/_site/_snippet/_global/_iconSprite.twig templates/_site/_snippet/_global/_favicon.twig -/.ddev public/frontend*/* +/translations diff --git a/.gitignore.example b/.gitignore.example index 37015150..c9db7d10 100644 --- a/.gitignore.example +++ b/.gitignore.example @@ -9,12 +9,18 @@ /public/css/* /public/docs/* /public/fonts/* +/public/icon/* /public/img/* /public/js/* npm-debug.log* yarn-debug.log* yarn-error.log* +*.crt +*.pem /storage/config-backups /storage/composer-backups -/templates/_snippet/_global/_headerAssets.twig -/templates/_snippet/_global/_footer-assets.twig +templates/_site/_snippet/_global/_headerAssets.twig +templates/_site/_snippet/_global/_iconSprite.twig +templates/_site/_snippet/_global/_favicon.twig +public/frontend*/* +/translations diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 64b391c7..33d3ec88 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -4,6 +4,32 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## 3.1.6 - 2023-01-03 + +### Updated + +- System, Craft, plugin and composer updates +- Updated the post-deploy-craft3.sh with commands for KU Leuven servers + +## 3.1.5 - 2023-01-02 + +### Updated + +- Updated the search flow: we now use a Craft search instead of a Google Search. The Google Search is still present in the comments so it can still be used when necessary. + + +## 3.1.3 - 2022-12-02 + +### Updated + +- Updated the setup flow with removal of the account folder and updating the htaccess file with the correct project code. + +## 3.1.1 - 2022-11-09 + +### Fixed + +- We fixed the Http Headers + ## 3.1.0 - 2022-10-20 ### Removed diff --git a/bootstrap.php b/bootstrap.php new file mode 100644 index 00000000..cae61070 --- /dev/null +++ b/bootstrap.php @@ -0,0 +1,18 @@ +safeLoad(); +} diff --git a/composer.json b/composer.json index aa2ef90d..8ac70c0c 100644 --- a/composer.json +++ b/composer.json @@ -8,32 +8,34 @@ "project" ], "type": "project", - "minimum-stability": "beta", "require": { "php": ">=8.1", "ext-json": "*", - "born05/craft-assetusage": "3.0.0", - "craftcms/cms": "4.3.6.1", + "born05/craft-assetusage": "3.2.0", + "craftcms/ckeditor": "3.4.0", + "craftcms/cms": "4.4.16.1", "craftcms/postmark": "3.0.0", - "craftcms/redactor": "3.0.3", - "hybridinteractive/craft-position-fieldtype": "4.0.0-beta.3", + "hybridinteractive/craft-position-fieldtype": "4.0.0", + "hybridinteractive/craft-width-fieldtype": "^4.0", "mikehaertl/php-shellcommand": "^1.6", "mmikkel/cp-field-inspect": "1.4.4", - "nystudio107/craft-imageoptimize": "4.0.3", - "nystudio107/craft-vite": "4.0.4", - "statikbe/craft-config-values": "2.0.0", - "statikbe/craft-cookie-banner": "2.0.0", - "statikbe/craft-cta-field": "2.0.0-beta.2", - "statikbe/craft-translate": "2.1.1", - "statikbe/craft-video-parser": "2.0.0-beta.1", + "nystudio107/craft-imageoptimize": "4.0.5", + "nystudio107/craft-vite": "4.0.6", + "percipioglobal/craft-password-policy": "4.1.0", + "statikbe/craft-config-values": "^2.0.0", + "statikbe/craft-cookie-banner": "3.0.4", + "statikbe/craft-cta-field": "^2.0.0", + "statikbe/craft-translate": "^2.0.0", + "statikbe/craft-video-parser": "^2.0.0", "studioespresso/craft-dumper": "3.0.1", - "studioespresso/craft-navigate": "3.0.2", - "studioespresso/craft-seo-fields": "3.2.0", + "studioespresso/craft-navigate": "3.1.3", + "studioespresso/craft-seo-fields": "3.3.0", "verbb/element-index-defaults": "3.0.0", - "verbb/expanded-singles": "2.0.0", - "verbb/formie": "2.0.18", - "verbb/super-table": "3.0.7", - "vlucas/phpdotenv": "^3.4.0" + "verbb/expanded-singles": "2.0.5", + "verbb/formie": "2.0.33", + "verbb/super-table": "3.0.9", + "verbb/tablemaker": "4.0.6", + "vlucas/phpdotenv": "^5.4.1" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index da504f12..76c84565 100644 --- a/composer.lock +++ b/composer.lock @@ -4,29 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5367f9c2ee073c732dafa15258dcd55d", + "content-hash": "c43a6f0196e36893c53bbefc6593bbdf", "packages": [ { "name": "born05/craft-assetusage", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/born05/craft-assetusage.git", - "reference": "6685bff434908146184d3bd97a1a5ed975ff16f9" - }, + "version": "3.2.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/born05/craft-assetusage/zipball/6685bff434908146184d3bd97a1a5ed975ff16f9", - "reference": "6685bff434908146184d3bd97a1a5ed975ff16f9", + "url": "https://api.github.com/repos/born05/craft-assetusage/zipball/c4efd889714825ae2be8ce9738bc46f679c9eee1", + "reference": "c4efd889714825ae2be8ce9738bc46f679c9eee1", "shasum": "" }, "require": { "craftcms/cms": "^4.0.0-beta.1", "php": "^8.0.2" }, - "require-dev": { - "squizlabs/php_codesniffer": "3.*" - }, "type": "craft-plugin", "extra": { "name": "Asset Usage", @@ -40,7 +32,6 @@ "born05\\assetusage\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -52,18 +43,17 @@ ], "description": "Adds a column to see which assets are used or unused.", "keywords": [ - "Craft", "asset usage", "cms", + "craft", "craft-plugin", "craftcms" ], "support": { "docs": "https://github.com/born05/craft-assetusage/blob/craft4/README.md", - "issues": "https://github.com/born05/craft-assetusage/issues", - "source": "https://github.com/born05/craft-assetusage/tree/3.0.0" + "issues": "https://github.com/born05/craft-assetusage/issues" }, - "time": "2022-07-13T09:16:15+00:00" + "time": "2023-06-20T14:21:01+00:00" }, { "name": "cebe/markdown", @@ -116,15 +106,15 @@ }, { "name": "commerceguys/addressing", - "version": "v1.4.1", + "version": "v1.4.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/commerceguys/addressing/zipball/8b1bcd45971733e8f4224e539cb92838f18c4d06", - "reference": "8b1bcd45971733e8f4224e539cb92838f18c4d06", + "url": "https://api.github.com/repos/commerceguys/addressing/zipball/406c7b5f0fbe4f6a64155c0fe03b1adb34d01308", + "reference": "406c7b5f0fbe4f6a64155c0fe03b1adb34d01308", "shasum": "" }, "require": { - "doctrine/collections": "^1.2", + "doctrine/collections": "^1.2 || ^2.0", "php": ">=7.3" }, "suggest": { @@ -159,15 +149,15 @@ "localization", "postal" ], - "time": "2022-08-09T11:42:51+00:00" + "time": "2023-02-15T10:11:14+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.5", + "version": "1.3.6", "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/90d087e988ff194065333d16bc5cf649872d9cdb", + "reference": "90d087e988ff194065333d16bc5cf649872d9cdb", "shasum": "" }, "require": { @@ -204,15 +194,15 @@ "ssl", "tls" ], - "time": "2023-01-11T08:27:00+00:00" + "time": "2023-06-06T12:02:59+00:00" }, { "name": "composer/composer", - "version": "2.2.15", + "version": "2.2.19", "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/509dcbd4f8d459e0ef2ef223a231b8c31bceed78", - "reference": "509dcbd4f8d459e0ef2ef223a231b8c31bceed78", + "url": "https://api.github.com/repos/composer/composer/zipball/30ff21a9af9a10845436abaeeb0bb7276e996d24", + "reference": "30ff21a9af9a10845436abaeeb0bb7276e996d24", "shasum": "" }, "require": { @@ -274,7 +264,7 @@ "dependency", "package" ], - "time": "2022-07-01T10:01:26+00:00" + "time": "2023-02-04T13:54:48+00:00" }, { "name": "composer/metadata-minifier", @@ -497,24 +487,75 @@ ], "time": "2022-02-25T21:32:43+00:00" }, + { + "name": "craftcms/ckeditor", + "version": "3.4.0", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/craftcms/ckeditor/zipball/e33e2aa89d7f58631641061c488ce55f3e187f6f", + "reference": "e33e2aa89d7f58631641061c488ce55f3e187f6f", + "shasum": "" + }, + "require": { + "craftcms/cms": "^4.4.7", + "craftcms/html-field": "^2.0.0-alpha.2", + "nystudio107/craft-code-editor": "^1.0.8", + "php": "^8.0.2" + }, + "type": "craft-plugin", + "extra": { + "name": "CKEditor", + "handle": "ckeditor", + "documentationUrl": "https://github.com/craftcms/ckeditor/blob/master/README.md" + }, + "autoload": { + "psr-4": { + "craft\\ckeditor\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pixel & Tonic", + "homepage": "https://pixelandtonic.com/" + } + ], + "description": "Edit rich text content in Craft CMS using CKEditor.", + "keywords": [ + "ckeditor", + "cms", + "craftcms", + "html", + "yii2" + ], + "support": { + "email": "support@craftcms.com", + "issues": "https://github.com/craftcms/ckeditor/issues?state=open", + "source": "https://github.com/craftcms/ckeditor", + "docs": "https://github.com/craftcms/ckeditor/blob/master/README.md", + "rss": "https://github.com/craftcms/ckeditor/commits/master.atom" + }, + "time": "2023-05-16T18:59:19+00:00" + }, { "name": "craftcms/cms", - "version": "4.3.6.1", + "version": "4.4.16.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/craftcms/cms/zipball/c3afbef706beafbe71b64735e1124ff345dc6e48", - "reference": "c3afbef706beafbe71b64735e1124ff345dc6e48", + "url": "https://api.github.com/repos/craftcms/cms/zipball/d2f4a215a1e2320841773c50e680509d4a3a5769", + "reference": "d2f4a215a1e2320841773c50e680509d4a3a5769", "shasum": "" }, "require": { "commerceguys/addressing": "^1.2", - "composer/composer": "2.2.15", - "craftcms/oauth2-craftid": "~1.0.0", - "craftcms/plugin-installer": "~1.5.6", + "composer/composer": "2.2.19", + "craftcms/plugin-installer": "~1.6.0", "craftcms/server-check": "~2.1.2", "creocoder/yii2-nested-sets": "~0.9.0", - "elvanto/litemoji": "^3.0.1", - "enshrined/svg-sanitize": "~0.15.0", + "elvanto/litemoji": "^4.3.0", + "enshrined/svg-sanitize": "~0.16.0", "ext-bcmath": "*", "ext-curl": "*", "ext-dom": "*", @@ -527,13 +568,12 @@ "ext-zip": "*", "guzzlehttp/guzzle": "^7.2.0", "illuminate/collections": "^9.1.0", - "league/oauth2-client": "^2.6.0", "mikehaertl/php-shellcommand": "^1.6.3", "moneyphp/money": "^4.0", "monolog/monolog": "^2.3", "php": "^8.0.2", "pixelandtonic/imagine": "~1.3.3.1", - "samdark/yii2-psr-log-target": "^1.1", + "samdark/yii2-psr-log-target": "^1.1.3", "seld/cli-prompt": "^1.0.4", "symfony/http-client": "^6.0.3", "symfony/var-dumper": "^5.0|^6.0", @@ -543,12 +583,11 @@ "voku/stringy": "^6.4.0", "webonyx/graphql-php": "~14.11.5", "yiisoft/yii2": "~2.0.47.0", - "yiisoft/yii2-debug": "~2.1.19.0", + "yiisoft/yii2-debug": "~2.1.22.0", "yiisoft/yii2-queue": "~2.3.2", "yiisoft/yii2-symfonymailer": "^2.0.0" }, "conflict": { - "league/oauth2-client": "2.4.0", "webonyx/graphql-php": "14.11.7" }, "provide": { @@ -591,18 +630,18 @@ "issues": "https://github.com/craftcms/cms/issues?state=open", "forum": "https://craftcms.stackexchange.com/", "source": "https://github.com/craftcms/cms", - "docs": "https://docs.craftcms.com/v3/", + "docs": "https://craftcms.com/docs/4.x/", "rss": "https://github.com/craftcms/cms/releases.atom" }, - "time": "2023-01-10T00:55:43+00:00" + "time": "2023-07-19T14:56:36+00:00" }, { "name": "craftcms/html-field", - "version": "2.0.6", + "version": "2.0.7", "dist": { "type": "zip", - "url": "https://api.github.com/repos/craftcms/html-field/zipball/3030f7878335b8c7163b1db354fdc22c083d131c", - "reference": "3030f7878335b8c7163b1db354fdc22c083d131c", + "url": "https://api.github.com/repos/craftcms/html-field/zipball/7ecccab102b4e86abb5526411e96594f430f2bb5", + "reference": "7ecccab102b4e86abb5526411e96594f430f2bb5", "shasum": "" }, "require": { @@ -632,55 +671,15 @@ "docs": "https://github.com/craftcms/html-field/blob/main/README.md", "rss": "https://github.com/craftcms/html-field/commits/main.atom" }, - "time": "2022-11-16T11:13:37+00:00" - }, - { - "name": "craftcms/oauth2-craftid", - "version": "1.0.0.1", - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/craftcms/oauth2-craftid/zipball/3f18364139d72d83fb50546d85130beaaa868836", - "reference": "3f18364139d72d83fb50546d85130beaaa868836", - "shasum": "" - }, - "require": { - "league/oauth2-client": "^2.2.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "craftcms\\oauth2\\client\\": "src/" - } - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Pixel & Tonic", - "homepage": "https://pixelandtonic.com/" - } - ], - "description": "Craft OAuth 2.0 Client Provider for The PHP League OAuth2-Client", - "keywords": [ - "Authentication", - "authorization", - "client", - "cms", - "craftcms", - "craftid", - "oauth", - "oauth2" - ], - "time": "2017-11-22T19:46:18+00:00" + "time": "2023-04-21T16:52:18+00:00" }, { "name": "craftcms/plugin-installer", - "version": "1.5.7", + "version": "1.6.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/craftcms/plugin-installer/zipball/23ec472acd4410b70b07d5a02b2b82db9ee3f66b", - "reference": "23ec472acd4410b70b07d5a02b2b82db9ee3f66b", + "url": "https://api.github.com/repos/craftcms/plugin-installer/zipball/bd1650e8da6d5ca7a8527068d3e51c34bc7b6b4f", + "reference": "bd1650e8da6d5ca7a8527068d3e51c34bc7b6b4f", "shasum": "" }, "require": { @@ -708,7 +707,7 @@ "installer", "plugin" ], - "time": "2021-02-18T02:01:38+00:00" + "time": "2023-02-22T13:17:00+00:00" }, { "name": "craftcms/postmark", @@ -772,64 +771,13 @@ }, "time": "2022-05-03T22:21:11+00:00" }, - { - "name": "craftcms/redactor", - "version": "3.0.3", - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/craftcms/redactor/zipball/19578a713a06aedd4e0efb5dd80cb3947a5849c4", - "reference": "19578a713a06aedd4e0efb5dd80cb3947a5849c4", - "shasum": "" - }, - "require": { - "craftcms/cms": "^4.0.0-alpha.1", - "craftcms/html-field": "^2.0.0", - "php": "^8.0.2" - }, - "type": "craft-plugin", - "extra": { - "name": "Redactor", - "handle": "redactor", - "documentationUrl": "https://github.com/craftcms/redactor/blob/v2/README.md" - }, - "autoload": { - "psr-4": { - "craft\\redactor\\": "src/" - } - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Pixel & Tonic", - "homepage": "https://pixelandtonic.com/" - } - ], - "description": "Edit rich text content in Craft CMS using Redactor by Imperavi.", - "keywords": [ - "cms", - "craftcms", - "html", - "redactor", - "yii2" - ], - "support": { - "email": "support@craftcms.com", - "issues": "https://github.com/craftcms/redactor/issues?state=open", - "source": "https://github.com/craftcms/redactor", - "docs": "https://github.com/craftcms/redactor/blob/v2/README.md", - "rss": "https://github.com/craftcms/redactor/commits/v2.atom" - }, - "time": "2023-01-01T01:36:37+00:00" - }, { "name": "craftcms/server-check", - "version": "2.1.4", + "version": "2.1.5", "dist": { "type": "zip", - "url": "https://api.github.com/repos/craftcms/server-check/zipball/c262ebd39572902bdf4fe3ea570e11cd6725b381", - "reference": "c262ebd39572902bdf4fe3ea570e11cd6725b381", + "url": "https://api.github.com/repos/craftcms/server-check/zipball/a099ba05adf6424298aa5177ca17084e616a5690", + "reference": "a099ba05adf6424298aa5177ca17084e616a5690", "shasum": "" }, "type": "library", @@ -849,7 +797,7 @@ "requirements", "yii2" ], - "time": "2022-04-17T02:14:46+00:00" + "time": "2023-05-26T20:43:59+00:00" }, { "name": "creocoder/yii2-nested-sets", @@ -887,11 +835,11 @@ }, { "name": "defuse/php-encryption", - "version": "v2.3.1", + "version": "v2.4.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/77880488b9954b7884c25555c2a0ea9e7053f9d2", - "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", "shasum": "" }, "require": { @@ -936,25 +884,25 @@ "security", "symmetric key cryptography" ], - "time": "2021-04-09T23:57:26+00:00" + "time": "2023-06-19T06:10:36+00:00" }, { "name": "doctrine/collections", - "version": "1.8.0", + "version": "2.1.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", - "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "url": "https://api.github.com/repos/doctrine/collections/zipball/3023e150f90a38843856147b58190aa8b46cc155", + "reference": "3023e150f90a38843856147b58190aa8b46cc155", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1.3 || ^8.0" + "doctrine/deprecations": "^1", + "php": "^8.1" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + "Doctrine\\Common\\Collections\\": "src" } }, "license": [ @@ -990,19 +938,19 @@ "iterators", "php" ], - "time": "2022-09-01T20:12:10+00:00" + "time": "2023-07-06T15:15:36+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1018,20 +966,19 @@ ], "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/", - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "3.0.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -1065,15 +1012,15 @@ "parser", "php" ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "dompdf/dompdf", - "version": "v2.0.1", + "version": "v2.0.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/c5310df0e22c758c85ea5288175fc6cd777bc085", - "reference": "c5310df0e22c758c85ea5288175fc6cd777bc085", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/e8d2d5e37e8b0b30f0732a011295ab80680d7e85", + "reference": "e8d2d5e37e8b0b30f0732a011295ab80680d7e85", "shasum": "" }, "require": { @@ -1110,21 +1057,21 @@ ], "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "homepage": "https://github.com/dompdf/dompdf", - "time": "2022-09-22T13:43:41+00:00" + "time": "2023-02-07T12:51:48+00:00" }, { "name": "egulias/email-validator", - "version": "3.2.5", + "version": "4.0.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b531a2311709443320c786feb4519cfaf94af796", - "reference": "b531a2311709443320c786feb4519cfaf94af796", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", "shasum": "" }, "require": { - "doctrine/lexer": "^1.2|^2", - "php": ">=7.2", - "symfony/polyfill-intl-idn": "^1.15" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -1132,7 +1079,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -1157,19 +1104,20 @@ "validation", "validator" ], - "time": "2023-01-02T17:26:14+00:00" + "time": "2023-01-14T14:17:03+00:00" }, { "name": "elvanto/litemoji", - "version": "3.0.1", + "version": "4.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/elvanto/litemoji/zipball/acd6fd944814683983dcdfcf4d33f24430631b77", - "reference": "acd6fd944814683983dcdfcf4d33f24430631b77", + "url": "https://api.github.com/repos/elvanto/litemoji/zipball/f13cf10686f7110a3b17d09de03050d0708840b8", + "reference": "f13cf10686f7110a3b17d09de03050d0708840b8", "shasum": "" }, "require": { - "php": ">=7.0" + "ext-mbstring": "*", + "php": ">=7.3" }, "type": "library", "autoload": { @@ -1185,21 +1133,22 @@ "emoji", "php-emoji" ], - "time": "2020-11-27T05:08:33+00:00" + "time": "2022-10-28T02:32:19+00:00" }, { "name": "enshrined/svg-sanitize", - "version": "0.15.4", + "version": "0.16.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", - "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/239e257605e2141265b429e40987b2ee51bba4b4", + "reference": "239e257605e2141265b429e40987b2ee51bba4b4", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^7.0 || ^8.0" + "ezyang/htmlpurifier": "^4.16", + "php": "^5.6 || ^7.0 || ^8.0" }, "type": "library", "autoload": { @@ -1217,7 +1166,7 @@ } ], "description": "An SVG sanitizer for PHP", - "time": "2022-02-21T09:13:59+00:00" + "time": "2023-03-20T10:51:12+00:00" }, { "name": "ezyang/htmlpurifier", @@ -1268,11 +1217,11 @@ }, { "name": "fakerphp/faker", - "version": "v1.21.0", + "version": "v1.23.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", - "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", "shasum": "" }, "require": { @@ -1315,21 +1264,22 @@ "faker", "fixtures" ], - "time": "2022-12-13T13:54:32+00:00" + "time": "2023-06-12T08:44:38+00:00" }, { "name": "firebase/php-jwt", - "version": "v6.3.2", + "version": "v6.7.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/ea7dda77098b96e666c5ef382452f94841e439cd", - "reference": "ea7dda77098b96e666c5ef382452f94841e439cd", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/71278f20b0a623389beefe87a641d03948a38870", + "reference": "71278f20b0a623389beefe87a641d03948a38870", "shasum": "" }, "require": { - "php": "^7.1||^8.0" + "php": "^7.4||^8.0" }, "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, "type": "library", @@ -1359,15 +1309,15 @@ "jwt", "php" ], - "time": "2022-12-19T17:10:46+00:00" + "time": "2023-06-14T15:29:26+00:00" }, { "name": "giggsey/libphonenumber-for-php", - "version": "8.13.4", + "version": "8.13.17", "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/b2cebcf2b8d3e194b692d8bae2a5b79f5366674c", - "reference": "b2cebcf2b8d3e194b692d8bae2a5b79f5366674c", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/dee92bfa0782fd5899fe6b295dea40cdb0607476", + "reference": "dee92bfa0782fd5899fe6b295dea40cdb0607476", "shasum": "" }, "require": { @@ -1412,15 +1362,15 @@ "phonenumber", "validation" ], - "time": "2023-01-09T09:44:18+00:00" + "time": "2023-07-20T10:32:50+00:00" }, { "name": "giggsey/locale", - "version": "2.3", + "version": "2.4", "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/Locale/zipball/5f035523740be40d40ac768a123c9bcc1ae12f56", - "reference": "5f035523740be40d40ac768a123c9bcc1ae12f56", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", + "reference": "a6b33dfc9e8949b7e28133c4628b29cd9f1850bb", "shasum": "" }, "require": { @@ -1443,21 +1393,83 @@ } ], "description": "Locale functions required by libphonenumber-for-php", - "time": "2022-10-19T20:03:30+00:00" + "time": "2023-04-13T07:40:58+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T20:23:15+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.0", + "version": "7.7.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9 || ^2.4", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1475,9 +1487,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -1540,7 +1549,7 @@ "rest", "web service" ], - "time": "2022-08-28T15:39:27+00:00" + "time": "2023-05-21T14:04:53+00:00" }, { "name": "guzzlehttp/oauth-subscriber", @@ -1590,26 +1599,24 @@ }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -1643,21 +1650,21 @@ "keywords": [ "promise" ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-05-21T13:50:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.4.3", + "version": "2.5.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", - "reference": "67c26b443f348a51926030c83481b85718457d3d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -1672,9 +1679,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "2.4-dev" } }, "autoload": { @@ -1733,7 +1737,7 @@ "uri", "url" ], - "time": "2022-10-26T14:07:24+00:00" + "time": "2023-04-17T16:11:26+00:00" }, { "name": "html2text/html2text", @@ -1765,16 +1769,16 @@ }, { "name": "hybridinteractive/craft-position-fieldtype", - "version": "4.0.0-beta.3", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/hybridinteractive/craft-position-fieldtype.git", - "reference": "e0c05bbe55bd9df4ab2fdb89f2b196fe49c0e438" + "reference": "f9c0ef9b48b8021d51b302fd8333216b1e8ea73d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hybridinteractive/craft-position-fieldtype/zipball/e0c05bbe55bd9df4ab2fdb89f2b196fe49c0e438", - "reference": "e0c05bbe55bd9df4ab2fdb89f2b196fe49c0e438", + "url": "https://api.github.com/repos/hybridinteractive/craft-position-fieldtype/zipball/f9c0ef9b48b8021d51b302fd8333216b1e8ea73d", + "reference": "f9c0ef9b48b8021d51b302fd8333216b1e8ea73d", "shasum": "" }, "require": { @@ -1816,17 +1820,74 @@ "support": { "docs": "https://github.com/hybridinteractive/craft-position-fieldtype/blob/master/README.md", "issues": "https://github.com/hybridinteractive/craft-position-fieldtype/issues", - "source": "https://github.com/hybridinteractive/craft-position-fieldtype/tree/4.0.0-beta.3" + "source": "https://github.com/hybridinteractive/craft-position-fieldtype/tree/4.0.0" + }, + "time": "2023-03-13T21:46:19+00:00" + }, + { + "name": "hybridinteractive/craft-width-fieldtype", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/hybridinteractive/craft-width-fieldtype.git", + "reference": "51b2c46fce73e442858c16c46f4cdc968df68397" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hybridinteractive/craft-width-fieldtype/zipball/51b2c46fce73e442858c16c46f4cdc968df68397", + "reference": "51b2c46fce73e442858c16c46f4cdc968df68397", + "shasum": "" + }, + "require": { + "craftcms/cms": "^4.0.0-beta.1" + }, + "type": "craft-plugin", + "extra": { + "name": "Width Fieldtype", + "handle": "width-fieldtype", + "schemaVersion": "1.0.0", + "hasCpSettings": false, + "hasCpSection": false, + "changelogUrl": "https://raw.githubusercontent.com/hybridinteractive/craft-width-fieldtype/master/CHANGELOG.md", + "class": "rias\\widthfieldtype\\WidthFieldtype" + }, + "autoload": { + "psr-4": { + "rias\\widthfieldtype\\": "src/" + } }, - "time": "2022-05-03T18:46:45+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Hybrid Interactive", + "homepage": "https://hybridinteractive.io" + } + ], + "description": "Let users choose from predefined widths", + "keywords": [ + "Craft", + "cms", + "craft-plugin", + "craftcms", + "width fieldtype" + ], + "support": { + "docs": "https://github.com/hybridinteractive/craft-width-fieldtype/blob/master/README.md", + "issues": "https://github.com/hybridinteractive/craft-width-fieldtype/issues", + "source": "https://github.com/hybridinteractive/craft-width-fieldtype/tree/4.0.0" + }, + "time": "2023-03-13T21:46:32+00:00" }, { "name": "illuminate/collections", - "version": "v9.47.0", + "version": "v9.52.14", "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/9668ef5b1cc13cbc0a57a5208417dce2be66a3d4", - "reference": "9668ef5b1cc13cbc0a57a5208417dce2be66a3d4", + "url": "https://api.github.com/repos/illuminate/collections/zipball/d3710b0b244bfc62c288c1a87eaa62dd28352d1f", + "reference": "d3710b0b244bfc62c288c1a87eaa62dd28352d1f", "shasum": "" }, "require": { @@ -1863,15 +1924,15 @@ ], "description": "The Illuminate Collections package.", "homepage": "https://laravel.com", - "time": "2023-01-06T14:14:06+00:00" + "time": "2023-06-11T21:17:10+00:00" }, { "name": "illuminate/conditionable", - "version": "v9.47.0", + "version": "v9.52.14", "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883", - "reference": "5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364", + "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364", "shasum": "" }, "require": { @@ -1899,15 +1960,20 @@ ], "description": "The Illuminate Conditionable package.", "homepage": "https://laravel.com", - "time": "2022-07-29T19:44:19+00:00" + "time": "2023-02-01T21:42:32+00:00" }, { "name": "illuminate/contracts", - "version": "v9.47.0", + "version": "v9.52.14", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "44f65d723b13823baa02ff69751a5948bde60c22" + }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/856ad15be8d80a2f217d30cfe2df3fc3a5c886fd", - "reference": "856ad15be8d80a2f217d30cfe2df3fc3a5c886fd", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/44f65d723b13823baa02ff69751a5948bde60c22", + "reference": "44f65d723b13823baa02ff69751a5948bde60c22", "shasum": "" }, "require": { @@ -1926,6 +1992,7 @@ "Illuminate\\Contracts\\": "" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1937,11 +2004,20 @@ ], "description": "The Illuminate Contracts package.", "homepage": "https://laravel.com", - "time": "2022-12-31T20:34:28+00:00" + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-08T14:36:30+00:00" }, { "name": "illuminate/macroable", - "version": "v9.47.0", + "version": "v9.52.14", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a" + }, "dist": { "type": "zip", "url": "https://api.github.com/repos/illuminate/macroable/zipball/e3bfaf6401742a9c6abca61b9b10e998e5b6449a", @@ -1962,6 +2038,7 @@ "Illuminate\\Support\\": "" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1973,6 +2050,10 @@ ], "description": "The Illuminate Macroable package.", "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, "time": "2022-08-09T13:29:29+00:00" }, { @@ -2102,20 +2183,20 @@ }, { "name": "league/csv", - "version": "9.8.0", + "version": "9.9.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/9d2e0265c5d90f5dd601bc65ff717e05cec19b47", - "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/b4418ede47fbd88facc34e40a16c8ce9153b961b", + "reference": "b4418ede47fbd88facc34e40a16c8ce9153b961b", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "^7.4 || ^8.0" + "php": "^8.1.2" }, "suggest": { - "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes", + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" }, "type": "library", @@ -2125,12 +2206,12 @@ } }, "autoload": { - "psr-4": { - "League\\Csv\\": "src" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "League\\Csv\\": "src" + } }, "license": [ "MIT" @@ -2155,21 +2236,21 @@ "transform", "write" ], - "time": "2022-01-04T00:13:07+00:00" + "time": "2023-03-11T15:57:12+00:00" }, { "name": "league/html-to-markdown", - "version": "4.10.0", + "version": "5.1.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0868ae7a552e809e5cd8f93ba022071640408e88", - "reference": "0868ae7a552e809e5cd8f93ba022071640408e88", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0b4066eede55c48f38bcee4fb8f0aa85654390fd", + "reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd", "shasum": "" }, "require": { "ext-dom": "*", "ext-xml": "*", - "php": ">=5.3.3" + "php": "^7.2.5 || ^8.0" }, "bin": [ "bin/html-to-markdown" @@ -2177,7 +2258,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.10-dev" + "dev-master": "5.2-dev" } }, "autoload": { @@ -2208,7 +2289,7 @@ "html", "markdown" ], - "time": "2020-07-01T00:34:03+00:00" + "time": "2023-07-12T21:21:09+00:00" }, { "name": "league/oauth1-client", @@ -2271,11 +2352,11 @@ }, { "name": "league/oauth2-client", - "version": "2.6.1", + "version": "2.7.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/2334c249907190c132364f5dae0287ab8666aa19", - "reference": "2334c249907190c132364f5dae0287ab8666aa19", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8", "shasum": "" }, "require": { @@ -2321,20 +2402,20 @@ "oauth2", "single sign on" ], - "time": "2021-12-22T16:42:49+00:00" + "time": "2023-04-16T18:19:15+00:00" }, { "name": "league/oauth2-google", - "version": "4.0.0", + "version": "4.0.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/db6d8ad67cdd7d014a1e5dd5c204a319a966de86", - "reference": "db6d8ad67cdd7d014a1e5dd5c204a319a966de86", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/1b01ba18ba31b29e88771e3e0979e5c91d4afe76", + "reference": "1b01ba18ba31b29e88771e3e0979e5c91d4afe76", "shasum": "" }, "require": { "league/oauth2-client": "^2.0", - "php": ">=7.3" + "php": "^7.3 || ^8.0" }, "type": "library", "autoload": { @@ -2348,8 +2429,8 @@ "authors": [ { "name": "Woody Gilk", - "email": "woody.gilk@gmail.com", - "homepage": "http://shadowhand.me" + "email": "hello@shadowhand.com", + "homepage": "https://shadowhand.com" } ], "description": "Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client", @@ -2361,21 +2442,19 @@ "oauth", "oauth2" ], - "time": "2021-03-04T21:12:06+00:00" + "time": "2023-03-17T15:20:52+00:00" }, { "name": "masterminds/html5", - "version": "2.7.6", + "version": "2.8.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/897eb517a343a2281f11bc5556d6548db7d93947", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-dom": "*", - "ext-libxml": "*", "php": ">=5.3.0" }, "type": "library", @@ -2417,15 +2496,15 @@ "serializer", "xml" ], - "time": "2022-08-18T16:18:26+00:00" + "time": "2023-05-10T11:58:31+00:00" }, { "name": "mikehaertl/php-shellcommand", - "version": "1.6.4", + "version": "1.7.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/mikehaertl/php-shellcommand/zipball/3488d7803df1e8f1a343d3d0ca452d527ad8d5e5", - "reference": "3488d7803df1e8f1a343d3d0ca452d527ad8d5e5", + "url": "https://api.github.com/repos/mikehaertl/php-shellcommand/zipball/e79ea528be155ffdec6f3bf1a4a46307bb49e545", + "reference": "e79ea528be155ffdec6f3bf1a4a46307bb49e545", "shasum": "" }, "require": { @@ -2450,7 +2529,7 @@ "keywords": [ "shell" ], - "time": "2021-03-17T06:54:33+00:00" + "time": "2023-04-19T08:25:22+00:00" }, { "name": "mmikkel/cp-field-inspect", @@ -2515,11 +2594,11 @@ }, { "name": "moneyphp/money", - "version": "v4.1.0", + "version": "v4.1.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/moneyphp/money/zipball/c8eeeb1f7b7e6ca95490b94a301dc9cb8cb76c2d", - "reference": "c8eeeb1f7b7e6ca95490b94a301dc9cb8cb76c2d", + "url": "https://api.github.com/repos/moneyphp/money/zipball/9682220995ffd396843be5b4ee1e5f2c2d6ecee2", + "reference": "9682220995ffd396843be5b4ee1e5f2c2d6ecee2", "shasum": "" }, "require": { @@ -2571,15 +2650,15 @@ "money", "vo" ], - "time": "2022-12-19T20:35:32+00:00" + "time": "2023-04-11T09:18:34+00:00" }, { "name": "monolog/monolog", - "version": "2.8.0", + "version": "2.9.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", "shasum": "" }, "require": { @@ -2633,15 +2712,60 @@ "logging", "psr-3" ], - "time": "2022-07-24T11:55:47+00:00" + "time": "2023-02-06T13:44:46+00:00" + }, + { + "name": "nystudio107/craft-code-editor", + "version": "1.0.9", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nystudio107/craft-code-editor/zipball/ed82bebd043245173c187b8c16434bf93e179406", + "reference": "ed82bebd043245173c187b8c16434bf93e179406", + "shasum": "" + }, + "require": { + "phpdocumentor/reflection-docblock": "^5.0.0" + }, + "type": "yii2-extension", + "extra": { + "bootstrap": "nystudio107\\codeeditor\\CodeEditor" + }, + "autoload": { + "psr-4": { + "nystudio107\\codeeditor\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "nystudio107", + "homepage": "https://nystudio107.com" + } + ], + "description": "Provides a code editor field with Twig & Craft API autocomplete", + "keywords": [ + "Craft", + "Monaco", + "cms", + "code", + "craftcms", + "css", + "editor", + "javascript", + "markdown", + "twig" + ], + "time": "2023-04-17T03:53:23+00:00" }, { "name": "nystudio107/craft-imageoptimize", - "version": "4.0.3", + "version": "4.0.5", "dist": { "type": "zip", - "url": "https://api.github.com/repos/nystudio107/craft-imageoptimize/zipball/72fa38affe63a165ae39b67a77053194e888b18b", - "reference": "72fa38affe63a165ae39b67a77053194e888b18b", + "url": "https://api.github.com/repos/nystudio107/craft-imageoptimize/zipball/7fc762505f9790d9626335ef957b1cedd1bd96da", + "reference": "7fc762505f9790d9626335ef957b1cedd1bd96da", "shasum": "" }, "require": { @@ -2690,7 +2814,7 @@ "issues": "https://nystudio107.com/plugins/imageoptimize/support", "source": "https://github.com/nystudio107/craft-imageoptimize" }, - "time": "2022-11-17T19:52:15+00:00" + "time": "2023-05-19T19:13:32+00:00" }, { "name": "nystudio107/craft-imageoptimize-imgix", @@ -2812,11 +2936,11 @@ }, { "name": "nystudio107/craft-plugin-vite", - "version": "4.0.7", + "version": "4.0.8", "dist": { "type": "zip", - "url": "https://api.github.com/repos/nystudio107/craft-plugin-vite/zipball/2fd0b6dddb95d8d42385af81385f9e5b28266408", - "reference": "2fd0b6dddb95d8d42385af81385f9e5b28266408", + "url": "https://api.github.com/repos/nystudio107/craft-plugin-vite/zipball/eb05b1cc7dc9eeecbdfe8cd3cd3d119e83c62619", + "reference": "eb05b1cc7dc9eeecbdfe8cd3cd3d119e83c62619", "shasum": "" }, "require": { @@ -2847,20 +2971,20 @@ "docs": "https://github.com/nystudio107/craft-plugin-vite/blob/v1/README.md", "issues": "https://github.com/nystudio107/craft-plugin-vite/issues" }, - "time": "2022-11-08T15:50:22+00:00" + "time": "2023-01-25T21:09:10+00:00" }, { "name": "nystudio107/craft-vite", - "version": "4.0.4", + "version": "4.0.6", "dist": { "type": "zip", - "url": "https://api.github.com/repos/nystudio107/craft-vite/zipball/d63094e71eb60717855e1e470200a36a0d5ba1ae", - "reference": "d63094e71eb60717855e1e470200a36a0d5ba1ae", + "url": "https://api.github.com/repos/nystudio107/craft-vite/zipball/d20d2dbfd3b2d4ecd0380b3869185d54a9cf80a2", + "reference": "d20d2dbfd3b2d4ecd0380b3869185d54a9cf80a2", "shasum": "" }, "require": { "craftcms/cms": "^4.0.0", - "nystudio107/craft-plugin-vite": "^4.0.6" + "nystudio107/craft-plugin-vite": "^4.0.8" }, "type": "craft-plugin", "extra": { @@ -2895,7 +3019,7 @@ "issues": "https://nystudio107.com/plugins/vite/support", "source": "https://github.com/nystudio107/craft-vite" }, - "time": "2023-01-01T19:14:31+00:00" + "time": "2023-06-07T17:25:10+00:00" }, { "name": "paragonie/random_compat", @@ -2932,6 +3056,75 @@ ], "time": "2020-10-15T08:29:30+00:00" }, + { + "name": "percipioglobal/craft-password-policy", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/percipioglobal/craft-password-policy.git", + "reference": "be47ce25527b9014e75c7c056540fea96394dc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/percipioglobal/craft-password-policy/zipball/be47ce25527b9014e75c7c056540fea96394dc50", + "reference": "be47ce25527b9014e75c7c056540fea96394dc50", + "shasum": "" + }, + "require": { + "craftcms/cms": "^4.0.0-beta.1", + "php": "^8.0.2" + }, + "require-dev": { + "craftcms/phpstan": "dev-main" + }, + "type": "craft-plugin", + "extra": { + "name": "Password Policy", + "handle": "password-policy", + "hasCpSettings": true, + "hasCpSection": false, + "developer": "percipiolondon", + "developerUrl": "https://percipio.london", + "documentationUrl": "https://github.com/percipioglobal/craft-password-policy/blob/v4/README.md", + "changelogUrl": "https://raw.githubusercontent.com/percipioglobal/craft-password-policy/v4/CHANGELOG.md", + "components": { + "passwordService": "percipiolondon\\passwordpolicy\\services\\PasswordService" + }, + "class": "percipiolondon\\passwordpolicy\\PasswordPolicy" + }, + "autoload": { + "psr-4": { + "percipiolondon\\passwordpolicy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Percipio Global Ltd.", + "homepage": "https://percipio.london" + } + ], + "description": "Enforce a password policy on your users.", + "keywords": [ + "Craft", + "cms", + "craft-plugin", + "craftcms", + "passwords", + "security", + "strong passwords" + ], + "support": { + "docs": "https://github.com/percipioglobal/craft-password-policy/blob/v4/README.md", + "email": "support@percipio.london", + "issues": "https://github.com/percipioglobal/craft-password-policy/issues", + "source": "https://github.com/percipioglobal/craft-password-policy/tree/4.1.0" + }, + "time": "2023-03-08T09:34:06+00:00" + }, { "name": "phenx/php-font-lib", "version": "0.5.4", @@ -3084,16 +3277,18 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", + "version": "1.7.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" }, "type": "library", "extra": { @@ -3116,28 +3311,28 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2022-10-14T12:47:21+00:00" + "time": "2023-05-30T18:13:47+00:00" }, { "name": "phpoption/phpoption", - "version": "1.9.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" }, "type": "library", "extra": { @@ -3179,7 +3374,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" }, "funding": [ { @@ -3191,7 +3386,33 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:51:26+00:00" + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.23.0", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a2b24135c35852b348894320d47b3902a94bc494", + "reference": "a2b24135c35852b348894320d47b3902a94bc494", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "time": "2023-07-23T22:17:56+00:00" }, { "name": "pixelandtonic/imagine", @@ -3367,16 +3588,16 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3395,7 +3616,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -3406,20 +3627,20 @@ "psr", "psr-18" ], - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-04-10T20:12:12+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "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" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3438,7 +3659,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -3452,24 +3673,24 @@ "request", "response" ], - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "2.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -3483,7 +3704,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -3496,7 +3717,7 @@ "request", "response" ], - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", @@ -3613,11 +3834,11 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.10.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { @@ -3662,7 +3883,7 @@ "promise", "promises" ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-05-02T15:15:43+00:00" }, { "name": "sabberworm/php-css-parser", @@ -3786,11 +4007,11 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.10.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -3822,7 +4043,7 @@ "parser", "validator" ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2023-05-11T13:16:46+00:00" }, { "name": "seld/phar-utils", @@ -3864,16 +4085,16 @@ }, { "name": "statikbe/craft-config-values", - "version": "2.0.0", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/statikbe/craft-config-values.git", - "reference": "a02288feff5277abb8de2efd64ab5155265a60d4" + "reference": "ebcf6260ecae74c580518ac160f902233fdaf6f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/statikbe/craft-config-values/zipball/a02288feff5277abb8de2efd64ab5155265a60d4", - "reference": "a02288feff5277abb8de2efd64ab5155265a60d4", + "url": "https://api.github.com/repos/statikbe/craft-config-values/zipball/ebcf6260ecae74c580518ac160f902233fdaf6f1", + "reference": "ebcf6260ecae74c580518ac160f902233fdaf6f1", "shasum": "" }, "require": { @@ -3914,26 +4135,26 @@ "support": { "docs": "https://github.com/statikbe/craft-config-values/blob/master/README.md", "issues": "https://github.com/statikbe/craft-config-values/issues", - "source": "https://github.com/statikbe/craft-config-values/tree/2.0.0" + "source": "https://github.com/statikbe/craft-config-values/tree/2.0.2" }, - "time": "2022-05-05T17:42:11+00:00" + "time": "2023-02-15T10:33:33+00:00" }, { "name": "statikbe/craft-cookie-banner", - "version": "2.0.0", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/statikbe/craft-cookie-banner.git", - "reference": "68366b89d3a355433d911c1b4ab2243702a1ca03" + "reference": "af4eb31c2381b215ec1951a3b45d5e8ff44a926b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/statikbe/craft-cookie-banner/zipball/68366b89d3a355433d911c1b4ab2243702a1ca03", - "reference": "68366b89d3a355433d911c1b4ab2243702a1ca03", + "url": "https://api.github.com/repos/statikbe/craft-cookie-banner/zipball/af4eb31c2381b215ec1951a3b45d5e8ff44a926b", + "reference": "af4eb31c2381b215ec1951a3b45d5e8ff44a926b", "shasum": "" }, "require": { - "craftcms/cms": "^4.0.0-beta.1" + "craftcms/cms": "^4.0.0" }, "type": "craft-plugin", "extra": { @@ -3975,22 +4196,22 @@ "support": { "docs": "https://github.com/statikbe/craft-cookie-banner/blob/master/README.md", "issues": "https://github.com/statikbe/craft-cookie-banner/issues", - "source": "https://github.com/statikbe/craft-cookie-banner/tree/2.0.0" + "source": "https://github.com/statikbe/craft-cookie-banner/tree/3.0.4" }, - "time": "2022-05-05T13:53:03+00:00" + "time": "2023-06-14T12:50:38+00:00" }, { "name": "statikbe/craft-cta-field", - "version": "2.0.0-beta.2", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/statikbe/craft-ctafield.git", - "reference": "be3be354a1aec18cd61b8a7d4387b42d0ad1c15f" + "reference": "9e8cf1a429f949b468702173b1db273fe7f91c47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/statikbe/craft-ctafield/zipball/be3be354a1aec18cd61b8a7d4387b42d0ad1c15f", - "reference": "be3be354a1aec18cd61b8a7d4387b42d0ad1c15f", + "url": "https://api.github.com/repos/statikbe/craft-ctafield/zipball/9e8cf1a429f949b468702173b1db273fe7f91c47", + "reference": "9e8cf1a429f949b468702173b1db273fe7f91c47", "shasum": "" }, "require": { @@ -4031,22 +4252,22 @@ "support": { "docs": "https://github.com/statikbe/craft-ctafield/blob/master/README.md", "issues": "https://github.com/statikbe/craft-ctafield/issues", - "source": "https://github.com/statikbe/craft-ctafield/tree/2.0.0-beta.2" + "source": "https://github.com/statikbe/craft-ctafield/tree/2.2.0" }, - "time": "2022-05-11T12:36:22+00:00" + "time": "2023-07-13T08:08:50+00:00" }, { "name": "statikbe/craft-translate", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/statikbe/craft3-translate.git", - "reference": "cf87ccc4b62c6170831aaf9cf6601367fdfa0e46" + "reference": "18c8e203be782f299b71e9ed19b22931612f0556" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/statikbe/craft3-translate/zipball/cf87ccc4b62c6170831aaf9cf6601367fdfa0e46", - "reference": "cf87ccc4b62c6170831aaf9cf6601367fdfa0e46", + "url": "https://api.github.com/repos/statikbe/craft3-translate/zipball/18c8e203be782f299b71e9ed19b22931612f0556", + "reference": "18c8e203be782f299b71e9ed19b22931612f0556", "shasum": "" }, "require": { @@ -4096,26 +4317,26 @@ "support": { "docs": "https://github.com/statikbe/craft3-translate/blob/master/README.md", "issues": "https://github.com/statikbe/craft3-translate/issues", - "source": "https://github.com/statikbe/craft3-translate/tree/2.1.1" + "source": "https://github.com/statikbe/craft3-translate/tree/2.1.2" }, - "time": "2022-11-25T13:37:32+00:00" + "time": "2023-04-11T15:57:21+00:00" }, { "name": "statikbe/craft-video-parser", - "version": "2.0.0-beta.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/statikbe/craft-video-parser.git", - "reference": "3936e652f2d2ec7c8de7b692bd86528f70d81098" + "reference": "70d7599dd29cc35c8fa38123eb54535a1f4f7f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/statikbe/craft-video-parser/zipball/3936e652f2d2ec7c8de7b692bd86528f70d81098", - "reference": "3936e652f2d2ec7c8de7b692bd86528f70d81098", + "url": "https://api.github.com/repos/statikbe/craft-video-parser/zipball/70d7599dd29cc35c8fa38123eb54535a1f4f7f78", + "reference": "70d7599dd29cc35c8fa38123eb54535a1f4f7f78", "shasum": "" }, "require": { - "craftcms/cms": "^3.0.0|^4.0.0-beta.1" + "craftcms/cms": "^4.0.0" }, "require-dev": { "codeception/codeception": "^4.0.0", @@ -4162,9 +4383,9 @@ "support": { "docs": "https://github.com/statikbe/craft-video-parser/blob/master/README.md", "issues": "https://github.com/statikbe/craft-video-parser/issues", - "source": "https://github.com/statikbe/craft-video-parser/tree/2.0.0-beta.1" + "source": "https://github.com/statikbe/craft-video-parser/tree/2.1.0" }, - "time": "2022-03-15T19:44:49+00:00" + "time": "2022-07-27T15:47:53+00:00" }, { "name": "stripe/stripe-php", @@ -4272,16 +4493,11 @@ }, { "name": "studioespresso/craft-navigate", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/studioespresso/craft3-navigate.git", - "reference": "9fab7786d99eb72a13b3c2f73ec16ab685a82227" - }, + "version": "3.1.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/studioespresso/craft3-navigate/zipball/9fab7786d99eb72a13b3c2f73ec16ab685a82227", - "reference": "9fab7786d99eb72a13b3c2f73ec16ab685a82227", + "url": "https://api.github.com/repos/studioespresso/craft3-navigate/zipball/9bff1b5ddd900de9933b50dfebe53f64d355c4fe", + "reference": "9bff1b5ddd900de9933b50dfebe53f64d355c4fe", "shasum": "" }, "require": { @@ -4305,7 +4521,6 @@ "studioespresso\\navigate\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "proprietary" ], @@ -4317,8 +4532,8 @@ ], "description": "Navigation plugin for Craft 3", "keywords": [ - "Craft", "cms", + "craft", "craft-plugin", "craftcms", "menus", @@ -4327,18 +4542,17 @@ ], "support": { "docs": "https://github.com/studioespresso/craft3-navigate/blob/master/README.md", - "issues": "https://github.com/studioespresso/craft3-navigate/issues", - "source": "https://github.com/studioespresso/craft3-navigate/tree/3.0.2" + "issues": "https://github.com/studioespresso/craft3-navigate/issues" }, - "time": "2022-10-10T18:06:34+00:00" + "time": "2023-07-04T18:37:37+00:00" }, { "name": "studioespresso/craft-seo-fields", - "version": "3.2.0", + "version": "3.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/studioespresso/craft-seo-fields/zipball/466778428280585ee8e0c072cf83f487e9e6c418", - "reference": "466778428280585ee8e0c072cf83f487e9e6c418", + "url": "https://api.github.com/repos/studioespresso/craft-seo-fields/zipball/a3a8790a1227073007f62058c4d98a47cf7598ac", + "reference": "a3a8790a1227073007f62058c4d98a47cf7598ac", "shasum": "" }, "require": { @@ -4383,24 +4597,24 @@ "docs": "https://studioespresso.github.io/craft-seo-fields/", "issues": "https://github.com/studioespresso/craft-seo-fields/issues" }, - "time": "2022-12-29T14:18:39+00:00" + "time": "2023-07-24T17:47:10+00:00" }, { "name": "symfony/cache", - "version": "v6.2.4", + "version": "v6.3.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/ddd1a70bfdf4ed19facad0db689c7bca979d322e", - "reference": "ddd1a70bfdf4ed19facad0db689c7bca979d322e", + "url": "https://api.github.com/repos/symfony/cache/zipball/d176b97600860df13e851538c2df2ad88e9e5ca9", + "reference": "d176b97600860df13e851538c2df2ad88e9e5ca9", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2|^3", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^6.2" + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.2.10" }, "conflict": { "doctrine/dbal": "<2.13.1", @@ -4444,28 +4658,25 @@ "caching", "psr6" ], - "time": "2022-12-29T16:29:13+00:00" + "time": "2023-07-27T16:19:14+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/e8d1a5fc43534063204b74c080ebe36307d12271", - "reference": "e8d1a5fc43534063204b74c080ebe36307d12271", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ad945640ccc0ae6e208bcea7d7de4b39b569896b", + "reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^3.0" }, - "suggest": { - "symfony/cache-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4500,15 +4711,15 @@ "interoperability", "standards" ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/console", - "version": "v5.4.17", + "version": "v5.4.26", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f", - "reference": "58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f", + "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273", "shasum": "" }, "require": { @@ -4563,19 +4774,19 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], - "time": "2022-12-28T14:15:31+00:00" + "time": "2023-07-19T20:11:33+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -4584,7 +4795,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4611,32 +4822,29 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.2", + "version": "v6.3.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3ffeb31139b49bf6ef0bc09d1db95eac053388d1", - "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", "symfony/event-dispatcher-implementation": "2.0|3.0" }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, "type": "library", "autoload": { "psr-4": { @@ -4661,28 +4869,25 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "time": "2022-12-14T16:11:27+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4717,15 +4922,15 @@ "interoperability", "standards" ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/expression-language", - "version": "v5.4.14", + "version": "v5.4.21", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/2f27d5b1e7926bba18e87719af75f696977cd58b", - "reference": "2f27d5b1e7926bba18e87719af75f696977cd58b", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/501589522b844b8eecf012c133f0404f0eef77ac", + "reference": "501589522b844b8eecf012c133f0404f0eef77ac", "shasum": "" }, "require": { @@ -4757,15 +4962,15 @@ ], "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", - "time": "2022-10-07T08:01:20+00:00" + "time": "2023-02-14T08:03:56+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.0", + "version": "v6.3.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/50b2523c874605cf3d4acf7a9e2b30b6a440a016", - "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -4797,15 +5002,15 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "time": "2022-11-20T13:01:27+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/finder", - "version": "v6.2.3", + "version": "v6.3.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/81eefbddfde282ee33b437ba5e13d7753211ae8e", - "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -4835,23 +5040,27 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "time": "2022-12-22T17:55:15+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { "name": "symfony/http-client", - "version": "v6.2.2", + "version": "v6.3.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/7054ad466f836309aef511789b9c697bc986d8ce", - "reference": "7054ad466f836309aef511789b9c697bc986d8ce", + "url": "https://api.github.com/repos/symfony/http-client/zipball/15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", + "reference": "15f9f4bad62bfcbe48b5dedd866f04a08fc7ff00", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^1.0|^2|^3" + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" }, "provide": { "php-http/async-client-implementation": "*", @@ -4883,27 +5092,27 @@ ], "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", - "time": "2022-12-14T16:11:27+00:00" + "keywords": [ + "http" + ], + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c5f587eb445224ddfeb05b5ee703476742d730bf", - "reference": "c5f587eb445224ddfeb05b5ee703476742d730bf", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3b66325d0176b4ec826bffab57c9037d759c31fb", + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/http-client-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4941,27 +5150,28 @@ "interoperability", "standards" ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/mailer", - "version": "v6.2.2", + "version": "v6.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b355ad81f1d2987c47dcd3b04d5dce669e1e62e6", - "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3", + "egulias/email-validator": "^2.1.10|^3|^4", "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/mime": "^6.2", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", "symfony/messenger": "<6.2", "symfony/mime": "<6.2", @@ -4991,19 +5201,20 @@ ], "description": "Helps sending emails", "homepage": "https://symfony.com", - "time": "2022-12-14T16:11:27+00:00" + "time": "2023-05-29T12:49:39+00:00" }, { "name": "symfony/mime", - "version": "v6.2.2", + "version": "v6.3.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/8c98bf40406e791043890a163f6f6599b9cfa1ed", - "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed", + "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -5012,7 +5223,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "type": "library", "autoload": { @@ -5042,7 +5253,7 @@ "mime", "mime-type" ], - "time": "2022-12-14T16:38:10+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5577,21 +5788,22 @@ }, { "name": "symfony/postmark-mailer", - "version": "v6.2.0-RC1", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/postmark-mailer.git", - "reference": "5f38d688df43bea507bf0dfe0d0ca6f99221b708" + "reference": "c486fb0a4d503c7af58e2aee516aeee43d91e7fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/5f38d688df43bea507bf0dfe0d0ca6f99221b708", - "reference": "5f38d688df43bea507bf0dfe0d0ca6f99221b708", + "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/c486fb0a4d503c7af58e2aee516aeee43d91e7fc", + "reference": "c486fb0a4d503c7af58e2aee516aeee43d91e7fc", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/mailer": "^5.4|^6.0" + "psr/event-dispatcher": "^1", + "symfony/mailer": "^5.4.21|^6.2.7" }, "require-dev": { "symfony/http-client": "^5.4|^6.0" @@ -5622,7 +5834,7 @@ "description": "Symfony Postmark Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/postmark-mailer/tree/v6.2.0-RC1" + "source": "https://github.com/symfony/postmark-mailer/tree/v6.2.7" }, "funding": [ { @@ -5638,15 +5850,15 @@ "type": "tidelift" } ], - "time": "2022-04-01T07:15:35+00:00" + "time": "2023-02-21T10:35:38+00:00" }, { "name": "symfony/process", - "version": "v6.2.0", + "version": "v6.3.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ba6e55359f8f755fe996c58a81e00eaa67a35877", - "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877", + "url": "https://api.github.com/repos/symfony/process/zipball/c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", + "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", "shasum": "" }, "require": { @@ -5676,15 +5888,15 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "time": "2022-11-02T09:08:04+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -5694,13 +5906,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5738,15 +5947,15 @@ "interoperability", "standards" ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.2.2", + "version": "v6.3.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/863219fd713fa41cbcd285a79723f94672faff4d", - "reference": "863219fd713fa41cbcd285a79723f94672faff4d", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -5757,7 +5966,7 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "type": "library", "autoload": { @@ -5794,30 +6003,25 @@ "utf-8", "utf8" ], - "time": "2022-12-14T16:11:27+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.3", + "version": "v6.3.3", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/fdbadd4803bc3c96ef89238c9c9e2ebe424ec2e0", - "reference": "fdbadd4803bc3c96ef89238c9c9e2ebe424ec2e0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/77fb4f2927f6991a9843633925d111147449ee7a", + "reference": "77fb4f2927f6991a9843633925d111147449ee7a", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.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" ], @@ -5852,15 +6056,15 @@ "debug", "dump" ], - "time": "2022-12-22T17:55:15+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.2.3", + "version": "v6.3.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d055d12b20b42e407e607460e7552a1fe6d27f08", - "reference": "d055d12b20b42e407e607460e7552a1fe6d27f08", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/3400949782c0cb5b3e73aa64cfd71dde000beccc", + "reference": "3400949782c0cb5b3e73aa64cfd71dde000beccc", "shasum": "" }, "require": { @@ -5896,19 +6100,19 @@ "export", "hydrate", "instantiate", - "lazy loading", + "lazy-loading", "proxy", "serialize" ], - "time": "2022-12-22T17:55:15+00:00" + "time": "2023-07-26T17:39:03+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.17", + "version": "v5.4.23", "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/edcdc11498108f8967fe95118a7ec8624b94760e", - "reference": "edcdc11498108f8967fe95118a7ec8624b94760e", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", "shasum": "" }, "require": { @@ -5949,7 +6153,7 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "time": "2022-12-13T09:57:04+00:00" + "time": "2023-04-23T19:33:36+00:00" }, { "name": "theiconic/name-parser", @@ -5986,17 +6190,17 @@ }, { "name": "thenetworg/oauth2-azure", - "version": "v2.1.1", + "version": "v2.2.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06fb2d620fb6e6c934f632c7ec7c5ea2e978a844", - "reference": "06fb2d620fb6e6c934f632c7ec7c5ea2e978a844", + "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/e092f6fca469f8109aab4694e9e2dee98717af17", + "reference": "e092f6fca469f8109aab4694e9e2dee98717af17", "shasum": "" }, "require": { "ext-json": "*", "ext-openssl": "*", - "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0", + "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0 < 6.8", "league/oauth2-client": "~2.0", "php": "^7.1|^8.0" }, @@ -6029,7 +6233,7 @@ "oauth2", "windows azure" ], - "time": "2022-06-23T10:35:36+00:00" + "time": "2023-08-01T09:16:29+00:00" }, { "name": "twig/twig", @@ -6085,11 +6289,11 @@ }, { "name": "verbb/base", - "version": "2.0.1", + "version": "2.0.2", "dist": { "type": "zip", - "url": "https://api.github.com/repos/verbb/verbb-base/zipball/3a7c0b9c36d446d2765e467161c7d40aa41f1ae4", - "reference": "3a7c0b9c36d446d2765e467161c7d40aa41f1ae4", + "url": "https://api.github.com/repos/verbb/verbb-base/zipball/ced85b38b7afd51251ab806c44d2fb05669c0181", + "reference": "ced85b38b7afd51251ab806c44d2fb05669c0181", "shasum": "" }, "require": { @@ -6112,7 +6316,7 @@ } ], "description": "Common utilities and building-blocks for Verbb plugins for Craft CMS.", - "time": "2022-09-30T11:02:57+00:00" + "time": "2023-05-10T02:57:47+00:00" }, { "name": "verbb/element-index-defaults", @@ -6179,16 +6383,11 @@ }, { "name": "verbb/expanded-singles", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/verbb/expanded-singles.git", - "reference": "c05eaf36e38aaa05221a7907a93c98ea72b046e2" - }, + "version": "2.0.5", "dist": { "type": "zip", - "url": "https://api.github.com/repos/verbb/expanded-singles/zipball/c05eaf36e38aaa05221a7907a93c98ea72b046e2", - "reference": "c05eaf36e38aaa05221a7907a93c98ea72b046e2", + "url": "https://api.github.com/repos/verbb/expanded-singles/zipball/7a456deb91a8bd138c6f249c7ab5ff6eba9ea90e", + "reference": "7a456deb91a8bd138c6f249c7ab5ff6eba9ea90e", "shasum": "" }, "require": { @@ -6210,7 +6409,6 @@ "verbb\\expandedsingles\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6220,51 +6418,45 @@ "homepage": "https://verbb.io" } ], - "description": "A simple plugin for Craft CMS that alters the Entries Index sidebar to list all Singles, rather than grouping them under a 'Singles' link.", + "description": "Extract Single entries to be top-level entries.", "keywords": [ - "Craft", "cms", + "craft", "craft-plugin", "craftcms", "expanded singles" ], "support": { - "docs": "https://github.com/verbb/expanded-singles", "email": "support@verbb.io", "issues": "https://github.com/verbb/expanded-singles/issues?state=open", - "rss": "https://github.com/verbb/expanded-singles/commits/v2.atom", - "source": "https://github.com/verbb/expanded-singles" + "source": "https://github.com/verbb/expanded-singles", + "docs": "https://github.com/verbb/expanded-singles", + "rss": "https://github.com/verbb/expanded-singles/commits/v2.atom" }, - "funding": [ - { - "url": "https://github.com/verbb", - "type": "github" - } - ], - "time": "2022-07-09T22:26:03+00:00" + "time": "2023-08-03T06:32:58+00:00" }, { "name": "verbb/formie", - "version": "2.0.18", + "version": "2.0.33", "dist": { "type": "zip", - "url": "https://api.github.com/repos/verbb/formie/zipball/6823917f3b7e51b09a6f655b191d90a62803b63c", - "reference": "6823917f3b7e51b09a6f655b191d90a62803b63c", + "url": "https://api.github.com/repos/verbb/formie/zipball/32c1b14cfba9111cd91000adfdcb55b89d551d4c", + "reference": "32c1b14cfba9111cd91000adfdcb55b89d551d4c", "shasum": "" }, "require": { "commerceguys/addressing": "^1.2", - "craftcms/cms": "^4.0.0", - "dompdf/dompdf": "^1.0.2 || ^2.0.0", + "craftcms/cms": "^4.3.2", + "dompdf/dompdf": "^1.0.2 || ^2.0.3", "ezyang/htmlpurifier": "^4.13", "fakerphp/faker": "^1.9.1", "giggsey/libphonenumber-for-php": "^8.12", "guzzlehttp/oauth-subscriber": "^0.4.0 || ^0.5.0 || ^0.6.0", "html2text/html2text": "^4.3", - "league/html-to-markdown": "^4.10", + "league/html-to-markdown": "^4.10 || ^5.0", "league/oauth1-client": "^1.9", "league/oauth2-client": "^2.6.0", - "league/oauth2-google": "^4.0", + "league/oauth2-google": "^3.0 || ^4.0", "moneyphp/money": "^4.0", "nystudio107/craft-plugin-vite": "^4.0.0-beta.4", "php": "^8.0.2", @@ -6309,15 +6501,15 @@ "docs": "https://github.com/verbb/formie", "rss": "https://github.com/verbb/formie/commits/v2.atom" }, - "time": "2022-11-18T22:27:43+00:00" + "time": "2023-07-11T00:11:40+00:00" }, { "name": "verbb/super-table", - "version": "3.0.7", + "version": "3.0.9", "dist": { "type": "zip", - "url": "https://api.github.com/repos/verbb/super-table/zipball/fdcc8b47ce37abf26de197f598af0e58be158d4f", - "reference": "fdcc8b47ce37abf26de197f598af0e58be158d4f", + "url": "https://api.github.com/repos/verbb/super-table/zipball/117b22a4b79294b24236cf0f61db0b7bdcac0d17", + "reference": "117b22a4b79294b24236cf0f61db0b7bdcac0d17", "shasum": "" }, "require": { @@ -6348,7 +6540,7 @@ "homepage": "https://verbb.io" } ], - "description": "Super-charge your Craft workflow with Super Table. Use it to group fields together or build complex Matrix-in-Matrix solutions.", + "description": "Super-charge your content builders and create nested Matrix fields.", "keywords": [ "cms", "craft", @@ -6363,40 +6555,104 @@ "docs": "https://github.com/verbb/super-table", "rss": "https://github.com/verbb/super-table/commits/v2.atom" }, - "time": "2022-12-10T00:37:08+00:00" + "time": "2023-05-24T06:30:16+00:00" + }, + { + "name": "verbb/tablemaker", + "version": "4.0.6", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/verbb/tablemaker/zipball/473773da509aa4a992796876b9be6f4ff58b6445", + "reference": "473773da509aa4a992796876b9be6f4ff58b6445", + "shasum": "" + }, + "require": { + "craftcms/cms": "^4.0.0", + "php": "^8.0.2", + "verbb/base": "^2.0.0" + }, + "type": "craft-plugin", + "extra": { + "name": "Table Maker", + "handle": "tablemaker", + "documentationUrl": "https://github.com/verbb/tablemaker", + "changelogUrl": "https://raw.githubusercontent.com/verbb/tablemaker/craft-3/CHANGELOG.md", + "class": "verbb\\tablemaker\\TableMaker" + }, + "autoload": { + "psr-4": { + "verbb\\tablemaker\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Verbb", + "homepage": "https://verbb.io" + }, + { + "name": "Supercool Ltd", + "homepage": "http://www.supercooldesign.co.uk/" + } + ], + "description": "A user-definable table field type for Craft CMS", + "keywords": [ + "cms", + "craft", + "craft-plugin", + "craftcms", + "table maker" + ], + "support": { + "email": "support@verbb.io", + "issues": "https://github.com/verbb/tablemaker/issues?state=open", + "source": "https://github.com/verbb/tablemaker", + "docs": "https://github.com/verbb/tablemaker", + "rss": "https://github.com/verbb/tablemaker/commits/v2.atom" + }, + "time": "2023-04-21T10:15:53+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v3.6.10", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "5b547cdb25825f10251370f57ba5d9d924e6f68e" + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/5b547cdb25825f10251370f57ba5d9d924e6f68e", - "reference": "5b547cdb25825f10251370f57ba5d9d924e6f68e", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", - "phpoption/phpoption": "^1.5.2", - "symfony/polyfill-ctype": "^1.17" + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21" + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" }, "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." + "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, "branch-alias": { - "dev-master": "3.6-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -6428,7 +6684,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v3.6.10" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" }, "funding": [ { @@ -6440,15 +6696,15 @@ "type": "tidelift" } ], - "time": "2021-12-12T23:02:06+00:00" + "time": "2022-10-16T01:01:54+00:00" }, { "name": "voku/anti-xss", - "version": "4.1.39", + "version": "4.1.42", "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/anti-xss/zipball/64a59ba4744e6722866ff3440d93561da9e85cd0", - "reference": "64a59ba4744e6722866ff3440d93561da9e85cd0", + "url": "https://api.github.com/repos/voku/anti-xss/zipball/bca1f8607e55a3c5077483615cd93bd8f11bd675", + "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675", "shasum": "" }, "require": { @@ -6488,7 +6744,7 @@ "security", "xss" ], - "time": "2022-03-08T17:03:58+00:00" + "time": "2023-07-03T14:40:46+00:00" }, { "name": "voku/arrayy", @@ -6622,11 +6878,11 @@ }, { "name": "voku/portable-utf8", - "version": "6.0.12", + "version": "6.0.13", "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-utf8/zipball/db0583727bb17666bbd2ba238c85babb973fd165", - "reference": "db0583727bb17666bbd2ba238c85babb973fd165", + "url": "https://api.github.com/repos/voku/portable-utf8/zipball/b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", "shasum": "" }, "require": { @@ -6682,7 +6938,7 @@ "utf-8", "utf8" ], - "time": "2023-01-11T12:26:16+00:00" + "time": "2023-03-08T08:35:38+00:00" }, { "name": "voku/stop-words", @@ -6921,11 +7177,11 @@ }, { "name": "webonyx/graphql-php", - "version": "v14.11.9", + "version": "v14.11.10", "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/ff91c9f3cf241db702e30b2c42bcc0920e70ac70", - "reference": "ff91c9f3cf241db702e30b2c42bcc0920e70ac70", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/d9c2fdebc6aa01d831bc2969da00e8588cffef19", + "reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19", "shasum": "" }, "require": { @@ -6952,7 +7208,7 @@ "api", "graphql" ], - "time": "2023-01-06T12:12:50+00:00" + "time": "2023-07-05T14:23:37+00:00" }, { "name": "yiisoft/yii2", @@ -7096,11 +7352,11 @@ }, { "name": "yiisoft/yii2-debug", - "version": "2.1.19", + "version": "2.1.22", "dist": { "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/84d20d738b0698298f851fcb6fc25e748d759223", - "reference": "84d20d738b0698298f851fcb6fc25e748d759223", + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/c0fa388c56b64edfb92987fdcc37d7a0243170d7", + "reference": "c0fa388c56b64edfb92987fdcc37d7a0243170d7", "shasum": "" }, "require": { @@ -7149,7 +7405,7 @@ "debugger", "yii2" ], - "time": "2022-04-05T20:35:14+00:00" + "time": "2022-11-18T17:29:27+00:00" }, { "name": "yiisoft/yii2-queue", @@ -7268,12 +7524,8 @@ ], "packages-dev": [], "aliases": [], - "minimum-stability": "beta", - "stability-flags": { - "hybridinteractive/craft-position-fieldtype": 10, - "statikbe/craft-cta-field": 10, - "statikbe/craft-video-parser": 10 - }, + "minimum-stability": "stable", + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -7281,5 +7533,5 @@ "ext-json": "*" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } diff --git a/config/app.php b/config/app.php index aef23ab1..04738936 100644 --- a/config/app.php +++ b/config/app.php @@ -39,6 +39,12 @@ ]; return Craft::createObject(App::mailerConfig($settings)); }, + 'db' => function() { + $config = craft\helpers\App::dbConfig(); + // Enable profiling for the debug toolbar + $config['enableProfiling'] = App::parseBooleanEnv('$DB_PROFILING') ?: false; + return Craft::createObject($config); + }, ], ], diff --git a/config/general.php b/config/general.php index 31ff6f7b..dd5085ba 100644 --- a/config/general.php +++ b/config/general.php @@ -6,7 +6,7 @@ * list of the available settings in vendor/craftcms/cms/src/config/GeneralConfig.php. */ -return [ +$settings = [ // Global settings '*' => [ 'enableGql' => false, @@ -21,35 +21,11 @@ 'securityKey' => getenv('SECURITY_KEY'), 'elevatedSessionDuration' => 360000, 'verificationCodeDuration' => 'P3W', + 'transformGifs' => false, 'defaultSearchTermOptions' => array( 'subLeft' => true, 'subRight' => true, ), - 'aliases' => [ - 'basePath' => $_SERVER['DOCUMENT_ROOT'], - 'baseUrl' => strtolower((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https://' : 'http://') . $_SERVER['SERVER_NAME']), - ], - // Registration & account settings - 'loginPath' => [ - 'nl' => '/aanmelden', - 'fr' => '/inscrivez-vous', - 'en' => '/login' - ], - 'setPasswordPath' => [ - 'nl' => '/wachtwoord-vernieuwen', - 'fr' => '/renouveler-mot-de-passe', - 'en' => '/renew-password' - ], - 'activateAccountSuccessPath' => [ - 'nl' => '/registratie-voltooid', - 'fr' => '/inscription-terminee', - 'en' => '/registration-completed' - ], - 'setPasswordSuccessPath' => [ - 'nl' => '/wachtwoord-ingesteld', - 'fr' => '/mot-de-passe-ensemble', - 'en' => '/password-set' - ], ], // Production environment settings @@ -57,6 +33,9 @@ 'enableTemplateCaching' => true, 'backupOnUpdate' => true, 'allowAdminChanges' => (php_sapi_name() === 'cli'), + 'aliases' => [ + 'baseUrl' => getenv('BASE_URL'), + ], ], // Staging environment settings 'staging' => [ @@ -65,8 +44,7 @@ 'backupOnUpdate' => false, 'allowAdminChanges' => (php_sapi_name() === 'cli'), 'aliases' => [ - 'basePath' => $_SERVER['DOCUMENT_ROOT'], - 'baseUrl' => 'https://crabas.staging.statik.be', + 'baseUrl' => getenv('BASE_URL'), ], ], @@ -76,8 +54,35 @@ 'backupOnUpdate' => false, 'devMode' => true, 'aliases' => [ - 'basePath' => $_SERVER['DOCUMENT_ROOT'], 'baseUrl' => getenv('BASE_URL'), ], ], ]; + +if (getenv('PUBLIC_ACCOUNT_FLOW')) { + $settings['*']['loginPath'] = [ + 'nl' => '/aanmelden', + 'fr' => '/inscrivez-vous', + 'en' => '/login' + ]; + + $settings['*']['setPasswordPath'] = [ + 'nl' => '/wachtwoord-vernieuwen', + 'fr' => '/renouveler-mot-de-passe', + 'en' => '/renew-password' + ]; + + $settings['*']['activateAccountSuccessPath'] = [ + 'nl' => '/registratie-voltooid', + 'fr' => '/inscription-terminee', + 'en' => '/registration-completed' + ]; + + $settings['*']['setPasswordSuccessPath'] = [ + 'nl' => '/wachtwoord-ingesteld', + 'fr' => '/mot-de-passe-ensemble', + 'en' => '/password-set' + ]; +} + +return $settings; diff --git a/config/image-optimize.php b/config/image-optimize.php index f0b5eadf..343045e3 100644 --- a/config/image-optimize.php +++ b/config/image-optimize.php @@ -64,7 +64,7 @@ // Controls whether Optimized Image Variants are created that would be up-scaled // to be larger than the original source image - 'allowUpScaledImageVariants' => false, + 'allowUpScaledImageVariants' => true, // Controls whether images scaled down >= 50% should be automatically sharpened 'autoSharpenScaledImages' => true, @@ -225,7 +225,7 @@ 'imageVariantCreators' => [ // webp variant creator 'cwebp' => [ - 'commandPath' => '/usr/local/Cellar/webp/1.2.0/bin/cwebp', + 'commandPath' => '/usr/local/bin/cwebp', 'commandOptions' => '-jpeg_like -af', 'commandOutputFileFlag' => '-o', 'commandQualityFlag' => '-q', diff --git a/config/password-policy.php b/config/password-policy.php new file mode 100644 index 00000000..11f36916 --- /dev/null +++ b/config/password-policy.php @@ -0,0 +1,21 @@ + 12, + + // Maximum password length + "maxLength" => 160, + + // Force users to use different cases + "cases" => true, + + // Require at least 1 number + "numbers" => true, + + // Require at least one symbol + "symbols" => true, + + // Show a password strength indicator + "showStrengthIndicator" => true, +]; \ No newline at end of file diff --git a/config/project/ckeditor/configs/131a4f6d-f00f-4238-b846-dd504bf669fe.yaml b/config/project/ckeditor/configs/131a4f6d-f00f-4238-b846-dd504bf669fe.yaml new file mode 100644 index 00000000..0604039a --- /dev/null +++ b/config/project/ckeditor/configs/131a4f6d-f00f-4238-b846-dd504bf669fe.yaml @@ -0,0 +1,12 @@ +headingLevels: + - 3 + - 4 + - 5 + - 6 +name: Simple +options: + code: + indentSequence: ' ' +toolbar: + - bold + - italic diff --git a/config/project/ckeditor/configs/25f93ead-d3f6-4049-ba98-6378754f4289.yaml b/config/project/ckeditor/configs/25f93ead-d3f6-4049-ba98-6378754f4289.yaml new file mode 100644 index 00000000..febddf1b --- /dev/null +++ b/config/project/ckeditor/configs/25f93ead-d3f6-4049-ba98-6378754f4289.yaml @@ -0,0 +1,29 @@ +headingLevels: + - 3 + - 4 + - 5 +name: Extended +options: + code: + indentSequence: ' ' + link: + decorators: + openInNewTab: + attributes: + target: _blank + defaultValue: false + label: 'Open in a new tab' + mode: manual + list: + properties: + reversed: true + startIndex: true + styles: false +toolbar: + - heading + - '|' + - bold + - italic + - bulletedList + - numberedList + - link diff --git a/config/project/ckeditor/configs/5dbe5a67-b60b-4529-a095-facb9b24a39b.yaml b/config/project/ckeditor/configs/5dbe5a67-b60b-4529-a095-facb9b24a39b.yaml new file mode 100644 index 00000000..f70bdac7 --- /dev/null +++ b/config/project/ckeditor/configs/5dbe5a67-b60b-4529-a095-facb9b24a39b.yaml @@ -0,0 +1,15 @@ +headingLevels: + - 3 + - 4 + - 5 + - 6 +name: Table +options: + code: + indentSequence: ' ' +toolbar: + - sourceEditing + - bold + - italic + - insertTable + - link diff --git a/config/project/ckeditor/configs/7d23b02c-ad1d-44a8-9751-35fbdcc38963.yaml b/config/project/ckeditor/configs/7d23b02c-ad1d-44a8-9751-35fbdcc38963.yaml new file mode 100644 index 00000000..e07d2fef --- /dev/null +++ b/config/project/ckeditor/configs/7d23b02c-ad1d-44a8-9751-35fbdcc38963.yaml @@ -0,0 +1,13 @@ +headingLevels: + - 3 + - 4 + - 5 + - 6 +name: Standard +options: + code: + indentSequence: ' ' +toolbar: + - bold + - italic + - link diff --git a/config/project/entryTypes/news--109f5d44-e366-49e7-826d-6b13de779861.yaml b/config/project/entryTypes/news--109f5d44-e366-49e7-826d-6b13de779861.yaml index e686502b..94a6fc99 100644 --- a/config/project/entryTypes/news--109f5d44-e366-49e7-826d-6b13de779861.yaml +++ b/config/project/entryTypes/news--109f5d44-e366-49e7-826d-6b13de779861.yaml @@ -26,72 +26,65 @@ fieldLayouts: tip: null title: null type: craft\fieldlayoutelements\entries\EntryTitleField - uid: 634f6ac7-8949-4d7a-86e7-49bd278416a4 + uid: ead2c767-fdc3-46c0-bcfe-cd972d8c1528 userCondition: null warning: null - width: 100 + width: 50 - elementCondition: null - fieldUid: b5de6dcf-80e6-48e2-b846-0dab7f35c4c8 # Intro Text + fieldUid: 8ff8437a-a38f-47f0-b489-1701614eec3f # Header image instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 6d4cac0f-97f6-4ef9-bc48-04c65cdd7fa3 + uid: 818d1189-bba4-484d-9a18-86a44381c99d userCondition: null warning: null - width: 100 + width: 50 - elementCondition: null - fieldUid: 21a6a6a5-a745-4a32-bcbd-3a8da8fa4e25 # Hero image + fieldUid: b5de6dcf-80e6-48e2-b846-0dab7f35c4c8 # Intro Text instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 3a352584-2499-4e5e-89d3-a235836d517e + uid: 8b097df2-956c-43f7-9004-c4fe3547855b userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: 56d715d0-6a9d-4562-9c66-e5b4caad7f44 # Content Builder - instructions: null - label: null - required: false - tip: null - type: craft\fieldlayoutelements\CustomField - uid: 8f4e8ac8-a3a2-40b6-86e2-4ebeb8f75991 + type: craft\fieldlayoutelements\HorizontalRule + uid: 79e512cf-cb81-4eb7-8e3c-d8bdcbfaf463 userCondition: null - warning: null - width: 100 - elementCondition: null - fieldUid: c7f05fcd-6b9c-44dd-baee-f3e9cd0c47ac # News subject + fieldUid: 56d715d0-6a9d-4562-9c66-e5b4caad7f44 # Content Builder instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 24dc106b-3371-4886-9e80-34890a1473be + uid: 7e301bd2-4f48-4d65-b2cf-0a67c5e73199 userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: 8508e8ce-9fbd-4268-9094-1bb0acfcfba3 # News media + fieldUid: c7f05fcd-6b9c-44dd-baee-f3e9cd0c47ac # News subject instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: f8b91ce0-be60-4edc-b9b0-907790de423b + uid: 09f68857-ed8b-4730-be3d-efd87b7b4ceb userCondition: null warning: null width: 100 name: Content - uid: cd5464cd-740a-41a1-bd1a-ed5c7a94d912 + uid: e191a2d3-f251-4cf4-b1de-1262c64534a6 userCondition: null - elementCondition: null @@ -104,7 +97,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: af2e5142-c122-433a-8384-b51f973d12ae + uid: 580d68a6-fe4d-4f8f-a592-6ad57e55a870 userCondition: null warning: null width: 100 @@ -116,7 +109,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 8f3515d1-c5be-49d6-aa78-f4da62b6a43c + uid: 4c1ea5f7-3de4-4fb8-b7b1-e04626a4c9a5 userCondition: null warning: null width: 100 @@ -128,12 +121,12 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 70e9cd8b-aeaf-47b7-b4fd-a8014d0e5418 + uid: 7c22f70d-7c04-41c8-9d18-16c6c67d4b70 userCondition: null warning: null width: 100 name: Overview - uid: be8765aa-4089-48b6-84f3-05e1a5692fff + uid: 8e03f7a2-91ea-4706-8af9-9bb0746169c9 userCondition: null - elementCondition: null @@ -146,12 +139,12 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 6d845e00-0fd1-4c58-8c09-057f70b5eb64 + uid: 62a037ab-c0e7-49cf-a558-454d925261bb userCondition: null warning: null width: 100 name: SEO - uid: 5b1efc6e-f3a3-41f3-859d-d7e4ee38af4f + uid: 3d4120a2-2c23-4ad7-b3b7-ee94c4cc5953 userCondition: null handle: news hasTitleField: true diff --git a/config/project/entryTypes/newsOverview--d3b383b6-5ad7-494f-bc13-c06a53a5e5e9.yaml b/config/project/entryTypes/newsOverview--d3b383b6-5ad7-494f-bc13-c06a53a5e5e9.yaml index 2f6a72ce..0461dc7d 100644 --- a/config/project/entryTypes/newsOverview--d3b383b6-5ad7-494f-bc13-c06a53a5e5e9.yaml +++ b/config/project/entryTypes/newsOverview--d3b383b6-5ad7-494f-bc13-c06a53a5e5e9.yaml @@ -2,6 +2,7 @@ fieldLayouts: 1bfb15de-84e7-42f7-b958-7aaaebfef219: tabs: - + elementCondition: null elements: - autocapitalize: true @@ -9,6 +10,7 @@ fieldLayouts: autocorrect: true class: null disabled: false + elementCondition: null id: null instructions: null label: null @@ -24,63 +26,97 @@ fieldLayouts: tip: null title: null type: craft\fieldlayoutelements\entries\EntryTitleField + uid: b64f4137-21d9-4b41-8196-3ae5f44455de + userCondition: null warning: null - width: 100 + width: 75 + - + elementCondition: null + fieldUid: 8ff8437a-a38f-47f0-b489-1701614eec3f # Header image + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 490309e7-ecdb-4c8f-8ed2-27687c571112 + userCondition: null + warning: null + width: 25 - + elementCondition: null fieldUid: b5de6dcf-80e6-48e2-b846-0dab7f35c4c8 # Intro Text instructions: null label: null - required: '0' + required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: ac415f57-3772-45b6-96e5-876e4bf485d9 + userCondition: null warning: null width: 100 name: Common - sortOrder: 1 + uid: a5004c88-153b-4815-8b1c-00a56e996b62 + userCondition: null - + elementCondition: null elements: - + elementCondition: null fieldUid: 4a2bad07-8d89-4689-b0bf-774eed764660 # Overview title instructions: null label: null - required: '0' + required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: 2cf2bb60-3914-4982-9eca-f6c813198bcc + userCondition: null warning: null width: 100 - + elementCondition: null fieldUid: 2f8a6ddc-4ab7-4f9f-a2ea-72c6cb387f38 # Overview description instructions: null label: null - required: '0' + required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: 9e2ee7ec-27f8-45a9-9fbb-e209ee4a5005 + userCondition: null warning: null width: 100 - + elementCondition: null fieldUid: 15ed2b72-8955-4cec-93f8-9736a9e50e80 # Overview image instructions: null label: null - required: '0' + required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: 828ba4f5-988d-4a66-8034-6a9b825645ee + userCondition: null warning: null width: 100 name: Overview - sortOrder: 2 + uid: 154d9d1a-e325-4436-a9db-5143867fab0a + userCondition: null - + elementCondition: null elements: - + elementCondition: null fieldUid: 685530fc-e1f1-4be1-813b-ebf9ac3aa108 # SEO instructions: null label: null - required: '0' + required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: 1236872c-7e0b-4eef-abf0-a0ec7b3a3f82 + userCondition: null warning: null width: 100 name: SEO - sortOrder: 3 + uid: 2e1ee6dc-6a33-4460-a411-7b301e05339f + userCondition: null handle: newsOverview hasTitleField: true name: 'News Overview' diff --git a/config/project/entryTypes/pages--9f39fdda-793c-4506-9dd4-e764d46cad28.yaml b/config/project/entryTypes/pages--9f39fdda-793c-4506-9dd4-e764d46cad28.yaml index 2296f2f8..3c889da5 100644 --- a/config/project/entryTypes/pages--9f39fdda-793c-4506-9dd4-e764d46cad28.yaml +++ b/config/project/entryTypes/pages--9f39fdda-793c-4506-9dd4-e764d46cad28.yaml @@ -29,31 +29,36 @@ fieldLayouts: uid: d217be10-f0a3-4498-829a-aaa50aee8b63 userCondition: null warning: null - width: 100 + width: 50 - elementCondition: null - fieldUid: b5de6dcf-80e6-48e2-b846-0dab7f35c4c8 # Intro Text + fieldUid: 8ff8437a-a38f-47f0-b489-1701614eec3f # Header image instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 223acace-cdae-4ed7-9394-f825da789ada + uid: eb6bb39b-8049-415b-be6f-3df2900fd0ab userCondition: null warning: null - width: 100 + width: 50 - elementCondition: null - fieldUid: 21a6a6a5-a745-4a32-bcbd-3a8da8fa4e25 # Hero image + fieldUid: b5de6dcf-80e6-48e2-b846-0dab7f35c4c8 # Intro Text instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 18fb1614-2f46-484c-8cf8-c575865bf1c0 + uid: 223acace-cdae-4ed7-9394-f825da789ada userCondition: null warning: null width: 100 + - + elementCondition: null + type: craft\fieldlayoutelements\HorizontalRule + uid: aafb627f-dbb2-48d4-81af-b368076efc56 + userCondition: null - elementCondition: null fieldUid: 56d715d0-6a9d-4562-9c66-e5b4caad7f44 # Content Builder diff --git a/config/project/entryTypes/searchResults--b13fc4bd-af47-4f5c-b349-05e9e24dfecc.yaml b/config/project/entryTypes/searchResults--b13fc4bd-af47-4f5c-b349-05e9e24dfecc.yaml index cbf3ce39..4deb41da 100644 --- a/config/project/entryTypes/searchResults--b13fc4bd-af47-4f5c-b349-05e9e24dfecc.yaml +++ b/config/project/entryTypes/searchResults--b13fc4bd-af47-4f5c-b349-05e9e24dfecc.yaml @@ -2,6 +2,7 @@ fieldLayouts: 5364a393-b1fd-409d-bf52-7958fd3bc462: tabs: - + elementCondition: null elements: - autocapitalize: true @@ -9,6 +10,7 @@ fieldLayouts: autocorrect: true class: null disabled: false + elementCondition: null id: null instructions: null label: null @@ -24,12 +26,99 @@ fieldLayouts: tip: null title: null type: craft\fieldlayoutelements\entries\EntryTitleField + uid: c67c4eef-b4d4-4fd5-9b24-f687b4ab1001 + userCondition: null + warning: null + width: 100 + - + elementCondition: null + type: craft\fieldlayoutelements\HorizontalRule + uid: 8654baf8-6e7f-4539-bfcc-974d7ccb18f5 + userCondition: null + - + elementCondition: null + style: tip + tip: 'This content will show when there are no results found.' + type: craft\fieldlayoutelements\Tip + uid: 1d1d4fbd-f073-4308-80b0-a4bbd1cd10e4 + userCondition: null + - + elementCondition: null + fieldUid: 56d715d0-6a9d-4562-9c66-e5b4caad7f44 # Content Builder + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 4e09ba0a-fef5-46bc-b791-05c85989ecf1 + userCondition: null warning: null width: 100 name: Content - sortOrder: 1 + uid: 5f2c4fce-beb5-416a-b19c-337cfce687dc + userCondition: null + - + elementCondition: null + elements: + - + elementCondition: null + fieldUid: 4a2bad07-8d89-4689-b0bf-774eed764660 # Overview title + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 6d22dcfb-b801-4a11-a2c6-3eafaa313c0a + userCondition: null + warning: null + width: 100 + - + elementCondition: null + fieldUid: 2f8a6ddc-4ab7-4f9f-a2ea-72c6cb387f38 # Overview description + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: b0545a23-833a-4cda-8b99-46e2beea83a9 + userCondition: null + warning: null + width: 100 + - + elementCondition: null + fieldUid: 15ed2b72-8955-4cec-93f8-9736a9e50e80 # Overview image + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 3900db12-41d3-4ab6-b1d5-90fc35accdb8 + userCondition: null + warning: null + width: 100 + name: Overview + uid: ad189bac-7c40-4612-ac54-65af48246fb2 + userCondition: null + - + elementCondition: null + elements: + - + elementCondition: null + fieldUid: 685530fc-e1f1-4be1-813b-ebf9ac3aa108 # SEO + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 9cee6cd4-7759-4ecb-a435-2271c76ecf32 + userCondition: null + warning: null + width: 100 + name: SEO + uid: b94c7626-e516-4476-b480-32b2eeb86bd0 + userCondition: null handle: searchResults -hasTitleField: false +hasTitleField: true name: 'Search results' section: e3bed4e1-82ae-45e8-908c-0a6669141b31 # Search results sortOrder: 1 diff --git a/config/project/fields/headerImage--8ff8437a-a38f-47f0-b489-1701614eec3f.yaml b/config/project/fields/headerImage--8ff8437a-a38f-47f0-b489-1701614eec3f.yaml new file mode 100644 index 00000000..b0c735b8 --- /dev/null +++ b/config/project/fields/headerImage--8ff8437a-a38f-47f0-b489-1701614eec3f.yaml @@ -0,0 +1,47 @@ +columnSuffix: null +contentColumnType: string +fieldGroup: 2c770290-8edc-4f26-b846-6d99d36d7844 # Common +handle: headerImage +instructions: null +name: 'Header image' +searchable: false +settings: + allowSelfRelations: false + allowSubfolders: false + allowUploads: false + allowedKinds: + - image + defaultUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files + defaultUploadLocationSubpath: null + localizeRelations: false + maxRelations: 1 + minRelations: null + previewMode: full + restrictFiles: true + restrictLocation: false + restrictedDefaultUploadSubpath: null + restrictedLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files + restrictedLocationSubpath: null + selectionCondition: + __assoc__: + - + - elementType + - craft\elements\Asset + - + - fieldContext + - global + - + - class + - craft\elements\conditions\assets\AssetCondition + selectionLabel: null + showSiteMenu: false + showUnpermittedFiles: false + showUnpermittedVolumes: false + source: null + sources: '*' + targetSiteId: null + validateRelatedElements: false + viewMode: large +translationKeyFormat: null +translationMethod: site +type: craft\fields\Assets diff --git a/config/project/fields/hero--37471b2c-6c44-4b1a-bc50-3788e9de05d5.yaml b/config/project/fields/hero--37471b2c-6c44-4b1a-bc50-3788e9de05d5.yaml index c7d9f684..d62042b7 100644 --- a/config/project/fields/hero--37471b2c-6c44-4b1a-bc50-3788e9de05d5.yaml +++ b/config/project/fields/hero--37471b2c-6c44-4b1a-bc50-3788e9de05d5.yaml @@ -2,10 +2,12 @@ columnSuffix: null contentColumnType: string fieldGroup: bfa2f99e-1c8c-4348-8f89-00708397a119 # Content handle: hero -instructions: '' +instructions: null name: Hero searchable: false settings: + blockTypeFields: 0 + changedFieldIndicator: 413566151 columns: __assoc__: - @@ -38,13 +40,12 @@ settings: - '' contentTable: '{{%stc_hero}}' fieldLayout: row - maxRows: '' - minRows: '' - placeholderKey: null + maxRows: null + minRows: null propagationKeyFormat: null propagationMethod: all - selectionLabel: '' - staticField: '1' + selectionLabel: null + staticField: true translationKeyFormat: null translationMethod: site type: verbb\supertable\fields\SuperTableField diff --git a/config/project/fields/intro--b5de6dcf-80e6-48e2-b846-0dab7f35c4c8.yaml b/config/project/fields/intro--b5de6dcf-80e6-48e2-b846-0dab7f35c4c8.yaml index 87c8cf11..87b75f12 100644 --- a/config/project/fields/intro--b5de6dcf-80e6-48e2-b846-0dab7f35c4c8.yaml +++ b/config/project/fields/intro--b5de6dcf-80e6-48e2-b846-0dab7f35c4c8.yaml @@ -8,20 +8,14 @@ searchable: true settings: availableTransforms: '*' availableVolumes: '*' + ckeConfig: 131a4f6d-f00f-4238-b846-dd504bf669fe # Simple columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: '' purifyHtml: '1' - redactorConfig: Simple.json - removeEmptyTags: '1' - removeInlineStyles: '1' - removeNbsp: '1' - showHtmlButtonForNonAdmins: '' showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site -type: craft\redactor\Field +type: craft\ckeditor\Field diff --git a/config/project/fields/overviewDescription--2f8a6ddc-4ab7-4f9f-a2ea-72c6cb387f38.yaml b/config/project/fields/overviewDescription--2f8a6ddc-4ab7-4f9f-a2ea-72c6cb387f38.yaml index 75af6c0e..4a6902e3 100644 --- a/config/project/fields/overviewDescription--2f8a6ddc-4ab7-4f9f-a2ea-72c6cb387f38.yaml +++ b/config/project/fields/overviewDescription--2f8a6ddc-4ab7-4f9f-a2ea-72c6cb387f38.yaml @@ -8,20 +8,14 @@ searchable: true settings: availableTransforms: '*' availableVolumes: '*' + ckeConfig: 131a4f6d-f00f-4238-b846-dd504bf669fe # Simple columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: '' purifyHtml: '1' - redactorConfig: Simple.json - removeEmptyTags: '1' - removeInlineStyles: '1' - removeNbsp: '1' - showHtmlButtonForNonAdmins: '' showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site -type: craft\redactor\Field +type: craft\ckeditor\Field diff --git a/config/project/matrixBlockTypes/callToAction--7b5ab248-6255-4b42-88bc-80c1dee62b20.yaml b/config/project/matrixBlockTypes/callToAction--7b5ab248-6255-4b42-88bc-80c1dee62b20.yaml index f5f273a8..2dd92624 100644 --- a/config/project/matrixBlockTypes/callToAction--7b5ab248-6255-4b42-88bc-80c1dee62b20.yaml +++ b/config/project/matrixBlockTypes/callToAction--7b5ab248-6255-4b42-88bc-80c1dee62b20.yaml @@ -74,7 +74,7 @@ fields: contentColumnType: string fieldGroup: null handle: image - instructions: 'The minimum with for this image is 660px. The ideal width is 1320px.' + instructions: 'The minimum width for this image is 660px. The ideal width is 1320px.' name: Image searchable: false settings: @@ -83,9 +83,11 @@ fields: allowUploads: false allowedKinds: - image + branchLimit: null defaultUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files defaultUploadLocationSubpath: null localizeRelations: false + maintainHierarchy: false maxRelations: 1 minRelations: null previewMode: full @@ -109,7 +111,6 @@ fields: showSiteMenu: false showUnpermittedFiles: false showUnpermittedVolumes: false - source: null sources: '*' targetSiteId: null validateRelatedElements: false @@ -126,25 +127,19 @@ fields: name: Text searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 131a4f6d-f00f-4238-b846-dd504bf669fe # Simple columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Simple.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field ac60331a-e9bd-4399-8b44-42a2c469fd52: # Background color columnSuffix: null contentColumnType: string @@ -182,6 +177,27 @@ fields: defaultText: '' typeSettings: __assoc__: + - + - asset + - + __assoc__: + - + - sources + - '*' + - + - category + - + __assoc__: + - + - sources + - '*' + - + - entry + - + __assoc__: + - + - sources + - '*' - - email - diff --git a/config/project/matrixBlockTypes/cta--95f49084-026d-4884-96b9-8b2fb5a00d3d.yaml b/config/project/matrixBlockTypes/cta--95f49084-026d-4884-96b9-8b2fb5a00d3d.yaml index 17547b62..d4ddff4b 100644 --- a/config/project/matrixBlockTypes/cta--95f49084-026d-4884-96b9-8b2fb5a00d3d.yaml +++ b/config/project/matrixBlockTypes/cta--95f49084-026d-4884-96b9-8b2fb5a00d3d.yaml @@ -3,25 +3,30 @@ fieldLayouts: 894f6e45-935c-449a-b890-97a1b7730b7f: tabs: - + elementCondition: null elements: - + elementCondition: null fieldUid: a3573b91-af94-43de-8ceb-dc11cb7175b1 # Link instructions: null label: null required: true tip: null type: craft\fieldlayoutelements\CustomField + uid: b7de87ca-53a9-4e8e-9c24-53dd6a3a35a3 + userCondition: null warning: null width: 100 name: Content - sortOrder: 1 + uid: f7f7922f-95e3-4540-9c1e-48356f924491 + userCondition: null fields: a3573b91-af94-43de-8ceb-dc11cb7175b1: # Link columnSuffix: null contentColumnType: text fieldGroup: null - handle: linkIt - instructions: '' + handle: linkit + instructions: null name: Link searchable: true settings: @@ -38,27 +43,6 @@ fields: defaultText: '' typeSettings: __assoc__: - - - - asset - - - __assoc__: - - - - sources - - '*' - - - - category - - - __assoc__: - - - - sources - - '*' - - - - entry - - - __assoc__: - - - - sources - - '*' - - email - diff --git a/config/project/matrixBlockTypes/customTable--f2d33237-c7de-4590-9683-7efe6594ebbd.yaml b/config/project/matrixBlockTypes/customTable--f2d33237-c7de-4590-9683-7efe6594ebbd.yaml index 478e2672..d30fd031 100644 --- a/config/project/matrixBlockTypes/customTable--f2d33237-c7de-4590-9683-7efe6594ebbd.yaml +++ b/config/project/matrixBlockTypes/customTable--f2d33237-c7de-4590-9683-7efe6594ebbd.yaml @@ -42,25 +42,19 @@ fields: name: Table searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 5dbe5a67-b60b-4529-a095-facb9b24a39b # Table columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Table.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field 71a7d521-3217-4254-8b3f-f778279d342c: # Title columnSuffix: null contentColumnType: string diff --git a/config/project/matrixBlockTypes/form--f3211a4e-d5f8-4514-a372-c5b8cfc2c44a.yaml b/config/project/matrixBlockTypes/form--f3211a4e-d5f8-4514-a372-c5b8cfc2c44a.yaml index 92bd4d46..68fd3887 100644 --- a/config/project/matrixBlockTypes/form--f3211a4e-d5f8-4514-a372-c5b8cfc2c44a.yaml +++ b/config/project/matrixBlockTypes/form--f3211a4e-d5f8-4514-a372-c5b8cfc2c44a.yaml @@ -66,25 +66,19 @@ fields: name: Text searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 7d23b02c-ad1d-44a8-9751-35fbdcc38963 # Standard columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Standard.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field 74a30650-eb90-462f-a104-de1d41ac8221: # Form columnSuffix: null contentColumnType: string @@ -95,12 +89,13 @@ fields: searchable: false settings: allowSelfRelations: false + branchLimit: null localizeRelations: false + maintainHierarchy: false maxRelations: null minRelations: null selectionLabel: null showSiteMenu: true - source: null sources: '*' targetSiteId: null validateRelatedElements: false diff --git a/config/project/matrixBlockTypes/image--0396f80c-a192-4beb-a6e7-075075cf0f70.yaml b/config/project/matrixBlockTypes/image--0396f80c-a192-4beb-a6e7-075075cf0f70.yaml index f04cf210..bd261acf 100644 --- a/config/project/matrixBlockTypes/image--0396f80c-a192-4beb-a6e7-075075cf0f70.yaml +++ b/config/project/matrixBlockTypes/image--0396f80c-a192-4beb-a6e7-075075cf0f70.yaml @@ -13,7 +13,7 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: e3b278ea-c971-47ea-b011-fffc0bcae4fa + uid: baa9eb81-3124-4edd-8cfd-8a294e0b0c16 userCondition: null warning: null width: 100 @@ -25,7 +25,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: d7bee503-f772-46f0-8b53-669d115db564 + uid: a3e4f5ff-7dc0-4e82-b00c-8bea4e6b9b70 userCondition: null warning: null width: 50 @@ -37,7 +37,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: ccb28911-1ac4-4129-bd3f-aa0133cb68c3 + uid: 5703cb2e-6333-45b2-b5b8-78da1173aca7 userCondition: null warning: null width: 50 @@ -49,12 +49,24 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 9c74d714-a22d-401c-882a-da5e3e4e1ebe + uid: ccae05e3-e8e4-4417-a452-ae31afa6664d + userCondition: null + warning: null + width: 50 + - + elementCondition: null + fieldUid: 9084b802-1468-4763-a867-2e4b1ebd3f09 # Show larger version in popup + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: feb576a2-753f-4c0e-bc99-499d303293d5 userCondition: null warning: null width: 50 name: Content - uid: ec2096f0-2aa9-4d08-9c37-655ec0ad5114 + uid: f986a838-979a-4945-abe0-cd3c6cbad150 userCondition: null fields: 4ce05044-aa3d-4bbe-ad21-be03fbc1a273: # Background Color @@ -113,60 +125,69 @@ fields: name: 'Image width' searchable: false settings: + default: '' options: - - - __assoc__: - - - - label - - full - - - - value - - full - - - - default - - '' - - - __assoc__: - - - - label - - 1/2 - - - - value - - half - - - - default - - '' - - - __assoc__: - - - - label - - 1/3 - - - - value - - oneThird - - - - default - - '' - - - __assoc__: - - - - label - - 1/4 - - - - value - - oneFourth - - - - default - - '' + __assoc__: + - + - 1/6 + - '' + - + - 1/5 + - '' + - + - 1/4 + - '1' + - + - 1/3 + - '1' + - + - 2/5 + - '' + - + - 1/2 + - '1' + - + - 3/5 + - '' + - + - 2/3 + - '' + - + - 3/4 + - '' + - + - 4/5 + - '' + - + - 5/6 + - '' + - + - full + - '1' + translationKeyFormat: null + translationMethod: none + type: rias\widthfieldtype\fields\Width + 9084b802-1468-4763-a867-2e4b1ebd3f09: # Show larger version in popup + columnSuffix: xmzvkqux + contentColumnType: boolean + fieldGroup: null + handle: showLargerVersionInPopup + instructions: null + name: 'Show larger version in popup' + searchable: false + settings: + default: false + offLabel: null + onLabel: null translationKeyFormat: null translationMethod: none - type: craft\fields\Dropdown + type: craft\fields\Lightswitch cd736fb3-c9b7-4ce1-88a8-da8b64249eb1: # Image columnSuffix: null contentColumnType: string fieldGroup: null handle: image - instructions: 'The minimum with for this image is 1200px. The ideal width is 2400px' + instructions: 'The minimum width for this image is 1200px. The ideal width is 2400px' name: Image searchable: false settings: @@ -175,9 +196,11 @@ fields: allowUploads: false allowedKinds: - image + branchLimit: null defaultUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files defaultUploadLocationSubpath: null localizeRelations: false + maintainHierarchy: false maxRelations: null minRelations: null previewMode: full @@ -201,7 +224,6 @@ fields: showSiteMenu: true showUnpermittedFiles: false showUnpermittedVolumes: false - source: null sources: '*' targetSiteId: null validateRelatedElements: false diff --git a/config/project/matrixBlockTypes/overview--24bd0074-b53d-404d-9285-a0be9f26bbd4.yaml b/config/project/matrixBlockTypes/overview--24bd0074-b53d-404d-9285-a0be9f26bbd4.yaml index d821d667..85c8ec6f 100644 --- a/config/project/matrixBlockTypes/overview--24bd0074-b53d-404d-9285-a0be9f26bbd4.yaml +++ b/config/project/matrixBlockTypes/overview--24bd0074-b53d-404d-9285-a0be9f26bbd4.yaml @@ -55,7 +55,9 @@ fields: searchable: true settings: allowSelfRelations: false + branchLimit: null localizeRelations: true + maintainHierarchy: false maxRelations: null minRelations: null selectionCondition: @@ -71,7 +73,6 @@ fields: - craft\elements\conditions\entries\EntryCondition selectionLabel: null showSiteMenu: true - source: null sources: '*' targetSiteId: null validateRelatedElements: false diff --git a/config/project/matrixBlockTypes/quote--7256a782-20ff-4771-9d85-ed3f49e13ef4.yaml b/config/project/matrixBlockTypes/quote--7256a782-20ff-4771-9d85-ed3f49e13ef4.yaml index cd88844f..abf6e410 100644 --- a/config/project/matrixBlockTypes/quote--7256a782-20ff-4771-9d85-ed3f49e13ef4.yaml +++ b/config/project/matrixBlockTypes/quote--7256a782-20ff-4771-9d85-ed3f49e13ef4.yaml @@ -13,7 +13,7 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: 388ec294-0b2d-42b0-856e-7cf81759305b + uid: cbc1da18-20d8-4498-b092-47081ee7ae11 userCondition: null warning: null width: 100 @@ -25,10 +25,10 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 7b2b1b1c-4ad9-4609-9cde-7c8b5d7a2b83 + uid: 8eb0aca1-2882-4c08-b7ee-5ac875f9ce84 userCondition: null warning: null - width: 100 + width: 50 - elementCondition: null fieldUid: 44549f86-4264-4c94-964c-a927c53c2a38 # Author Image @@ -49,7 +49,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: ab175ba8-01e7-453c-8868-4affb5f7b4b8 + uid: e9092905-93ca-4313-a3fc-3fd4ac307557 userCondition: null warning: null width: 100 @@ -61,12 +61,12 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 7b0b008d-ac15-4348-ab5d-8dc4fcedfc03 + uid: 14a7aa7f-00ce-4c5e-83c8-26626d93de0a userCondition: null warning: null width: 100 name: Content - uid: 90502b68-e750-46e7-9d81-e1fa8afee0d6 + uid: 87b0e6d6-6529-46f2-b359-dd62254ea435 userCondition: null fields: 7bfca6b9-10b5-45cf-a470-29d85f876c61: # Background Color @@ -113,7 +113,7 @@ fields: searchable: true settings: blockTypeFields: 0 - changedFieldIndicator: 1345433276 + changedFieldIndicator: 689498195 columns: __assoc__: - @@ -123,7 +123,7 @@ fields: - - width - '' - contentTable: '{{%stc_8_cta}}' + contentTable: '{{%stc_6_cta}}' fieldLayout: matrix maxRows: null minRows: null @@ -143,25 +143,19 @@ fields: name: Text searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '' + ckeConfig: 131a4f6d-f00f-4238-b846-dd504bf669fe # Simple columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Simple.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field 44549f86-4264-4c94-964c-a927c53c2a38: # Author Image columnSuffix: null contentColumnType: string @@ -176,9 +170,11 @@ fields: allowUploads: false allowedKinds: - image + branchLimit: null defaultUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files defaultUploadLocationSubpath: null localizeRelations: false + maintainHierarchy: false maxRelations: 1 minRelations: null previewMode: full @@ -202,7 +198,6 @@ fields: showSiteMenu: false showUnpermittedFiles: false showUnpermittedVolumes: false - source: null sources: '*' targetSiteId: null validateRelatedElements: false diff --git a/config/project/matrixBlockTypes/table--1acc740f-9a8e-481e-bb27-7fa09f56deae.yaml b/config/project/matrixBlockTypes/table--1acc740f-9a8e-481e-bb27-7fa09f56deae.yaml new file mode 100644 index 00000000..fd94867e --- /dev/null +++ b/config/project/matrixBlockTypes/table--1acc740f-9a8e-481e-bb27-7fa09f56deae.yaml @@ -0,0 +1,69 @@ +field: 56d715d0-6a9d-4562-9c66-e5b4caad7f44 # Content Builder +fieldLayouts: + 408c7e42-2bb3-46e3-ac66-ad073a73fe6a: + tabs: + - + elementCondition: null + elements: + - + elementCondition: null + fieldUid: 97526b7c-2621-489c-a79d-9fdc9dce790a # Title + instructions: null + label: null + required: false + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 3fad9084-34c2-4de6-8b11-305574349ef7 + userCondition: null + warning: null + width: 100 + - + elementCondition: null + fieldUid: 02482f0b-2650-4903-acb3-f24ea73b95a8 # Table + instructions: null + label: null + required: true + tip: null + type: craft\fieldlayoutelements\CustomField + uid: 6432c937-c2d3-48fc-8b07-7e5b520f3ebe + userCondition: null + warning: null + width: 100 + name: Content + uid: 8cc560bf-af35-4893-b5b6-96d96910b9f0 + userCondition: null +fields: + 02482f0b-2650-4903-acb3-f24ea73b95a8: # Table + columnSuffix: tsrdhkdq + contentColumnType: text + fieldGroup: null + handle: table + instructions: null + name: Table + searchable: false + settings: + columnsAddRowLabel: 'Add new column' + columnsInstructions: null + columnsLabel: null + rowsAddRowLabel: 'Add new row' + rowsInstructions: null + rowsLabel: null + translationKeyFormat: null + translationMethod: none + type: verbb\tablemaker\fields\TableMakerField + 97526b7c-2621-489c-a79d-9fdc9dce790a: # Title + columnSuffix: anxnqupp + contentColumnType: string + fieldGroup: null + handle: blockTitle + instructions: null + name: Title + searchable: true + settings: + someAttribute: null + translationKeyFormat: null + translationMethod: site + type: modules\statik\fields\AnchorLink +handle: table +name: Table +sortOrder: 11 diff --git a/config/project/matrixBlockTypes/textImage--d86336d6-7efa-44f9-9a10-8619c79beeca.yaml b/config/project/matrixBlockTypes/textImage--d86336d6-7efa-44f9-9a10-8619c79beeca.yaml index 5dd468e7..7ccfc161 100644 --- a/config/project/matrixBlockTypes/textImage--d86336d6-7efa-44f9-9a10-8619c79beeca.yaml +++ b/config/project/matrixBlockTypes/textImage--d86336d6-7efa-44f9-9a10-8619c79beeca.yaml @@ -13,7 +13,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 70f79ff4-c46c-4a43-a433-abd487fef26c + uid: bc1db95c-60f0-4911-8c01-fbd89b5f9a06 userCondition: null warning: null width: 100 @@ -25,43 +25,43 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: 44b19e4f-e212-4c5d-9728-861984e14307 + uid: 05aa0d0e-b0b6-4161-a302-d52aa0e73032 userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: f21594e6-d83e-4047-a36c-0d6b709719e1 # Image + fieldUid: ca8bb389-d0f3-4dbb-af40-e2f6ef211040 # Call to action instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 770f619b-0eff-453d-8eae-158d1f76b2b4 + uid: f6f1bc45-4a68-4a62-b22d-014547a0e11d userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: 40e14f90-0640-452d-9c8a-9f30f73bacbb # Image position + fieldUid: f21594e6-d83e-4047-a36c-0d6b709719e1 # Image instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 93468d8c-59cf-4963-a991-b9b891cfecfd + uid: ed69e655-73d9-4f2b-94a0-2275e9b4faf8 userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: ca8bb389-d0f3-4dbb-af40-e2f6ef211040 # Call to action + fieldUid: 40e14f90-0640-452d-9c8a-9f30f73bacbb # Image position instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 423c7135-f49a-45e9-9837-51257c5a0053 + uid: 3e11cb59-1985-4f62-8da1-4c8694b813fb userCondition: null warning: null width: 100 @@ -73,12 +73,12 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 7666d315-4bf3-4a3c-b66b-6316d0208e12 + uid: 1ed3a959-a53c-497c-8838-852a96e2c278 userCondition: null warning: null width: 100 name: Content - uid: 8355b811-a5aa-4607-bb77-5df1d86758bb + uid: f3cac461-fd7a-4f9a-8486-520f99041b3f userCondition: null fields: 1a9703c9-1eb8-4b3a-94e1-1386e5b24f2a: # Title @@ -136,25 +136,19 @@ fields: name: Text searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 25f93ead-d3f6-4049-ba98-6378754f4289 # Extended columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Extended.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field bd732ee5-59bb-41a5-81e1-b0de29ca7146: # Background Color columnSuffix: null contentColumnType: string @@ -179,7 +173,7 @@ fields: searchable: true settings: blockTypeFields: 0 - changedFieldIndicator: 458259558 + changedFieldIndicator: 1816447448 columns: __assoc__: - @@ -205,7 +199,7 @@ fields: contentColumnType: string fieldGroup: null handle: image - instructions: 'The minimum with for this image is 660px. The ideal width is 1320px.' + instructions: 'The minimum width for this image is 660px. The ideal width is 1320px.' name: Image searchable: false settings: @@ -214,9 +208,11 @@ fields: allowUploads: false allowedKinds: - image + branchLimit: null defaultUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files defaultUploadLocationSubpath: null localizeRelations: false + maintainHierarchy: false maxRelations: 1 minRelations: null previewMode: full @@ -240,7 +236,6 @@ fields: showSiteMenu: true showUnpermittedFiles: false showUnpermittedVolumes: false - source: null sources: '*' targetSiteId: null validateRelatedElements: false diff --git a/config/project/matrixBlockTypes/textTwoColumns--1e4267e1-8d5f-4312-8458-86b19bc17d74.yaml b/config/project/matrixBlockTypes/textTwoColumns--1e4267e1-8d5f-4312-8458-86b19bc17d74.yaml index 62c10fe8..d63a1afd 100644 --- a/config/project/matrixBlockTypes/textTwoColumns--1e4267e1-8d5f-4312-8458-86b19bc17d74.yaml +++ b/config/project/matrixBlockTypes/textTwoColumns--1e4267e1-8d5f-4312-8458-86b19bc17d74.yaml @@ -119,13 +119,38 @@ fields: allowClass: '1' allowCustomText: '1' allowTarget: '1' - allowedLinkNames: '*' + allowedLinkNames: + 1: asset + 3: entry + 4: email + 6: url class: null classes: null defaultLinkName: entry defaultText: 'Read more' typeSettings: __assoc__: + - + - asset + - + __assoc__: + - + - sources + - '*' + - + - category + - + __assoc__: + - + - sources + - '*' + - + - entry + - + __assoc__: + - + - sources + - '*' - - email - @@ -172,25 +197,19 @@ fields: name: 'Text Column 2' searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 25f93ead-d3f6-4049-ba98-6378754f4289 # Extended columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Extended.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field b1cd3558-d939-48d0-8628-239236ff699c: # Text Column 1 columnSuffix: null contentColumnType: text @@ -200,25 +219,19 @@ fields: name: 'Text Column 1' searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 25f93ead-d3f6-4049-ba98-6378754f4289 # Extended columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Extended.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field bde7c3e4-1530-4cdf-94a4-6ac068e88c8a: # CTA Column 1 columnSuffix: null contentColumnType: text @@ -231,13 +244,38 @@ fields: allowClass: '1' allowCustomText: '1' allowTarget: '1' - allowedLinkNames: '*' + allowedLinkNames: + 1: asset + 3: entry + 4: email + 6: url class: null classes: null defaultLinkName: entry defaultText: 'Read more' typeSettings: __assoc__: + - + - asset + - + __assoc__: + - + - sources + - '*' + - + - category + - + __assoc__: + - + - sources + - '*' + - + - entry + - + __assoc__: + - + - sources + - '*' - - email - diff --git a/config/project/matrixBlockTypes/textVideo--95920915-f806-4fbc-9c22-979ec9085fe8.yaml b/config/project/matrixBlockTypes/textVideo--95920915-f806-4fbc-9c22-979ec9085fe8.yaml index d8adec66..84a1d051 100644 --- a/config/project/matrixBlockTypes/textVideo--95920915-f806-4fbc-9c22-979ec9085fe8.yaml +++ b/config/project/matrixBlockTypes/textVideo--95920915-f806-4fbc-9c22-979ec9085fe8.yaml @@ -13,7 +13,7 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 5aa4e662-e580-43a9-acfd-11632520ad16 + uid: c2d30acc-f77c-4758-b7ea-eb9ae78c344c userCondition: null warning: null width: 100 @@ -25,43 +25,43 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: 6c3af5ec-fcaa-4cd8-a0d2-98ee4032b284 + uid: 49decd66-c2e9-416c-83cd-46bc0474a15e userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: 2561c4fb-34b5-49e6-ade6-f774411e48ba # Video + fieldUid: 9faf6a00-afea-4a29-a217-e6af774f6b55 # Call to action instructions: null label: null - required: true + required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 1c4a6d15-dda6-448c-9fe7-f366f4b362a5 + uid: 1a71f70a-e8c4-4c92-8ecc-9eedcd75a3c3 userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: c8533e19-1c6c-4d33-8e50-71babb409313 # Video position + fieldUid: 2561c4fb-34b5-49e6-ade6-f774411e48ba # Video instructions: null label: null - required: false + required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: 02a3fa9a-db78-45b9-948d-b46c56173c7b + uid: f3b691ab-3aba-42aa-9b69-08b6498a0827 userCondition: null warning: null width: 100 - elementCondition: null - fieldUid: 9faf6a00-afea-4a29-a217-e6af774f6b55 # Call to action + fieldUid: c8533e19-1c6c-4d33-8e50-71babb409313 # Video position instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: ad4f81e3-b16b-48e2-b221-63d842f2eee6 + uid: 2607da7f-daf5-4c42-8c89-915abc68dd03 userCondition: null warning: null width: 100 @@ -73,12 +73,12 @@ fieldLayouts: required: false tip: null type: craft\fieldlayoutelements\CustomField - uid: 44dcbc4c-fb14-4741-b052-de9253c2a9cb + uid: 95f06a3a-c17c-4032-abd6-82d452ed5e7b userCondition: null warning: null width: 100 name: Content - uid: 6a2907fb-34b7-44dd-ac47-d84813ef8ea2 + uid: dba25c67-8336-4776-bb85-63e3fffb4f1e userCondition: null fields: 5e9cb47a-530d-4aa9-a98f-5049e6d0eb9e: # Title @@ -104,7 +104,7 @@ fields: searchable: true settings: blockTypeFields: 0 - changedFieldIndicator: 1369856153 + changedFieldIndicator: 1459672668 columns: __assoc__: - @@ -114,7 +114,7 @@ fields: - - width - '' - contentTable: '{{%stc_9_cta}}' + contentTable: '{{%stc_4_cta}}' fieldLayout: matrix maxRows: null minRows: null @@ -182,25 +182,19 @@ fields: name: Text searchable: true settings: - availableTransforms: '*' + availableTransforms: '' availableVolumes: '*' + ckeConfig: 25f93ead-d3f6-4049-ba98-6378754f4289 # Extended columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' + enableSourceEditingForNonAdmins: false purifierConfig: null purifyHtml: true - redactorConfig: Extended.json - removeEmptyTags: true - removeInlineStyles: true - removeNbsp: true - showHtmlButtonForNonAdmins: false showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field f3f6d3ea-ccb1-48a5-bb33-93e1e31aff24: # Background Color columnSuffix: null contentColumnType: string diff --git a/config/project/project.yaml b/config/project/project.yaml index e709484c..1a659274 100644 --- a/config/project/project.yaml +++ b/config/project/project.yaml @@ -1,14 +1,13 @@ -dateModified: 1670244194 +dateModified: 1691054715 elementSources: craft\elements\Entry: - disabled: false key: '*' tableAttributes: - - dateCreated - - author - - dateUpdated + - slug - revisionCreator + - dateUpdated - link type: native - @@ -18,30 +17,27 @@ elementSources: disabled: false key: 'single:5611e98d-93ec-4bd4-95dd-18f282b8c5e8' # Home tableAttributes: - - dateCreated - - author - - dateUpdated + - slug - revisionCreator + - dateUpdated - link type: native - disabled: false key: 'section:45b7c78f-587d-441b-bbd1-605ca629d0bd' # Pages tableAttributes: - - dateCreated - - author - - dateUpdated + - slug - revisionCreator + - dateUpdated - link type: native - disabled: false key: 'single:5d236e94-b6a8-472c-9296-a5c992cdd49a' # Contact tableAttributes: - - dateCreated - - author - - dateUpdated + - slug - revisionCreator + - dateUpdated - link type: native - @@ -51,92 +47,177 @@ elementSources: disabled: false key: 'single:4c32edae-2824-4f0f-b38b-2477d2500dfe' # News Overview tableAttributes: - - dateCreated - - author - - dateUpdated + - slug - revisionCreator + - dateUpdated - link type: native - disabled: false key: 'section:c576870d-abd8-46aa-8fe5-cdd12c40dfa8' # News tableAttributes: - - dateCreated - - author - - dateUpdated + - slug - revisionCreator + - dateUpdated - link type: native - heading: Account type: heading - + disabled: false key: 'single:361daec5-5ea3-4d9f-957f-f39c78bb595e' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:c25b1e19-dca6-4ab5-a776-a043f6ee4c82' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:684ece64-c23a-4abf-9574-f2c053d496e8' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:dca2ac05-7833-41de-b7b4-a737c090575c' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:d5601a1f-a33e-4c5a-b7af-1f29347149ca' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:1c4e3f0f-ca9b-474d-a460-48f45133c763' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - - key: 'single:53c1af4c-0fbd-4811-a028-67fed65195b9' + disabled: false + key: 'single:53c1af4c-0fbd-4811-a028-67fed65195b9' # Forgot Password Confirmation + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:8e583282-1fec-4444-822f-37b2d5961f28' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - - key: 'single:4703bf34-5e13-4da1-aff6-d04c0bba024b' # Set Password Confirmation + disabled: false + key: 'single:4703bf34-5e13-4da1-aff6-d04c0bba024b' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:05aba0e3-e1de-4bf3-8a07-5c9f3ef9475c' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:af69e9a2-96df-4fa9-8cc3-2728ec4fc632' + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - heading: Other type: heading - + disabled: false key: 'single:36895330-a28e-477f-9327-bdbe66dabf99' # Cookie policy + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:c2198cbb-f6e1-478a-ab4a-bbbaea43ce0e' # Privacy policy + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - + disabled: false key: 'single:4750849d-9328-4d3e-956d-9d317da5e6eb' # Page not found + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - disabled: false key: 'single:e3bed4e1-82ae-45e8-908c-0a6669141b31' # Search results tableAttributes: - - postDate - - expiryDate - - author + - slug + - revisionCreator + - dateUpdated - link type: native - + disabled: false key: 'single:fa6e0764-a31c-4304-a4d7-76bd3a679e3e' # 503 + tableAttributes: + - slug + - revisionCreator + - dateUpdated + - link type: native - - - heading: '' - type: heading email: - fromEmail: no-reply@mailer.today + fromEmail: $SYSTEM_EMAIL fromName: $SYSTEM_NAME replyToEmail: null template: _mail/_layout transportSettings: - command: '' + command: '/usr/sbin/sendmail -bs' transportType: craft\mail\transportadapters\Sendmail fs: files: @@ -150,6 +231,7 @@ meta: __names__: 1a64e732-f1ae-44b6-aee3-bedc6b1ebdd2: 'Cookie policy' # Cookie policy 1a9703c9-1eb8-4b3a-94e1-1386e5b24f2a: Title # Title + 1acc740f-9a8e-481e-bb27-7fa09f56deae: Table # Table 1e4267e1-8d5f-4312-8458-86b19bc17d74: 'Text (2 columns)' # Text (2 columns) 2c770290-8edc-4f26-b846-6d99d36d7844: Common # Common 2e4b3bb0-26e4-47d2-9445-54401a221c63: Twitter # Twitter @@ -162,14 +244,17 @@ meta: 4ce05044-aa3d-4bbe-ad21-be03fbc1a273: 'Background Color' # Background Color 5a25f3e9-a180-4a29-aa41-8721fbf815b9: 'Optimized Content' # Optimized Content 5d236e94-b6a8-472c-9296-a5c992cdd49a: Contact # Contact + 5dbe5a67-b60b-4529-a095-facb9b24a39b: Table # Table 5e9cb47a-530d-4aa9-a98f-5049e6d0eb9e: Title # Title 6ca94949-c3f4-465d-88c7-3d4736d97ed4: Address # Address 6d99d3e8-e687-44e6-9e4f-8724da1c5123: Link # Link 6de046f0-6167-4af1-aa91-ffaf83e36a14: NL # NL 7b5ab248-6255-4b42-88bc-80c1dee62b20: 'Call To Action' # Call To Action 7bfca6b9-10b5-45cf-a470-29d85f876c61: 'Background Color' # Background Color + 7d23b02c-ad1d-44a8-9751-35fbdcc38963: Standard # Standard 7def856e-47b3-4b83-ba43-23b5da28a176: Image # Image 8fa3e75a-c69d-4482-9083-e416986b4788: Table # Table + 8ff8437a-a38f-47f0-b489-1701614eec3f: 'Header image' # Header image 9a0dd6a8-9ebb-44f8-a62a-03f12bf2a504: Author # Author 9abed6d9-3042-4dd4-add0-3115a6e2693b: 'Image position' # Image position 9b825b00-aa1c-4ad2-b013-e29ee855e551: Text # Text @@ -180,11 +265,13 @@ meta: 15ed2b72-8955-4cec-93f8-9736a9e50e80: 'Overview image' # Overview image 21a6a6a5-a745-4a32-bcbd-3a8da8fa4e25: 'Hero image' # Hero image 24bd0074-b53d-404d-9285-a0be9f26bbd4: Overview # Overview + 25f93ead-d3f6-4049-ba98-6378754f4289: Extended # Extended 29ce1a5b-53b3-4361-96e4-20fc58e90dac: SEO # SEO 39b3406d-d1bb-4a84-a13a-bce5cc293238: Globals # Globals 39f07216-d49a-4917-b05e-bec26f425843: 'Image Caption' # Image Caption 40e14f90-0640-452d-9c8a-9f30f73bacbb: 'Image position' # Image position 45b7c78f-587d-441b-bbd1-605ca629d0bd: Pages # Pages + 53c1af4c-0fbd-4811-a028-67fed65195b9: 'Forgot Password Confirmation' # Forgot Password Confirmation 56d715d0-6a9d-4562-9c66-e5b4caad7f44: 'Content Builder' # Content Builder 60b48ff5-1ab2-471b-8592-cdc623e0882c: 'Optimized Text Image' # Optimized Text Image 61b9a78d-f3c0-4c99-8e91-d97e9768023c: 'Optimized Images' # Optimized Images @@ -196,16 +283,17 @@ meta: 95f49084-026d-4884-96b9-8b2fb5a00d3d: CTA # CTA 97e1c649-ce58-4388-bbc1-1f4e41d938b6: Link # Link 109f5d44-e366-49e7-826d-6b13de779861: News # News + 131a4f6d-f00f-4238-b846-dd504bf669fe: Simple # Simple 0207f1a0-8ec0-4b87-9197-c1d5a9a7b61d: 'Optimized Overview' # Optimized Overview 302aeb89-2e5c-42f2-a735-98e504b28a37: 'Call to action' # Call to action 0396f80c-a192-4beb-a6e7-075075cf0f70: Image # Image - 639fe6b1-e56b-4fcf-a6bf-863bead15937: Test # Test 655b59ef-5329-40e5-9a85-6ea2ac1d8a14: Text # Text 683cbd88-ef11-45e0-83b4-e20d03f6ea6b: 'Image width' # Image width 776fa716-10bb-48bb-ae08-28870f9d77e7: Entries # Entries 933f619e-82e4-4b3d-a27f-9d7d9cce42b8: Text # Text 979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca: Files # Files 2184d090-d3e1-413b-8d21-b537c5141ef8: Image # Image + 02482f0b-2650-4903-acb3-f24ea73b95a8: Table # Table 2561c4fb-34b5-49e6-ade6-f774411e48ba: Video # Video 3196b984-5af4-44dd-a6db-ac2c8f7924d9: 'Content Managers' # Content Managers 4389ba83-8e69-4edb-b3c3-ca0ba89617c1: 'Background Color' # Background Color @@ -222,6 +310,7 @@ meta: 62533b8e-b5bf-4ff0-a0c9-c45bfc8cc5fd: 'General Info' # General Info 64516e7d-b46e-44ff-aa53-34e7e1e0a89d: Onderwerp # Onderwerp 072209d1-1c68-4ee5-9a66-a209b518da6d: Mail # Mail + 97526b7c-2621-489c-a79d-9fdc9dce790a: Title # Title 197566c6-94bb-4e67-86d7-8945f2589a1d: 'Optimized Hero' # Optimized Hero 209777db-293c-48b6-9897-1fe97b278510: Video # Video 685530fc-e1f1-4be1-813b-ebf9ac3aa108: SEO # SEO @@ -262,7 +351,6 @@ meta: df7389a1-233e-4f41-8340-9d16eee18c51: CTA # CTA e2e2a303-7d29-4edb-846d-84e6c8494c50: Title # Title e3bed4e1-82ae-45e8-908c-0a6669141b31: 'Search results' # Search results - e22e31a3-e437-4c0a-9d25-0a551572cf6b: Default # Default e57cf13b-f9cb-484a-8093-a897fa43eb68: EN # EN e73dd38a-5d76-40ba-99eb-25ee65bf7ab5: 'Title Column 2' # Title Column 2 e85a2f89-c711-4452-8eda-43dac6449f63: '503' # 503 @@ -286,6 +374,10 @@ plugins: edition: standard enabled: true schemaVersion: 2.0.0 + ckeditor: + edition: standard + enabled: true + schemaVersion: 3.0.0.0 config-values-field: edition: standard enabled: true @@ -348,8 +440,8 @@ plugins: formie: edition: standard enabled: true - licenseKey: A5CFILCDC9CCY0XQEZSQ3JWL - schemaVersion: 2.0.8 + licenseKey: TQE97O4HPY8YAZU3YTZT0Y71 + schemaVersion: 2.0.10 settings: ajaxTimeout: '10' alertEmails: null @@ -518,16 +610,20 @@ plugins: image-optimize: edition: standard enabled: true - licenseKey: N1AW4QWHBOTNF5C2HCN14SLA + licenseKey: AHGXAP0SS5F2TGP0ZHPRQIOC schemaVersion: 1.0.0 navigate: edition: standard enabled: true - licenseKey: R3CPY6ZNWPAN90GL1LU4ZVG8 + licenseKey: 3ABR45FYK11K6X6D03MJUMI2 schemaVersion: 2.4.0 settings: anyoneCanAdd: '' pluginLabel: Navigations + password-policy: + edition: standard + enabled: true + schemaVersion: 1.0.0 position-fieldtype: edition: standard enabled: true @@ -538,30 +634,21 @@ plugins: edition: standard enabled: true schemaVersion: 2.0.1 - redactor: - edition: standard - enabled: true - licenseKey: null - schemaVersion: 2.3.0 - settings: null seo-fields: edition: standard enabled: true - licenseKey: ISE7A0Q95UBOMAB3QAN1FX4V + licenseKey: A2IWLW1KCSTHATK5YU2MM3Z2 schemaVersion: 2.0.0 - settings: - fieldHandle: seo - notFoundLimit: 10000 - pluginLabel: SEO - robotsPerSite: false - sitemapPerSite: false - titleSeperator: '-' super-table: edition: standard enabled: true licenseKey: null schemaVersion: 3.0.0 settings: null + tablemaker: + edition: standard + enabled: true + schemaVersion: 3.0.0 translate: edition: standard enabled: true @@ -576,10 +663,14 @@ plugins: edition: standard enabled: true schemaVersion: 1.0.0 + width-fieldtype: + edition: standard + enabled: true + schemaVersion: 1.0.0 system: edition: pro live: true name: $SYSTEM_NAME retryDuration: null - schemaVersion: 4.0.0.9 + schemaVersion: 4.4.0.4 timeZone: Europe/Brussels diff --git a/config/project/sections/forgotPasswordConfirmation--53c1af4c-0fbd-4811-a028-67fed65195b9.yaml b/config/project/sections/forgotPasswordConfirmation--53c1af4c-0fbd-4811-a028-67fed65195b9.yaml new file mode 100644 index 00000000..5485407c --- /dev/null +++ b/config/project/sections/forgotPasswordConfirmation--53c1af4c-0fbd-4811-a028-67fed65195b9.yaml @@ -0,0 +1,34 @@ +defaultPlacement: end +enableVersioning: true +handle: forgotPasswordConfirmation +name: 'Forgot Password Confirmation' +previewTargets: + - + __assoc__: + - + - label + - 'Primary entry page' + - + - urlFormat + - '{url}' + - + - refresh + - '1' +propagationMethod: all +siteSettings: + 6de046f0-6167-4af1-aa91-ffaf83e36a14: # NL + enabledByDefault: true + hasUrls: true + template: _site/_account/_passwordRequestResetConfirmation.twig + uriFormat: wachtwoord-vergeten-bevestiging + e57cf13b-f9cb-484a-8093-a897fa43eb68: # EN + enabledByDefault: true + hasUrls: true + template: _site/_account/_passwordRequestResetConfirmation.twig + uriFormat: forgot-password-confirmation + fd2014b7-5bc0-49a9-ac30-e009081532f7: # FR + enabledByDefault: true + hasUrls: true + template: _site/_account/_passwordRequestResetConfirmation.twig + uriFormat: mot-de-passe-oublie-confirmation +type: single diff --git a/config/project/superTableBlockTypes/175c42fc-da01-4ded-8cf6-ca10dd488101.yaml b/config/project/superTableBlockTypes/175c42fc-da01-4ded-8cf6-ca10dd488101.yaml index 63e33906..ceedd733 100644 --- a/config/project/superTableBlockTypes/175c42fc-da01-4ded-8cf6-ca10dd488101.yaml +++ b/config/project/superTableBlockTypes/175c42fc-da01-4ded-8cf6-ca10dd488101.yaml @@ -1,4 +1,4 @@ -changedFieldIndicator: 1849697511 +changedFieldIndicator: null field: 9faf6a00-afea-4a29-a217-e6af774f6b55 # Call to action fieldLayouts: 77473d9a-25e1-402f-a763-c6e3ff92bdbb: @@ -14,12 +14,12 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: 6ce85e9e-ba0f-41b5-b36c-18bf06c7d28d + uid: 0560c026-0cac-404b-befd-dea57fbbf76a userCondition: null warning: null width: 100 name: Content - uid: 4568a9f6-da12-439f-9a1d-78f95916d83e + uid: 19e54462-5c5c-4f5f-bd0e-e072e2830190 userCondition: null fields: fc9b3c7f-00f8-4113-aa56-b2328011d192: # Link @@ -45,6 +45,27 @@ fields: defaultText: '' typeSettings: __assoc__: + - + - asset + - + __assoc__: + - + - sources + - '*' + - + - category + - + __assoc__: + - + - sources + - '*' + - + - entry + - + __assoc__: + - + - sources + - '*' - - email - diff --git a/config/project/superTableBlockTypes/284daef2-f89a-4911-9fa6-7176a9a9c2e8.yaml b/config/project/superTableBlockTypes/284daef2-f89a-4911-9fa6-7176a9a9c2e8.yaml index 589405df..edd0c318 100644 --- a/config/project/superTableBlockTypes/284daef2-f89a-4911-9fa6-7176a9a9c2e8.yaml +++ b/config/project/superTableBlockTypes/284daef2-f89a-4911-9fa6-7176a9a9c2e8.yaml @@ -1,4 +1,4 @@ -changedFieldIndicator: 684746264 +changedFieldIndicator: null field: 302aeb89-2e5c-42f2-a735-98e504b28a37 # Call to action fieldLayouts: d85d743d-9445-4bbe-b507-717c93f5ba87: @@ -14,12 +14,12 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: 2c2672f1-13e2-4db9-a57d-52fcf3994c59 + uid: f193109f-69bc-48cc-bc5e-fe47668348ab userCondition: null warning: null width: 100 name: Content - uid: 502bdd0f-3761-4506-9929-7f9d7b2944df + uid: 40118460-76f4-4e75-a990-501af0e7e2e8 userCondition: null fields: 6d99d3e8-e687-44e6-9e4f-8724da1c5123: # Link @@ -45,6 +45,27 @@ fields: defaultText: '' typeSettings: __assoc__: + - + - asset + - + __assoc__: + - + - sources + - '*' + - + - category + - + __assoc__: + - + - sources + - '*' + - + - entry + - + __assoc__: + - + - sources + - '*' - - email - diff --git a/config/project/superTableBlockTypes/9992e38a-47e2-43e6-93a9-3bc09a42c504.yaml b/config/project/superTableBlockTypes/9992e38a-47e2-43e6-93a9-3bc09a42c504.yaml index 8ac1666d..51e4e62b 100644 --- a/config/project/superTableBlockTypes/9992e38a-47e2-43e6-93a9-3bc09a42c504.yaml +++ b/config/project/superTableBlockTypes/9992e38a-47e2-43e6-93a9-3bc09a42c504.yaml @@ -1,4 +1,4 @@ -changedFieldIndicator: 2045342614 +changedFieldIndicator: null field: ca8bb389-d0f3-4dbb-af40-e2f6ef211040 # Call to action fieldLayouts: 40a3aa8a-1e1f-460b-8130-33021783204b: @@ -14,12 +14,12 @@ fieldLayouts: required: true tip: null type: craft\fieldlayoutelements\CustomField - uid: cf21def4-4866-4f1b-9721-e5eceaf20614 + uid: 790a4838-c3bc-4eea-9317-dc12787531fa userCondition: null warning: null width: 100 name: Content - uid: bfcab131-b899-474a-a34c-9b31ebb458be + uid: 6348a237-8840-47c7-94b1-2ab9bee11ab8 userCondition: null fields: 97e1c649-ce58-4388-bbc1-1f4e41d938b6: # Link @@ -45,6 +45,27 @@ fields: defaultText: 'Read more' typeSettings: __assoc__: + - + - asset + - + __assoc__: + - + - sources + - '*' + - + - category + - + __assoc__: + - + - sources + - '*' + - + - entry + - + __assoc__: + - + - sources + - '*' - - email - diff --git a/config/project/superTableBlockTypes/ed516703-9411-446f-8ce9-d66e9c48839a.yaml b/config/project/superTableBlockTypes/ed516703-9411-446f-8ce9-d66e9c48839a.yaml index c6f9ff4a..f40f21db 100644 --- a/config/project/superTableBlockTypes/ed516703-9411-446f-8ce9-d66e9c48839a.yaml +++ b/config/project/superTableBlockTypes/ed516703-9411-446f-8ce9-d66e9c48839a.yaml @@ -1,77 +1,106 @@ +changedFieldIndicator: 710474433 field: 37471b2c-6c44-4b1a-bc50-3788e9de05d5 # Hero fieldLayouts: 63a576be-e5a1-42a0-8eda-4165892703fd: tabs: - + elementCondition: null elements: - + elementCondition: null fieldUid: 2184d090-d3e1-413b-8d21-b537c5141ef8 # Image instructions: null label: null required: true tip: null type: craft\fieldlayoutelements\CustomField + uid: c2d6ef90-7210-48ad-a51c-200fb5b1e1e9 + userCondition: null warning: null width: 100 - + elementCondition: null fieldUid: f2cda3ff-d4de-4c81-a8c2-944f82c303db # Title instructions: null label: null required: true tip: null type: craft\fieldlayoutelements\CustomField + uid: 003f98c4-765a-40ca-a3e3-54a939e9dd59 + userCondition: null warning: null width: 100 - + elementCondition: null fieldUid: d04eb799-5eb6-46db-92f8-88c4e6b8812e # Intro instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: 4b54acd3-0bf2-44fa-83a9-bbf84c59e917 + userCondition: null warning: null width: 100 - + elementCondition: null fieldUid: f936530d-29a5-4460-9ccd-b586bfb25329 # Call to actions instructions: null label: null required: false tip: null type: craft\fieldlayoutelements\CustomField + uid: f10f7bbc-a341-46d7-9548-1c3111ff6e01 + userCondition: null warning: null width: 100 name: Content - sortOrder: 1 + uid: f0a1f43c-d76e-40d3-9b39-e2a0e2021a72 + userCondition: null fields: 2184d090-d3e1-413b-8d21-b537c5141ef8: # Image columnSuffix: null contentColumnType: string fieldGroup: null handle: image - instructions: 'The minimum with for this image is 2200px. The ideal width is 4400px.' + instructions: 'The minimum width for this image is 2200px. The ideal width is 4400px.' name: Image searchable: true settings: allowSelfRelations: false + allowSubfolders: false allowUploads: false allowedKinds: - image defaultUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files - defaultUploadLocationSubpath: '' - limit: '1' + defaultUploadLocationSubpath: null localizeRelations: true + maxRelations: 1 + minRelations: null previewMode: full - restrictFiles: '1' + restrictFiles: true + restrictLocation: false + restrictedDefaultUploadSubpath: null + restrictedLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files + restrictedLocationSubpath: null + selectionCondition: + __assoc__: + - + - elementType + - craft\elements\Asset + - + - fieldContext + - global + - + - class + - craft\elements\conditions\assets\AssetCondition selectionLabel: 'Add an image' showSiteMenu: false showUnpermittedFiles: false showUnpermittedVolumes: false - singleUploadLocationSource: 'volume:979c3eeb-f99a-4ca1-bcbe-ce9298a4e4ca' # Files - singleUploadLocationSubpath: '' source: null sources: '*' targetSiteId: null - useSingleFolder: false validateRelatedElements: false viewMode: large translationKeyFormat: null @@ -82,44 +111,38 @@ fields: contentColumnType: text fieldGroup: null handle: intro - instructions: '' + instructions: null name: Intro searchable: true settings: availableTransforms: '*' availableVolumes: '*' + ckeConfig: 131a4f6d-f00f-4238-b846-dd504bf669fe # Simple columnType: text - configSelectionMode: choose defaultTransform: '' - manualConfig: '' - purifierConfig: '' - purifyHtml: '1' - redactorConfig: Simple.json - removeEmptyTags: '1' - removeInlineStyles: '1' - removeNbsp: '1' - showHtmlButtonForNonAdmins: '' + enableSourceEditingForNonAdmins: false + purifierConfig: null + purifyHtml: true showUnpermittedFiles: false showUnpermittedVolumes: false - uiMode: enlarged translationKeyFormat: null translationMethod: site - type: craft\redactor\Field + type: craft\ckeditor\Field f2cda3ff-d4de-4c81-a8c2-944f82c303db: # Title columnSuffix: null contentColumnType: text fieldGroup: null handle: heroTitle - instructions: '' + instructions: null name: Title searchable: true settings: byteLimit: null charLimit: null - code: '' + code: false columnType: null - initialRows: '4' - multiline: '' + initialRows: 4 + multiline: false placeholder: null uiMode: normal translationKeyFormat: null @@ -130,13 +153,13 @@ fields: contentColumnType: string fieldGroup: null handle: ctas - instructions: '' + instructions: null name: 'Call to actions' searchable: false settings: contentTable: '{{%matrixcontent_ctas}}' - maxBlocks: '2' - minBlocks: '' + maxBlocks: 2 + minBlocks: null propagationKeyFormat: null propagationMethod: all translationKeyFormat: null diff --git a/config/project/users/groups/contentManagers--3196b984-5af4-44dd-a6db-ac2c8f7924d9.yaml b/config/project/users/groups/contentManagers--3196b984-5af4-44dd-a6db-ac2c8f7924d9.yaml index d02054f9..698db708 100644 --- a/config/project/users/groups/contentManagers--3196b984-5af4-44dd-a6db-ac2c8f7924d9.yaml +++ b/config/project/users/groups/contentManagers--3196b984-5af4-44dd-a6db-ac2c8f7924d9.yaml @@ -25,13 +25,14 @@ permissions: - 'deletepeerentrydrafts:361daec5-5ea3-4d9f-957f-f39c78bb595e' - 'deletepeerentrydrafts:36895330-a28e-477f-9327-bdbe66dabf99' # Cookie policy - 'deletepeerentrydrafts:45b7c78f-587d-441b-bbd1-605ca629d0bd' # Pages - - 'deletepeerentrydrafts:4703bf34-5e13-4da1-aff6-d04c0bba024b' # Set Password Confirmation + - 'deletepeerentrydrafts:4703bf34-5e13-4da1-aff6-d04c0bba024b' - 'deletepeerentrydrafts:4750849d-9328-4d3e-956d-9d317da5e6eb' # Page not found - 'deletepeerentrydrafts:4c32edae-2824-4f0f-b38b-2477d2500dfe' # News Overview - - 'deletepeerentrydrafts:53c1af4c-0fbd-4811-a028-67fed65195b9' + - 'deletepeerentrydrafts:53c1af4c-0fbd-4811-a028-67fed65195b9' # Forgot Password Confirmation - 'deletepeerentrydrafts:5611e98d-93ec-4bd4-95dd-18f282b8c5e8' # Home - 'deletepeerentrydrafts:5d236e94-b6a8-472c-9296-a5c992cdd49a' # Contact - 'deletepeerentrydrafts:684ece64-c23a-4abf-9574-f2c053d496e8' + - 'deletepeerentrydrafts:8e583282-1fec-4444-822f-37b2d5961f28' - 'deletepeerentrydrafts:af69e9a2-96df-4fa9-8cc3-2728ec4fc632' - 'deletepeerentrydrafts:c2198cbb-f6e1-478a-ab4a-bbbaea43ce0e' # Privacy policy - 'deletepeerentrydrafts:c25b1e19-dca6-4ab5-a776-a043f6ee4c82' @@ -48,6 +49,14 @@ permissions: - 'editsite:e57cf13b-f9cb-484a-8093-a897fa43eb68' # EN - 'editsite:fd2014b7-5bc0-49a9-ac30-e009081532f7' # FR - editusers + - formie-createforms + - formie-deleteforms + - formie-editforms + - formie-editsubmissions + - formie-manageformbehavior + - formie-managenotifications + - formie-managenotificationstemplates + - formie-viewforms - formie-viewsentnotifications - formie-viewsubmissions - moderateusers @@ -61,13 +70,14 @@ permissions: - 'saveentries:361daec5-5ea3-4d9f-957f-f39c78bb595e' - 'saveentries:36895330-a28e-477f-9327-bdbe66dabf99' # Cookie policy - 'saveentries:45b7c78f-587d-441b-bbd1-605ca629d0bd' # Pages - - 'saveentries:4703bf34-5e13-4da1-aff6-d04c0bba024b' # Set Password Confirmation + - 'saveentries:4703bf34-5e13-4da1-aff6-d04c0bba024b' - 'saveentries:4750849d-9328-4d3e-956d-9d317da5e6eb' # Page not found - 'saveentries:4c32edae-2824-4f0f-b38b-2477d2500dfe' # News Overview - - 'saveentries:53c1af4c-0fbd-4811-a028-67fed65195b9' + - 'saveentries:53c1af4c-0fbd-4811-a028-67fed65195b9' # Forgot Password Confirmation - 'saveentries:5611e98d-93ec-4bd4-95dd-18f282b8c5e8' # Home - 'saveentries:5d236e94-b6a8-472c-9296-a5c992cdd49a' # Contact - 'saveentries:684ece64-c23a-4abf-9574-f2c053d496e8' + - 'saveentries:8e583282-1fec-4444-822f-37b2d5961f28' - 'saveentries:af69e9a2-96df-4fa9-8cc3-2728ec4fc632' - 'saveentries:c2198cbb-f6e1-478a-ab4a-bbbaea43ce0e' # Privacy policy - 'saveentries:c25b1e19-dca6-4ab5-a776-a043f6ee4c82' @@ -84,13 +94,14 @@ permissions: - 'savepeerentrydrafts:361daec5-5ea3-4d9f-957f-f39c78bb595e' - 'savepeerentrydrafts:36895330-a28e-477f-9327-bdbe66dabf99' # Cookie policy - 'savepeerentrydrafts:45b7c78f-587d-441b-bbd1-605ca629d0bd' # Pages - - 'savepeerentrydrafts:4703bf34-5e13-4da1-aff6-d04c0bba024b' # Set Password Confirmation + - 'savepeerentrydrafts:4703bf34-5e13-4da1-aff6-d04c0bba024b' - 'savepeerentrydrafts:4750849d-9328-4d3e-956d-9d317da5e6eb' # Page not found - 'savepeerentrydrafts:4c32edae-2824-4f0f-b38b-2477d2500dfe' # News Overview - - 'savepeerentrydrafts:53c1af4c-0fbd-4811-a028-67fed65195b9' + - 'savepeerentrydrafts:53c1af4c-0fbd-4811-a028-67fed65195b9' # Forgot Password Confirmation - 'savepeerentrydrafts:5611e98d-93ec-4bd4-95dd-18f282b8c5e8' # Home - 'savepeerentrydrafts:5d236e94-b6a8-472c-9296-a5c992cdd49a' # Contact - 'savepeerentrydrafts:684ece64-c23a-4abf-9574-f2c053d496e8' + - 'savepeerentrydrafts:8e583282-1fec-4444-822f-37b2d5961f28' - 'savepeerentrydrafts:af69e9a2-96df-4fa9-8cc3-2728ec4fc632' - 'savepeerentrydrafts:c2198cbb-f6e1-478a-ab4a-bbbaea43ce0e' # Privacy policy - 'savepeerentrydrafts:c25b1e19-dca6-4ab5-a776-a043f6ee4c82' @@ -107,13 +118,14 @@ permissions: - 'viewentries:361daec5-5ea3-4d9f-957f-f39c78bb595e' - 'viewentries:36895330-a28e-477f-9327-bdbe66dabf99' # Cookie policy - 'viewentries:45b7c78f-587d-441b-bbd1-605ca629d0bd' # Pages - - 'viewentries:4703bf34-5e13-4da1-aff6-d04c0bba024b' # Set Password Confirmation + - 'viewentries:4703bf34-5e13-4da1-aff6-d04c0bba024b' - 'viewentries:4750849d-9328-4d3e-956d-9d317da5e6eb' # Page not found - 'viewentries:4c32edae-2824-4f0f-b38b-2477d2500dfe' # News Overview - - 'viewentries:53c1af4c-0fbd-4811-a028-67fed65195b9' + - 'viewentries:53c1af4c-0fbd-4811-a028-67fed65195b9' # Forgot Password Confirmation - 'viewentries:5611e98d-93ec-4bd4-95dd-18f282b8c5e8' # Home - 'viewentries:5d236e94-b6a8-472c-9296-a5c992cdd49a' # Contact - 'viewentries:684ece64-c23a-4abf-9574-f2c053d496e8' + - 'viewentries:8e583282-1fec-4444-822f-37b2d5961f28' - 'viewentries:af69e9a2-96df-4fa9-8cc3-2728ec4fc632' - 'viewentries:c2198cbb-f6e1-478a-ab4a-bbbaea43ce0e' # Privacy policy - 'viewentries:c25b1e19-dca6-4ab5-a776-a043f6ee4c82' @@ -130,13 +142,14 @@ permissions: - 'viewpeerentrydrafts:361daec5-5ea3-4d9f-957f-f39c78bb595e' - 'viewpeerentrydrafts:36895330-a28e-477f-9327-bdbe66dabf99' # Cookie policy - 'viewpeerentrydrafts:45b7c78f-587d-441b-bbd1-605ca629d0bd' # Pages - - 'viewpeerentrydrafts:4703bf34-5e13-4da1-aff6-d04c0bba024b' # Set Password Confirmation + - 'viewpeerentrydrafts:4703bf34-5e13-4da1-aff6-d04c0bba024b' - 'viewpeerentrydrafts:4750849d-9328-4d3e-956d-9d317da5e6eb' # Page not found - 'viewpeerentrydrafts:4c32edae-2824-4f0f-b38b-2477d2500dfe' # News Overview - - 'viewpeerentrydrafts:53c1af4c-0fbd-4811-a028-67fed65195b9' + - 'viewpeerentrydrafts:53c1af4c-0fbd-4811-a028-67fed65195b9' # Forgot Password Confirmation - 'viewpeerentrydrafts:5611e98d-93ec-4bd4-95dd-18f282b8c5e8' # Home - 'viewpeerentrydrafts:5d236e94-b6a8-472c-9296-a5c992cdd49a' # Contact - 'viewpeerentrydrafts:684ece64-c23a-4abf-9574-f2c053d496e8' + - 'viewpeerentrydrafts:8e583282-1fec-4444-822f-37b2d5961f28' - 'viewpeerentrydrafts:af69e9a2-96df-4fa9-8cc3-2728ec4fc632' - 'viewpeerentrydrafts:c2198cbb-f6e1-478a-ab4a-bbbaea43ce0e' # Privacy policy - 'viewpeerentrydrafts:c25b1e19-dca6-4ab5-a776-a043f6ee4c82' diff --git a/config/redactor/Extended.json b/config/redactor/Extended.json deleted file mode 100644 index 0366d442..00000000 --- a/config/redactor/Extended.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "buttons": ["format","bold","italic","lists","link","file"], - "formatting": ["p", "h2", "h3", "h4", "h5"], - "linkNewTab": true, - "pasteImages": false -} \ No newline at end of file diff --git a/config/redactor/Hero.json b/config/redactor/Hero.json deleted file mode 100644 index 30e10903..00000000 --- a/config/redactor/Hero.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "buttons": ["format","bold","italic","lists","link","file"], - "formatting": ["p", "h1", "h2", "h3", "h4", "h5"], - "linkNewTab": true -} \ No newline at end of file diff --git a/config/redactor/Simple.json b/config/redactor/Simple.json deleted file mode 100644 index 2b12167c..00000000 --- a/config/redactor/Simple.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "buttons": ["bold","italic"], - "pasteLinks": false, - "pasteImages": false -} diff --git a/config/redactor/Standard.json b/config/redactor/Standard.json deleted file mode 100644 index fe53f905..00000000 --- a/config/redactor/Standard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "buttons": ["bold","italic","link"], - "linkNewTab": true, - "pasteLinks": false, - "pasteImages": false -} diff --git a/config/redactor/Table.json b/config/redactor/Table.json deleted file mode 100644 index cfd4cecf..00000000 --- a/config/redactor/Table.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "buttons": ["html", "bold", "italic", "link"], - "pasteLinks": false, - "pasteImages": false, - "plugins": ["table"] -} \ No newline at end of file diff --git a/config/redactor/table/table.js b/config/redactor/table/table.js deleted file mode 100644 index 548e5549..00000000 --- a/config/redactor/table/table.js +++ /dev/null @@ -1,471 +0,0 @@ -(function($R) -{ - $R.add('plugin', 'table', { - translations: { - en: { - "table": "Table", - "insert-table": "Insert table", - "insert-row-above": "Insert row above", - "insert-row-below": "Insert row below", - "insert-column-left": "Insert column left", - "insert-column-right": "Insert column right", - "add-head": "Add head", - "delete-head": "Delete head", - "delete-column": "Delete column", - "delete-row": "Delete row", - "delete-table": "Delete table" - } - }, - init: function(app) - { - this.app = app; - this.lang = app.lang; - this.opts = app.opts; - this.caret = app.caret; - this.editor = app.editor; - this.toolbar = app.toolbar; - this.component = app.component; - this.inspector = app.inspector; - this.insertion = app.insertion; - this.selection = app.selection; - }, - // messages - ondropdown: { - table: { - observe: function(dropdown) - { - this._observeDropdown(dropdown); - } - } - }, - onbottomclick: function() - { - this.insertion.insertToEnd(this.editor.getLastNode(), 'table'); - }, - - // public - start: function() - { - var dropdown = { - observe: 'table', - 'insert-table': { - title: this.lang.get('insert-table'), - api: 'plugin.table.insert' - }, - 'insert-row-above': { - title: this.lang.get('insert-row-above'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.addRowAbove' - }, - 'insert-row-below': { - title: this.lang.get('insert-row-below'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.addRowBelow' - }, - 'insert-column-left': { - title: this.lang.get('insert-column-left'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.addColumnLeft' - }, - 'insert-column-right': { - title: this.lang.get('insert-column-right'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.addColumnRight' - }, - 'add-head': { - title: this.lang.get('add-head'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.addHead' - }, - 'delete-head': { - title: this.lang.get('delete-head'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.deleteHead' - }, - 'delete-column': { - title: this.lang.get('delete-column'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.deleteColumn' - }, - 'delete-row': { - title: this.lang.get('delete-row'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.deleteRow' - }, - 'delete-table': { - title: this.lang.get('delete-table'), - classname: 'redactor-table-item-observable', - api: 'plugin.table.deleteTable' - } - }; - var obj = { - title: this.lang.get('table') - }; - - var $button = this.toolbar.addButtonBefore('link', 'table', obj); - $button.setIcon(''); - $button.setDropdown(dropdown); - }, - insert: function() - { - var rows = 2; - var columns = 3; - var $component = this.component.create('table'); - - for (var i = 0; i < rows; i++) - { - $component.addRow(columns); - } - - $component = this.insertion.insertHtml($component); - this.caret.setStart($component); - }, - addRowAbove: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - var $row = $component.addRowTo(current, 'before'); - - this.caret.setStart($row); - } - }, - addRowBelow: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - var $row = $component.addRowTo(current, 'after'); - - this.caret.setStart($row); - } - }, - addColumnLeft: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - - this.selection.save(); - $component.addColumnTo(current, 'left'); - this.selection.restore(); - } - }, - addColumnRight: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - - this.selection.save(); - $component.addColumnTo(current, 'right'); - this.selection.restore(); - } - }, - addHead: function() - { - var $component = this._getComponent(); - if ($component) - { - this.selection.save(); - $component.addHead(); - this.selection.restore(); - } - }, - deleteHead: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - var $head = $R.dom(current).closest('thead'); - if ($head.length !== 0) - { - $component.removeHead(); - this.caret.setStart($component); - } - else - { - this.selection.save(); - $component.removeHead(); - this.selection.restore(); - } - } - }, - deleteColumn: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - - var $currentCell = $R.dom(current).closest('td, th'); - var nextCell = $currentCell.nextElement().get(); - var prevCell = $currentCell.prevElement().get(); - - $component.removeColumn(current); - - if (nextCell) this.caret.setStart(nextCell); - else if (prevCell) this.caret.setEnd(prevCell); - else this.deleteTable(); - } - }, - deleteRow: function() - { - var $component = this._getComponent(); - if ($component) - { - var current = this.selection.getCurrent(); - - var $currentRow = $R.dom(current).closest('tr'); - var nextRow = $currentRow.nextElement().get(); - var prevRow = $currentRow.prevElement().get(); - - $component.removeRow(current); - - if (nextRow) this.caret.setStart(nextRow); - else if (prevRow) this.caret.setEnd(prevRow); - else this.deleteTable(); - } - }, - deleteTable: function() - { - var table = this._getTable(); - if (table) - { - this.component.remove(table); - } - }, - - // private - _getTable: function() - { - var current = this.selection.getCurrent(); - var data = this.inspector.parse(current); - if (data.isTable()) - { - return data.getTable(); - } - }, - _getComponent: function() - { - var current = this.selection.getCurrent(); - var data = this.inspector.parse(current); - if (data.isTable()) - { - var table = data.getTable(); - - return this.component.create('table', table); - } - }, - _observeDropdown: function(dropdown) - { - var table = this._getTable(); - var items = dropdown.getItemsByClass('redactor-table-item-observable'); - var tableItem = dropdown.getItem('insert-table'); - if (table) - { - this._observeItems(items, 'enable'); - tableItem.disable(); - } - else - { - this._observeItems(items, 'disable'); - tableItem.enable(); - } - }, - _observeItems: function(items, type) - { - for (var i = 0; i < items.length; i++) - { - items[i][type](); - } - } - }); -})(Redactor); -(function($R) -{ - $R.add('class', 'table.component', { - mixins: ['dom', 'component'], - init: function(app, el) - { - this.app = app; - - // init - return (el && el.cmnt !== undefined) ? el : this._init(el); - }, - - // public - addHead: function() - { - this.removeHead(); - - var columns = this.$element.find('tr').first().children('td, th').length; - var $head = $R.dom(''); - var $row = this._buildRow(columns, ''); - - $head.append($row); - this.$element.prepend($head); - }, - addRow: function(columns) - { - var $row = this._buildRow(columns); - this.$element.append($row); - - return $row; - }, - addRowTo: function(current, type) - { - return this._addRowTo(current, type); - }, - addColumnTo: function(current, type) - { - var $current = $R.dom(current); - var $currentRow = $current.closest('tr'); - var $currentCell = $current.closest('td, th'); - - var index = 0; - $currentRow.find('td, th').each(function(node, i) - { - if (node === $currentCell.get()) index = i; - }); - - this.$element.find('tr').each(function(node) - { - var $node = $R.dom(node); - var origCell = $node.find('td, th').get(index); - var $origCell = $R.dom(origCell); - - var $td = $origCell.clone(); - $td.html(''); - - if (type === 'right') $origCell.after($td); - else $origCell.before($td); - }); - }, - removeHead: function() - { - var $head = this.$element.find('thead'); - if ($head.length !== 0) $head.remove(); - }, - removeRow: function(current) - { - var $current = $R.dom(current); - var $currentRow = $current.closest('tr'); - - $currentRow.remove(); - }, - removeColumn: function(current) - { - var $current = $R.dom(current); - var $currentRow = $current.closest('tr'); - var $currentCell = $current.closest('td, th'); - - var index = 0; - $currentRow.find('td, th').each(function(node, i) - { - if (node === $currentCell.get()) index = i; - }); - - this.$element.find('tr').each(function(node) - { - var $node = $R.dom(node); - var origCell = $node.find('td, th').get(index); - var $origCell = $R.dom(origCell); - - $origCell.remove(); - }); - }, - - // private - _init: function(el) - { - var wrapper, element; - if (typeof el !== 'undefined') - { - var $node = $R.dom(el); - var node = $node.get(); - var $figure = $node.closest('figure'); - if ($figure.length !== 0) - { - wrapper = $figure; - element = $figure.find('table').get(); - } - else if (node.tagName === 'TABLE') - { - element = node; - } - } - - this._buildWrapper(wrapper); - this._buildElement(element); - this._initWrapper(); - }, - _addRowTo: function(current, position) - { - var $current = $R.dom(current); - var $currentRow = $current.closest('tr'); - if ($currentRow.length !== 0) - { - var columns = $currentRow.children('td, th').length; - var $newRow = this._buildRow(columns); - - $currentRow[position]($newRow); - - return $newRow; - } - }, - _buildRow: function(columns, tag) - { - tag = tag || ''; - - var $row = $R.dom(''); - for (var i = 0; i < columns; i++) - { - var $cell = $R.dom(tag); - $cell.attr('contenteditable', true); - - $row.append($cell); - } - - return $row; - }, - _buildElement: function(node) - { - if (node) - { - this.$element = $R.dom(node); - } - else - { - this.$element = $R.dom(''); - this.append(this.$element); - } - }, - _buildWrapper: function(node) - { - node = node || '
'; - - this.parse(node); - }, - _initWrapper: function() - { - this.addClass('redactor-component'); - this.attr({ - 'data-redactor-type': 'table', - 'tabindex': '-1', - 'contenteditable': false - }); - - if (this.app.detector.isIe()) - { - this.removeAttr('contenteditable'); - } - } - }); - -})(Redactor); \ No newline at end of file diff --git a/config/robots-production b/config/robots-production new file mode 100644 index 00000000..7da25aff --- /dev/null +++ b/config/robots-production @@ -0,0 +1,6 @@ +# robots.txt + +User-agent: * +Disallow: /cpresources/ +Disallow: /vendor/ +Disallow: /.env \ No newline at end of file diff --git a/config/robots-staging b/config/robots-staging new file mode 100644 index 00000000..77470cb3 --- /dev/null +++ b/config/robots-staging @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/config/seeder.php b/config/seeder.php deleted file mode 100644 index 9b28f798..00000000 --- a/config/seeder.php +++ /dev/null @@ -1,8 +0,0 @@ - [ - 'volumeId' => 1, - 'path' => 'test/' - ] -]; \ No newline at end of file diff --git a/craft b/craft index f036534d..547e5089 100755 --- a/craft +++ b/craft @@ -3,17 +3,12 @@ /** * Craft console bootstrap file */ -// Set path constants -define('CRAFT_BASE_PATH', __DIR__); -define('CRAFT_VENDOR_PATH', CRAFT_BASE_PATH.'/vendor'); -// Load Composer's autoloader -require_once CRAFT_VENDOR_PATH.'/autoload.php'; -// Load dotenv? -if (class_exists('Dotenv\Dotenv') && file_exists(CRAFT_BASE_PATH.'/.env')) { - Dotenv\Dotenv::create(CRAFT_BASE_PATH)->load(); -} + +// Load shared bootstrap +require __DIR__ . '/bootstrap.php'; + // Load and run Craft -define('CRAFT_ENVIRONMENT', getenv('ENVIRONMENT') ?: 'production'); -$app = require CRAFT_VENDOR_PATH.'/craftcms/cms/bootstrap/console.php'; +/** @var craft\console\Application $app */ +$app = require CRAFT_VENDOR_PATH . '/craftcms/cms/bootstrap/console.php'; $exitCode = $app->run(); -exit($exitCode); \ No newline at end of file +exit($exitCode); diff --git a/googlefonts.js b/googlefonts.js index a0724025..3887e13d 100644 --- a/googlefonts.js +++ b/googlefonts.js @@ -11,7 +11,7 @@ async function downloadFonts(url) { outputDir: './tailoff', stylePath: 'css/site/base/fonts.css', fontsDir: 'fonts', - fontsPath: '../fonts/', + fontsPath: '/tailoff/fonts/', }); console.log('\x1b[33m%s\x1b[0m', "Dont't forget to add 'fonts.css' to your 'main.css' file"); } diff --git a/modules/statik/src/Statik.php b/modules/statik/src/Statik.php index e2f6968e..f30aec7f 100644 --- a/modules/statik/src/Statik.php +++ b/modules/statik/src/Statik.php @@ -5,19 +5,21 @@ use Craft; use craft\console\Application as ConsoleApplication; use craft\events\RegisterComponentTypesEvent; +use craft\events\RegisterCpNavItemsEvent; use craft\events\RegisterTemplateRootsEvent; +use craft\events\RegisterUrlRulesEvent; use craft\events\SetAssetFilenameEvent; use craft\events\TemplateEvent; use craft\helpers\Assets; use craft\i18n\PhpMessageSource; use craft\services\Fields; -use craft\services\Plugins; +use craft\web\twig\variables\Cp; use craft\web\twig\variables\CraftVariable; +use craft\web\UrlManager; use craft\web\View; use modules\statik\assetbundles\Statik\StatikAsset; use modules\statik\fields\AnchorLink; use modules\statik\services\LanguageService; -use modules\statik\services\Revision; use modules\statik\variables\StatikVariable; use verbb\formie\events\RegisterFieldsEvent; use yii\base\Event; @@ -32,7 +34,6 @@ * @since 1.0.0 * * @property LanguageService language - * @property Revision revision * */ class Statik extends Module @@ -140,8 +141,22 @@ public function init() $event->fields = array_values($event->fields); }); + Event::on(Cp::class, Cp::EVENT_REGISTER_CP_NAV_ITEMS, function (RegisterCpNavItemsEvent $event) { + if (Craft::$app->getConfig()->getGeneral()->allowAdminChanges) { + $event->navItems[] = [ + 'url' => 'settings/fields', + 'label' => 'Fields', + 'icon' => '@modules/statik/fields.svg', + ]; + $event->navItems[] = [ + 'url' => 'settings/sections', + 'label' => 'Sections', + 'icon' => '@modules/statik/sections.svg', + ]; + } + }); + $this->setComponents([ - 'revision' => Revision::class, 'language' => LanguageService::class, ]); @@ -168,8 +183,8 @@ public function init() private function setHttpHeaders() { - - if(!Craft::$app->getRequest()->isConsoleRequest) { + if (!Craft::$app->getRequest()->isConsoleRequest) { + //Craft::$app->getResponse()->headers->add('Strict-Transport-Security', "max-age=31536000; includeSubDomains; preload"); Craft::$app->getResponse()->headers->add('X-Frame-Options', 'SAMEORIGIN'); Craft::$app->getResponse()->headers->add('X-XSS-Protection', '1; mode=block'); // Already deprecated Craft::$app->getResponse()->headers->add('X-Content-Type-Options', 'nosniff'); // Already deprecated diff --git a/modules/statik/src/console/controllers/SetupController.php b/modules/statik/src/console/controllers/SetupController.php index 7db59925..23ac3e5a 100644 --- a/modules/statik/src/console/controllers/SetupController.php +++ b/modules/statik/src/console/controllers/SetupController.php @@ -51,6 +51,7 @@ public function actionIndex(): int $this->stdout(str_replace("\n", PHP_EOL, $statik), Console::FG_BLUE); $this->setSystemName(); + $this->setProjectCode(); $this->removeAccountFlow(); $this->setPostmarkKey(); $this->setupGit(); @@ -72,6 +73,29 @@ private function setSystemName() } } + private function setProjectCode() + { + $newProjectCode = $this->prompt('Enter a the project code:'); + if ($newProjectCode) { + // Replace CRABAS in htaccess-staging and htaccess-production + $this->replaceInHtaccess(Craft::$app->path->getConfigPath() . '/htaccess-staging', $newProjectCode); + $this->replaceInHtaccess(Craft::$app->path->getConfigPath() . '/htaccess-production', $newProjectCode); + } + } + + private function replaceInHtaccess($htaccessPath, $projectCode) { + if (file_exists($htaccessPath)) { + $htaccess = file_get_contents($htaccessPath); + $htaccess = str_replace('crabas', strtolower($projectCode), $htaccess); + file_put_contents($htaccessPath, $htaccess); + } else { + $this->stderr("$htaccessPath file not found." . PHP_EOL, Console::FG_RED); + return false; + } + $this->stdout("Updated $htaccessPath with $projectCode!" . PHP_EOL, Console::FG_GREEN); + return true; + } + private function removeAccountFlow() { @@ -88,10 +112,31 @@ private function removeAccountFlow() } } - $this->stdout("Done! Don't forget to delete the account settings in config/general.php: loginPath, setPasswordPath, activateAccountSuccessPath, setPasswordSuccessPath" . PHP_EOL, Console::FG_PURPLE); + $accountsFolder = Craft::$app->path->getSiteTemplatesPath() . '/_site/_account'; + if(is_dir($accountsFolder)) { + if ($this->deleteDirectory($accountsFolder)) { + $this->stdout("$accountsFolder removed!" . PHP_EOL, Console::FG_GREEN); + } + } else { + $this->stderr("$accountsFolder not found." . PHP_EOL, Console::FG_RED); + return false; + } + if ($this->setEnvVar("PUBLIC_ACCOUNT_FLOW", 0)) { + $this->stdout("Done!" . PHP_EOL, Console::FG_GREEN); + } + } else { + $this->setEnvVar("PUBLIC_ACCOUNT_FLOW", 1); } + } else { + $this->setEnvVar("PUBLIC_ACCOUNT_FLOW", 1); } + return true; + } + + private function deleteDirectory($dir) { + system('rm -rf -- ' . escapeshellarg($dir), $retval); + return $retval == 0; // UNIX commands return zero on success } /** @@ -105,7 +150,7 @@ private function setPostmarkKey() if ($this->setEnvVar("POSTMARK_API_KEY", $key)) { $this->stdout("Done!" . PHP_EOL, Console::FG_GREEN); } - $testEmail = $this->prompt("> Enter an emailaddress to use for testing on staging environments:"); + $testEmail = $this->prompt("> Enter an email address to use for testing on staging environments:"); if ($testEmail) { if ($this->setEnvVar("DEBUG_EMAIL", $testEmail)) { $this->stdout("Done!" . PHP_EOL, Console::FG_GREEN); diff --git a/modules/statik/src/controllers/DefaultController.php b/modules/statik/src/controllers/DefaultController.php deleted file mode 100644 index 38bfbe24..00000000 --- a/modules/statik/src/controllers/DefaultController.php +++ /dev/null @@ -1,55 +0,0 @@ - + + + + + + \ No newline at end of file diff --git a/modules/statik/src/sections.svg b/modules/statik/src/sections.svg new file mode 100644 index 00000000..b5f3809c --- /dev/null +++ b/modules/statik/src/sections.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/modules/statik/src/services/Revision.php b/modules/statik/src/services/Revision.php deleted file mode 100644 index be4e0a5e..00000000 --- a/modules/statik/src/services/Revision.php +++ /dev/null @@ -1,32 +0,0 @@ -version = file_exists($file) ? file_get_contents($file) : 'no-version'; - } - - /** - * @return string - */ - public function getVersion(): string - { - if (!$this->version) { - $this->setVersion(); - } - - return $this->version; - } -} \ No newline at end of file diff --git a/modules/statik/src/variables/StatikVariable.php b/modules/statik/src/variables/StatikVariable.php index 90b6411c..5ab42ebd 100644 --- a/modules/statik/src/variables/StatikVariable.php +++ b/modules/statik/src/variables/StatikVariable.php @@ -2,13 +2,10 @@ namespace modules\statik\variables; +use Craft; +use craft\web\View; use craft\helpers\ElementHelper; -use craft\web\twig\variables\Cp; use craft\web\twig\variables\Paginate; -use craft\web\View; -use modules\statik\Statik; - -use Craft; /** * @author Statik @@ -17,34 +14,24 @@ */ class StatikVariable { - - public function revision(): string - { - return Statik::getInstance()->revision->getVersion(); - } - /** * Render pagination template with options - * @param Paginate $pageInfo - * @param array $options - * @return null + * @param array $options to pass to the template * @throws \Twig\Error\LoaderError * @throws \Twig\Error\RuntimeError * @throws \Twig\Error\SyntaxError * @throws \yii\base\Exception */ - public function paginate(Paginate $pageInfo, array $options = []) + public function paginate(Paginate $pageInfo, array $options = []): string { if (!$pageInfo->total) { - return false; + return ''; } - echo Craft::$app->view->renderTemplate('_site/_snippet/_global/_paginate', [ + return Craft::$app->view->renderTemplate('_site/_snippet/_global/_paginate', [ 'pageInfo' => $pageInfo, 'options' => $options, ],View::TEMPLATE_MODE_SITE); - - return null; } public function isBot($userAgent = '/bot|crawl|facebook|google|slurp|spider|mediapartners/i') @@ -54,11 +41,6 @@ public function isBot($userAgent = '/bot|crawl|facebook|google|slurp|spider|medi } return false; } - public function isIE() - { - return $this->isBot("/Trident/i"); - } - /** * Create slugs from titles in contentbuilder for the anchor link @@ -68,16 +50,4 @@ public function isIE() public function slugify($string) { return ElementHelper::generateSlug($string); } - - // public function getIconSpritePath($base){ - - // $matches = glob(CRAFT_BASE_PATH . '/public/icon/sprite.*.svg'); - // $matches = array_filter($matches); - // if(!$matches) { - - // } - // $path = explode("/",$matches[0]); - // $file = end($path); - // return "/icon/" . $file; - // } } diff --git a/package.json b/package.json index 16dd175a..42400dbe 100755 --- a/package.json +++ b/package.json @@ -24,36 +24,36 @@ "sharp": "^0.29.0" }, "devDependencies": { - "@tailwindcss/aspect-ratio": "^0.4.0", - "@types/glidejs": "^1.0.30", + "@tailwindcss/aspect-ratio": "^0.4.2", + "@types/glidejs": "^1.0.31", "@types/googlemaps": "^3.43.3", - "@vitejs/plugin-basic-ssl": "^0.1.2", - "@vitejs/plugin-legacy": "^2.2.0", - "autoprefixer": "^10.4.2", + "@vitejs/plugin-basic-ssl": "^1.0.1", + "@vitejs/plugin-legacy": "^4.0.1", + "autoprefixer": "^10.4.13", "google-fonts-helper": "^2.0.1", - "postcss": "^8.4.5", - "postcss-cli": "^8.3.1", - "postcss-custom-properties": "^11.0.0", + "postcss": "^8.4.21", + "postcss-cli": "^10.1.0", + "postcss-custom-properties": "^13.1.2", "postcss-file": "^0.1.1", - "postcss-import": "^14.0.2", - "postcss-mixins": "^8.1.0", - "postcss-nested": "^5.0.5", - "promise-polyfill": "^8.2.0", - "tailwindcss": "^3.2.0", - "terser": "^5.15.1", - "typescript": "4.2.3", - "vite": "^3.1.7", - "vite-plugin-restart": "^0.2.0", - "vite-plugin-static-copy": "^0.9.0", - "wicg-inert": "^3.1.1" + "postcss-import": "^15.1.0", + "postcss-mixins": "^9.0.4", + "postcss-nested": "^6.0.0", + "promise-polyfill": "^8.3.0", + "tailwindcss": "^3.2.4", + "terser": "^5.16.3", + "typescript": "4.9.5", + "vite": "^4.1.1", + "vite-plugin-mkcert": "^1.13.0", + "vite-plugin-restart": "^0.3.1", + "wicg-inert": "^3.1.2" }, "dependencies": { - "@floating-ui/dom": "^1.0.1", - "@glidejs/glide": "^3.4.1", + "@floating-ui/dom": "^1.2.0", + "@glidejs/glide": "^3.6.0", "@popperjs/core": "^2.11.6", - "flatpickr": "^4.6.9", - "leaflet": "^1.7.1", - "tippy.js": "^6.3.1" + "flatpickr": "^4.6.13", + "leaflet": "^1.9.3", + "tippy.js": "^6.3.7" }, "optionalDependencies": { "vite-plugin-favicon2": "^1.1.4" diff --git a/post-deploy-craft3.sh b/post-deploy-craft3.sh index 46856a7e..729f64b2 100755 --- a/post-deploy-craft3.sh +++ b/post-deploy-craft3.sh @@ -42,10 +42,22 @@ executeCommand() { fi } +# TODO enable this if this project is deployed on a KU Leuven Server +# +# SERVER_OWNER="stories" # Change this! +# SERVER_PATH="stories.kuleuven.be" # Change this! +# +# executeCommand "sudo chown --recursive $SERVER_OWNER:$SERVER_OWNER /www/virtualhosts/$SERVER_PATH/apps/$ENVIRONMENT/config/" +# executeCommand "sudo chmod -R 777 /www/virtualhosts/$SERVER_PATH/apps/$ENVIRONMENT/config/project/" +# executeCommand "sudo chmod -R 777 /www/virtualhosts/$SERVER_PATH/apps/$ENVIRONMENT/public/cache/" +# executeCommand "sudo chmod -R 777 /www/virtualhosts/$SERVER_PATH/apps/$ENVIRONMENT/storage/logs/" +# executeCommand "sudo chmod -R 777 /www/virtualhosts/$SERVER_PATH/apps/$ENVIRONMENT/storage/runtime/" + executeCommand "composer install --no-dev" "Installing composer requirements..." executeCommand "chmod +x ./craft" executeCommand "./craft migrate/all" executeCommand "./craft project-config/apply" +executeCommand "./craft clear-caches/all" FILE="config/htaccess-$ENVIRONMENT" if [ -f $FILE ]; then @@ -64,4 +76,4 @@ fi executeCommand "yarn install --ignore-optional" executeCommand "yarn run prod" -echo "Done" \ No newline at end of file +echo "Done" diff --git a/public/favicon/site/dummy.e4de97fb.js b/public/favicon/site/dummy-4ed993c7.js similarity index 100% rename from public/favicon/site/dummy.e4de97fb.js rename to public/favicon/site/dummy-4ed993c7.js diff --git a/public/favicon/site/manifest.json b/public/favicon/site/manifest.json index bb9454db..f81bd0d4 100644 --- a/public/favicon/site/manifest.json +++ b/public/favicon/site/manifest.json @@ -1,7 +1,7 @@ { "dummy.js": { - "file": "dummy.e4de97fb.js", - "src": "dummy.js", - "isEntry": true + "file": "dummy-4ed993c7.js", + "isEntry": true, + "src": "dummy.js" } } \ No newline at end of file diff --git a/public/index.php b/public/index.php index 611da626..774c24f6 100644 --- a/public/index.php +++ b/public/index.php @@ -3,21 +3,10 @@ * Craft web bootstrap file */ -// Set path constants -use Dotenv\Dotenv; - -define('CRAFT_BASE_PATH', dirname(__DIR__)); -define('CRAFT_VENDOR_PATH', CRAFT_BASE_PATH.'/vendor'); - -// Load Composer's autoloader -require_once CRAFT_VENDOR_PATH.'/autoload.php'; - -// Load dotenv? -if (file_exists(CRAFT_BASE_PATH.'/.env')) { - (Dotenv::create(CRAFT_BASE_PATH))->load(); -} +// Load shared bootstrap +require dirname(__DIR__) . '/bootstrap.php'; // Load and run Craft -define('CRAFT_ENVIRONMENT', getenv('ENVIRONMENT') ?: 'production'); -$app = require CRAFT_VENDOR_PATH.'/craftcms/cms/bootstrap/web.php'; +/** @var craft\web\Application $app */ +$app = require CRAFT_VENDOR_PATH . '/craftcms/cms/bootstrap/web.php'; $app->run(); diff --git a/tailoff/css/site/components/autocomplete.css b/tailoff/css/site/components/autocomplete.css index bd1dc0da..f283358b 100644 --- a/tailoff/css/site/components/autocomplete.css +++ b/tailoff/css/site/components/autocomplete.css @@ -12,7 +12,8 @@ top: 100%; z-index: 999; max-width: max-content; - width: 90vw; + width: 100%; + min-width: 100%; @apply bg-white shadow-xl; } diff --git a/tailoff/css/site/components/chip.css b/tailoff/css/site/components/chip.css index 4d090d8b..5cd8d34a 100644 --- a/tailoff/css/site/components/chip.css +++ b/tailoff/css/site/components/chip.css @@ -30,7 +30,7 @@ } &__modal { - @apply absolute top-0 left-0 z-10 p-6 bg-white shadow; + @apply fixed top-0 left-0 z-10 p-6 bg-white shadow; max-width: max-content; width: 90vw; } diff --git a/tailoff/css/site/components/cookie.css b/tailoff/css/site/components/cookie.css index 5818d655..b16d95e4 100644 --- a/tailoff/css/site/components/cookie.css +++ b/tailoff/css/site/components/cookie.css @@ -1,70 +1,51 @@ .cookiebanner { - @apply fixed w-full px-4 text-base z-100 sm:max-w-md top-1/2 left-1/2; - transform: translate(-50%, -50%); - h1 { - @apply text-2xl leading-tight sm:text-3xl; } &__content { - @apply p-6 bg-white rounded-lg shadow-md; } &__notice { - @apply mt-2; } &__actions { - @apply mt-5; } &__essentials, &__settings { - @apply block mt-2 underline hover:no-underline; + } + + &__essentials { } } .cookie-modal { - @apply fixed w-full max-h-screen px-4 overflow-y-auto z-100 sm:max-w-modal top-1/2 left-1/2; - transform: translate(-50%, -50%); h1 { - @apply mb-1 text-xl sm:text-2xl; } h2 { - @apply mt-4 mb-1 text-lg; } &__content { - @apply p-6 text-base bg-white rounded-lg shadow-md; } &__close-action { - @mixin icon clear; - @apply absolute top-0 right-0 mt-6 mr-8; } &__checks { - @apply flex items-center text-lg font-bold; - input { - @apply mr-4; } } &__description { - @apply ml-8; } &__options { - @apply mb-4; } &__actions { - @apply mt-4 text-center; } } .cookie-overlay { - @apply fixed inset-0 bg-black opacity-50 z-99; } diff --git a/tailoff/css/site/components/form.css b/tailoff/css/site/components/form.css index 78b733e7..29f1a622 100644 --- a/tailoff/css/site/components/form.css +++ b/tailoff/css/site/components/form.css @@ -29,7 +29,12 @@ select.fui-error, @apply text-red-700; } -.fui-checkbox, +input[type='checkbox'], +input[type='radio'] { + @apply accent-primary; +} + +/* .fui-checkbox, .form__custom-checkbox { > input, > input.fui-input { @@ -104,7 +109,7 @@ select.fui-error, transform: translateZ(0); } } -} +} */ .fui-type-dropdown .fui-input-container, .fui-select-container, @@ -137,14 +142,42 @@ form { } } +.strength-indicator-wrapper { + @apply relative h-2 my-1 rounded border-1 border-black/20; + + .strength-indicator { + @apply w-0 h-full transition-all duration-300 ease-in-out bg-red-200; + &.weak { + @apply bg-red-500; + } + &.medium { + @apply bg-orange-500; + } + &.strong { + @apply bg-yellow-500; + } + &.very-strong { + @apply bg-green-500; + } + } +} + +.strength-indicator-text { + @apply text-xs text-black/50; +} + /* Formie */ .fui-required { @apply hidden; } +.fui-page-row { + @apply mb-4; +} + .fui-row { - @apply mb-4 -mx-2; + @apply -mx-2; > div { @apply flex-auto w-full px-2 mb-4; @@ -230,20 +263,10 @@ html[lang='en'] .fui-field:not(.fui-field-required) { } .fui-submit { - @apply inline-flex items-center px-4 py-2 leading-none border-2 rounded-none; - @apply text-white no-underline bg-primary border-primary; - - &:hover { - @apply text-white no-underline bg-primary-hover border-primary-hover; - } - - @mixin icon chevron-right; - - &::after { - @apply flex-shrink-0 ml-1; - } + @apply btn btn--primary btn--ext; +} - &:hover::after { - transform: translateX(50%); - } +.fui-alert.fui-alert-error { + @apply bg-red-100 border-1 border-red-700 text-red-700 p-4 my-4; } + diff --git a/tailoff/css/site/components/link.css b/tailoff/css/site/components/link.css index acbb3c36..1d771301 100644 --- a/tailoff/css/site/components/link.css +++ b/tailoff/css/site/components/link.css @@ -22,6 +22,7 @@ right: 0; bottom: 0; left: 0; + z-index: 1; } } } diff --git a/tailoff/css/site/main.css b/tailoff/css/site/main.css index cb2ef871..c1134cbb 100644 --- a/tailoff/css/site/main.css +++ b/tailoff/css/site/main.css @@ -39,6 +39,7 @@ @import './utilities/accessibility.css'; @import './utilities/embed-container.css'; +@import './utilities/hover-underline.css'; @import './utilities/missing.css'; @import './utilities/weight-hover.css'; @config "./tailwind.config.js"; diff --git a/tailoff/css/site/tailwind.config.js b/tailoff/css/site/tailwind.config.js index 69a14d93..f7820564 100644 --- a/tailoff/css/site/tailwind.config.js +++ b/tailoff/css/site/tailwind.config.js @@ -19,7 +19,7 @@ const siteColors = { }; module.exports = { - content: [`tailoff/js/**/*.{ts,js}`, `templates/_site/**/*`, `templates/jsPlugins/**/*`], + content: [`tailoff/js/**/*.{ts,js}`, `templates/_site/**/*`, `templates/jsPlugins/**/*`, `vendor/statikbe/craft-cookie-banner/src/**/*`], theme: { borderWidth: { DEFAULT: '1px', diff --git a/tailoff/css/site/utilities/hover-underline.css b/tailoff/css/site/utilities/hover-underline.css new file mode 100644 index 00000000..075fd998 --- /dev/null +++ b/tailoff/css/site/utilities/hover-underline.css @@ -0,0 +1,31 @@ +.hover-underline { + @apply underline decoration-transparent; + &:hover, + .group:hover & { + text-decoration-color: currentColor; + } +} + +@supports (background: paint(something)) { + .hover-underline { + text-decoration: underline 0.08em transparent; + transition: text-decoration-color 300ms; + } +} + +.hover-nounderline { + @apply underline; + text-decoration-color: currentColor; + + &:hover, + .group:hover & { + text-decoration-color: transparent; + } +} + +@supports (background: paint(something)) { + .hover-nounderline { + text-decoration: underline 0.05em currentColor; + transition: text-decoration-color 300ms; + } +} diff --git a/tailoff/icons/alarm.svg b/tailoff/icons/alarm.svg index b9eb2e27..6c668d18 100644 --- a/tailoff/icons/alarm.svg +++ b/tailoff/icons/alarm.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/tailoff/icons/pencil.svg b/tailoff/icons/pencil.svg new file mode 100644 index 00000000..56a629fd --- /dev/null +++ b/tailoff/icons/pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tailoff/icons/play-arrow.svg b/tailoff/icons/play-arrow.svg index db5042bb..ca8bffa3 100644 --- a/tailoff/icons/play-arrow.svg +++ b/tailoff/icons/play-arrow.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/tailoff/js/components/ajaxSearch.component.ts b/tailoff/js/components/ajaxSearch.component.ts index db12f673..6ee975dc 100644 --- a/tailoff/js/components/ajaxSearch.component.ts +++ b/tailoff/js/components/ajaxSearch.component.ts @@ -5,6 +5,7 @@ import { Ajax } from '../utils/ajax'; import { DOMHelper } from '../utils/domHelper'; import { SiteLang } from '../utils/site-lang'; import { Formatter } from '../utils/formater'; +import { computePosition, flip } from '@floating-ui/dom'; export class AjaxSearchComponent { constructor() { @@ -30,8 +31,9 @@ export class AjaxSearchComponent { class AjaxSearch { private siteLang = SiteLang.getLang(); - // private lang = require(`../i18n/s-ajax-search-${this.siteLang}.json`); - private lang = import(`../i18n/s-ajax-search-${this.siteLang}.json`).then((module) => module.default); + private lang; + + private xhr: XMLHttpRequest; private ajaxSearchElement: HTMLDivElement; private inputElement: HTMLInputElement; @@ -44,9 +46,17 @@ class AjaxSearch { private dataArray = ''; private resultTemplate = ''; private noresultTemplate = ''; + private groupTemplate = ''; private typedTextTemplate = ''; - private noresultText = this.lang.nothingFound; + private noresultText = ''; private noTypedOption = false; + private destinationInput: HTMLInputElement; + private ajaxLoadResults = false; + private scrollToResults = true; + private xhrResults: XMLHttpRequest; + private loaderAnimationElement: HTMLElement; // .js-search-loader + private resultsElement: HTMLElement; // .js-search-results + private minimumCharacters = 1; private autocompleteInputWrapper: HTMLDivElement; private ajaxSearchListElement: HTMLUListElement; @@ -59,6 +69,7 @@ class AjaxSearch { private hoverOption: HTMLElement; private isDisabled = false; + private inDebounce; private keys = { esc: 27, @@ -74,6 +85,10 @@ class AjaxSearch { }; constructor(input: HTMLInputElement, index) { + this.getLang().then(() => { + this.noresultText = this.lang.nothingFound; + }); + this.inputElement = input; this.ajaxURL = this.inputElement.getAttribute('data-s-ajax-search'); this.searchCallback = this.inputElement.getAttribute('data-s-ajax-search-callback'); @@ -102,6 +117,11 @@ class AjaxSearch { this.resultTemplate = template != null ? template.innerHTML : ''; } + if (this.inputElement.getAttribute('data-s-ajax-search-group-template') != null) { + const template = document.getElementById(this.inputElement.getAttribute('data-s-ajax-search-group-template')); + this.groupTemplate = template != null ? template.innerHTML : ''; + } + if (this.inputElement.getAttribute('data-s-ajax-search-typed-text-template') != null) { const template = document.getElementById( this.inputElement.getAttribute('data-s-ajax-search-typed-text-template') @@ -120,6 +140,17 @@ class AjaxSearch { this.noTypedOption = this.inputElement.getAttribute('data-s-ajax-search-no-typed-option') ? true : false; } + if (this.inputElement.getAttribute('data-s-ajax-search-destination-input') != null) { + this.destinationInput = document.querySelector( + `input[name="${this.inputElement.getAttribute('data-s-ajax-search-destination-input')}"]` + ) as HTMLInputElement; + } + + if (this.ajaxLoadResults) { + this.resultsElement = document.querySelector('.js-search-results'); + this.loaderAnimationElement = document.querySelector('.js-search-loader'); + } + this.dataArray = this.inputElement.getAttribute('data-s-ajax-search-data'); this.inputElement.removeAttribute('data-s-ajax-search'); @@ -177,6 +208,10 @@ class AjaxSearch { } } + private async getLang() { + this.lang = await import(`../i18n/s-ajax-search-${this.siteLang}.json`); + } + private onKeyUp(e) { switch (e.keyCode) { case this.keys.left: @@ -189,11 +224,19 @@ class AjaxSearch { break; case this.keys.enter: e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); if (this.hoverOption) { const link = this.hoverOption.querySelector('a'); if (link) { link.click(); } + if (this.destinationInput) { + this.destinationInput.value = this.hoverOption.getAttribute('data-value'); + this.destinationInput.dispatchEvent(new Event('jschange')); + this.inputElement.value = this.hoverOption.innerText.trim(); + this.hideMenu(); + } } break; case this.keys.up: @@ -206,6 +249,8 @@ class AjaxSearch { } else { this.highlightOption(this.ajaxSearchListElement.lastChild as HTMLElement); } + } else { + this.highlightOption(this.ajaxSearchListElement.lastChild as HTMLElement); } break; case this.keys.down: @@ -227,7 +272,12 @@ class AjaxSearch { } break; default: - this.onTextBoxType(e); + if (this.inDebounce) { + clearInterval(this.inDebounce); + } + this.inDebounce = setTimeout(() => { + this.onTextBoxType(e); + }, 300); } } @@ -260,7 +310,7 @@ class AjaxSearch { private onTextBoxType(e) { // only show options if user typed something - if (this.inputElement.value.trim().length > 0) { + if (this.inputElement.value.trim().length >= this.minimumCharacters) { if (this.searchCallback) { if (window[this.searchCallback]) { window[this.searchCallback](this.inputElement.value.trim().toLowerCase()).then((data) => { @@ -272,6 +322,10 @@ class AjaxSearch { } } else { this.hideMenu(); + if (this.destinationInput) { + this.destinationInput.value = ''; + this.destinationInput.dispatchEvent(new Event('jschange')); + } } } @@ -285,6 +339,7 @@ class AjaxSearch { private showMenu() { this.ajaxSearchListElement.classList.remove('hidden'); this.inputElement.setAttribute('aria-expanded', 'true'); + this.positionMenu(); } private hideMenu() { @@ -293,8 +348,24 @@ class AjaxSearch { this.inputElement.removeAttribute('aria-activedescendant'); } + private positionMenu() { + const _self = this; + computePosition(this.autocompleteInputWrapper, this.ajaxSearchListElement, { + placement: 'bottom-start', + middleware: [flip()], + }).then(({ x, y }) => { + Object.assign(_self.ajaxSearchListElement.style, { + left: `${x}px`, + top: `${y}px`, + }); + }); + } + private getData(query: string, callback: Function = null) { - let xhr = null; + if (this.xhr) { + this.xhr.abort(); + } + let data = null; let url = this.ajaxURL; if (this.ajaxMethod == 'GET') { @@ -313,11 +384,11 @@ class AjaxSearch { data[this.ajaxQueryName] = query; } - xhr = Ajax.call({ + this.xhr = Ajax.call({ url: url, data: data, method: this.ajaxMethod, - xhr: xhr, + xhr: this.xhr, success: (data) => { if (!Array.isArray(data)) { data = [data]; @@ -326,6 +397,7 @@ class AjaxSearch { }, error: (e) => { console.error(e); + this.showData(null); }, }); } @@ -339,22 +411,22 @@ class AjaxSearch { } }); } - data.forEach((info) => { - const li = document.createElement('li'); - li.setAttribute('role', 'option'); - if (this.resultTemplate == '') { - li.innerText = info; - } else { - li.innerHTML = Formatter.parseTemplate(this.resultTemplate, info); - } - const link = li.querySelector('a'); - if (link) { - link.setAttribute('tabindex', '-1'); - } - this.ajaxSearchListElement.insertAdjacentElement('beforeend', li); - }); - this.updateStatus(data.length); - if (data.length == 0) { + + if (data) { + data.forEach((info) => { + if (info.group) { + this.addDataToList(info.group, this.groupTemplate); + info.data.forEach((linkData) => { + this.addDataToList(linkData, this.resultTemplate); + }); + } else { + this.addDataToList(info, this.resultTemplate); + } + }); + this.updateStatus(data.length); + } + + if (!data || data.length == 0) { const li = document.createElement('li'); li.setAttribute('role', 'option'); if (this.noresultTemplate == '') { @@ -383,6 +455,18 @@ class AjaxSearch { link.href = this.formElement.action + '?' + this.inputElement.name + '=' + this.inputElement.value.trim().toLowerCase(); link.insertAdjacentHTML('afterbegin', template); + if (this.ajaxLoadResults) { + link.addEventListener('click', (e) => { + e.preventDefault(); + this.getResultsData(link.href); + this.hideMenu(); + }); + this.formElement.addEventListener('submit', (e) => { + e.preventDefault(); + this.getResultsData(link.href); + this.hideMenu(); + }); + } li.insertAdjacentElement('afterbegin', link); this.ajaxSearchListElement.insertAdjacentElement('beforeend', li); } @@ -390,6 +474,37 @@ class AjaxSearch { this.showMenu(); } + private addDataToList(info, template) { + const li = document.createElement('li'); + li.setAttribute('role', 'option'); + if (template == '') { + li.innerText = info; + } else { + li.innerHTML = Formatter.parseTemplate(template, info); + } + const emptyElements = li.querySelectorAll('.js-remove-when-empty'); + Array.from(emptyElements).forEach((element) => { + if (element.textContent == '' || element.textContent.indexOf('%') >= 0) { + element.parentElement.removeChild(element); + } + }); + + const link = li.querySelector('a'); + if (link) { + link.setAttribute('tabindex', '-1'); + } + if (this.destinationInput) { + li.setAttribute('data-value', info[this.inputElement.getAttribute('data-s-ajax-search-destination-value')]); + li.addEventListener('click', (e) => { + this.destinationInput.value = info[this.inputElement.getAttribute('data-s-ajax-search-destination-value')]; + this.inputElement.value = li.innerText; + this.destinationInput.dispatchEvent(new Event('jschange')); + this.hideMenu(); + }); + } + this.ajaxSearchListElement.insertAdjacentElement('beforeend', li); + } + private updateStatus(nbr: number) { if (this.statusElement) { this.statusElement.innerText = `${nbr} ${this.lang.resultsAvailable}`; @@ -407,4 +522,58 @@ class AjaxSearch { } this.hoverOption = option; } + + private getResultsData(url) { + const _self = this; + if (this.xhrResults) { + this.xhrResults.abort(); + } + + this.xhrResults = new XMLHttpRequest(); + this.xhrResults.open('GET', url, true); + + this.showLoading(); + + this.xhrResults.onload = function () { + if (this.status >= 200 && this.status < 400) { + const responseElement = document.implementation.createHTMLDocument(''); + responseElement.body.innerHTML = this.response; + const resultsBlock = responseElement.querySelector('.js-search-results'); + + if (resultsBlock) { + _self.resultsElement.innerHTML = resultsBlock.innerHTML; + history.pushState('', 'New URL: ' + url, url); + _self.hideLoading(); + + if (_self.scrollToResults) { + ScrollHelper.scrollToY(_self.resultsElement, 500); + } + } else { + console.error('Could not find data on returned page.'); + } + } else { + console.error('Something went wrong when fetching data.'); + } + }; + + this.xhrResults.onerror = function () { + console.error('There was a connection error.'); + }; + + this.xhrResults.send(); + } + + private showLoading() { + if (this.loaderAnimationElement) { + this.loaderAnimationElement.classList.remove('hidden'); + this.resultsElement.classList.add('hidden'); + } + } + + private hideLoading() { + if (this.loaderAnimationElement) { + this.loaderAnimationElement.classList.add('hidden'); + this.resultsElement.classList.remove('hidden'); + } + } } diff --git a/tailoff/js/components/autocomplete.component.ts b/tailoff/js/components/autocomplete.component.ts index 240c7148..48408367 100644 --- a/tailoff/js/components/autocomplete.component.ts +++ b/tailoff/js/components/autocomplete.component.ts @@ -27,8 +27,7 @@ export class AutocompleteComponent { class Autocomplete { private siteLang = SiteLang.getLang(); - // private lang = require(`../i18n/s-autocomplete-${this.siteLang}.json`); - private lang = import(`../i18n/s-autocomplete-${this.siteLang}.json`).then((module) => module.default); + private lang; private autocompleteListIndex: number = 0; @@ -76,6 +75,7 @@ class Autocomplete { }; constructor(autocomplete: HTMLSelectElement, index) { + this.getLang(); this.autocompleteListIndex = index; this.selectElement = autocomplete; autocomplete.removeAttribute('data-s-autocomplete'); @@ -244,6 +244,10 @@ class Autocomplete { document.addEventListener('click', this.documentClickListener); } + private async getLang() { + this.lang = await import(`../i18n/s-autocomplete-${this.siteLang}.json`); + } + private selectMutation(mutationsList, observer) { for (let mutation of mutationsList) { if (mutation.type === 'childList') { diff --git a/tailoff/js/components/chip.component.ts b/tailoff/js/components/chip.component.ts index cdfdbaaf..e0b45427 100644 --- a/tailoff/js/components/chip.component.ts +++ b/tailoff/js/components/chip.component.ts @@ -1,6 +1,6 @@ import { A11yUtils } from '../utils/a11y'; import { SiteLang } from '../utils/site-lang'; -import { computePosition, flip, shift, size } from '@floating-ui/dom'; +import { computePosition, flip, shift, size, autoUpdate } from '@floating-ui/dom'; export class ChipComponent { constructor() { @@ -13,8 +13,7 @@ export class ChipComponent { class ChipElement { private siteLang = SiteLang.getLang(); - // private lang = require(`../i18n/s-chip-${this.siteLang}.json`); - private lang = import(`../i18n/s-chip-${this.siteLang}.json`).then((module) => module.default); + private lang; private element: HTMLElement; private triggerWrapperElement: HTMLDivElement; private triggerElement: HTMLButtonElement; @@ -26,6 +25,7 @@ class ChipElement { private bubbleElement: HTMLDivElement; private toggleListener; private changeListener; + private externalChangeListener; private clearListener; private escapeListener; private clickOutsideListener; @@ -66,21 +66,27 @@ class ChipElement { this.toggleListener = this.toggleAction.bind(this); this.changeListener = this.changeAction.bind(this); + this.externalChangeListener = this.externalChangeAction.bind(this); this.clearListener = this.clearAction.bind(this); this.escapeListener = this.escapeAction.bind(this); this.clickOutsideListener = this.clickOutsideAction.bind(this); this.name = element.getAttribute('data-s-chip'); - this.initComponents(); - this.initInputs(); - this.selected = this.getSelected(); - this.initTrigger(); - this.initModal(); + this.getLang().then(() => { + this.initComponents(); + this.initInputs(); + this.selected = this.getSelected(); + this.initTrigger(); + this.initModal(); + if (this.showBubble) { + this.setBubbleCount(); + } + }); + } - if (this.showBubble) { - this.setBubbleCount(); - } + private async getLang() { + this.lang = await import(`../i18n/s-chip-${this.siteLang}.json`); } private initComponents() { @@ -100,7 +106,7 @@ class ChipElement { this.triggerElement.classList.add('chip__trigger'); this.triggerTextElement = document.createElement('span'); this.triggerElement.insertAdjacentElement('beforeend', this.triggerTextElement); - this.triggerElement.addEventListener('jschange', this.clearListener); + this.triggerElement.addEventListener('jschange', this.externalChangeListener); this.triggerWrapperElement.insertAdjacentElement('beforeend', this.triggerElement); @@ -201,7 +207,6 @@ class ChipElement { document.addEventListener('click', this.clickOutsideListener); document.addEventListener('keydown', this.escapeListener); - window.addEventListener('resize', this.positionModal.bind(this)); this.positionModal(); } else { this.modalElement.classList.add('hidden'); @@ -222,24 +227,27 @@ class ChipElement { private positionModal() { const _self = this; - computePosition(this.triggerElement, this.modalElement, { - placement: 'bottom-start', - middleware: [ - flip(), - shift({ padding: 16 }), - size({ - apply({ availableWidth, availableHeight, elements }) { - // Do things with the data, e.g. - Object.assign(elements.floating.style, { - minWidth: `${Math.min(_self.modalMinWidth, availableWidth)}px`, - }); - }, - }), - ], - }).then(({ x, y }) => { - Object.assign(this.modalElement.style, { - left: `${x}px`, - top: `${y}px`, + autoUpdate(this.triggerElement, this.modalElement, () => { + computePosition(this.triggerElement, this.modalElement, { + strategy: 'fixed', + placement: 'bottom-start', + middleware: [ + flip(), + shift({ padding: 16 }), + size({ + apply({ availableWidth, availableHeight, elements }) { + // Do things with the data, e.g. + Object.assign(elements.floating.style, { + minWidth: `${Math.min(_self.modalMinWidth, availableWidth)}px`, + }); + }, + }), + ], + }).then(({ x, y }) => { + Object.assign(this.modalElement.style, { + left: `${x}px`, + top: `${y}px`, + }); }); }); } @@ -301,7 +309,7 @@ class ChipElement { } private setTriggerState() { - if (this.selected) { + if (this.selected && this.selected.length > 0) { this.element.classList.add('active'); if (this.showClearInButton) { this.triggerClearElement.classList.remove('hidden'); @@ -349,13 +357,29 @@ class ChipElement { } } + private externalChangeAction() { + if (this.getCount() === 0) { + this.selected = ''; + } else { + this.selected = this.getSelected(); + } + if (this.showBubble) { + this.setBubbleCount(); + } else { + this.setTriggerText(); + this.setTriggerLabel(); + } + this.setTriggerState(); + } + private clearAction(event) { + const changeEvent = new Event('jschange', { bubbles: true }); const checkedInputs = this.modalElement.querySelectorAll('input:checked'); Array.from(checkedInputs).forEach((input: HTMLInputElement) => { input.checked = false; + input.dispatchEvent(changeEvent); }); this.selected = ''; - const changeEvent = new Event('jschange', { bubbles: true }); const input = this.modalElement.querySelector('input'); input.dispatchEvent(changeEvent); diff --git a/tailoff/js/components/datepicker.component.ts b/tailoff/js/components/datepicker.component.ts index 8f8f0864..ffd7ee19 100644 --- a/tailoff/js/components/datepicker.component.ts +++ b/tailoff/js/components/datepicker.component.ts @@ -1,6 +1,8 @@ // import flatpickr from 'flatpickr'; import { DOMHelper } from '../utils/domHelper'; import { SiteLang } from '../utils/site-lang'; +// import { Dutch } from 'flatpickr/dist/l10n/nl.js'; +// import { French } from 'flatpickr/dist/l10n/fr.js'; const lang = SiteLang.getLang(); @@ -17,18 +19,15 @@ export class DatePickerComponent { } private async initDatePickers(pickers) { - // @ts-ignore const flatpickr = await import('flatpickr'); - switch (lang) { - case 'nl': - const Dutch = require('flatpickr/dist/l10n/nl.js').default.nl; - flatpickr.default.localize(Dutch); - break; - case 'fr': - const French = require('flatpickr/dist/l10n/fr.js').default.fr; - flatpickr.default.localize(French); - break; - } + // switch (lang) { + // case 'nl': + // flatpickr.default.localize(Dutch); + // break; + // case 'fr': + // flatpickr.default.localize(French); + // break; + // } Array.from(pickers).forEach((picker: HTMLElement) => { picker.classList.remove('js-time-picker'); flatpickr.default(picker, { diff --git a/tailoff/js/components/filter.component.ts b/tailoff/js/components/filter.component.ts index 1cacb7d8..a075698a 100644 --- a/tailoff/js/components/filter.component.ts +++ b/tailoff/js/components/filter.component.ts @@ -23,6 +23,7 @@ export class FilterComponent { private scrollToElement: HTMLElement; // .js-filter-scroll-position private showMoreOptionElements: Array; // .js-filter-show-more private paginationElement: HTMLElement; // .js-filter-pagination + private getFilterTimeout: NodeJS.Timeout; private xhr: XMLHttpRequest; private screenWidth; @@ -203,12 +204,14 @@ export class FilterComponent { } }); - if (isEmpty) { - if (!this.clearFilterButtonElement.hasAttribute('data-s-always-show')) { - this.clearFilterButtonElement.classList.add('hidden'); + if (this.clearFilterButtonElement) { + if (isEmpty) { + if (!this.clearFilterButtonElement.hasAttribute('data-s-always-show')) { + this.clearFilterButtonElement.classList.add('hidden'); + } + } else { + this.clearFilterButtonElement.classList.remove('hidden'); } - } else { - this.clearFilterButtonElement.classList.remove('hidden'); } } @@ -255,61 +258,67 @@ export class FilterComponent { } private getFilterData(url, clearPage = false) { - const _self = this; - if (this.xhr) { - this.xhr.abort(); + if (this.getFilterTimeout) { + clearTimeout(this.getFilterTimeout); } - // Scroll to the scrollToElement or loader. To prevent a weird footer show on windows. - this.scrollToStart(); + this.getFilterTimeout = setTimeout(() => { + const _self = this; + if (this.xhr) { + this.xhr.abort(); + } + + // Scroll to the scrollToElement or loader. To prevent a weird footer show on windows. + this.scrollToStart(); - // Go back to page 1 when set changes - if (clearPage) { - const regexResult = window.location.pathname.match(/([^\?\s]+\/)([p][0-9]{1,3}.?)(.*)/); + // Go back to page 1 when set changes + if (clearPage) { + const regexResult = window.location.pathname.match(/([^\?\s]+\/)([p][0-9]{1,3}.?)(.*)/); - if (regexResult && regexResult[1]) { - url = regexResult[1] + '?' + this.formElement.serialize(); + if (regexResult && regexResult[1]) { + url = regexResult[1] + '?' + this.formElement.serialize(); + } } - } - this.xhr = new XMLHttpRequest(); - this.xhr.open('GET', url, true); + this.xhr = new XMLHttpRequest(); + this.xhr.open('GET', url, true); - this.xhr.onload = function () { - if (this.status >= 200 && this.status < 400) { - const responseElement = document.implementation.createHTMLDocument(''); - responseElement.body.innerHTML = this.response; - const resultsBlock = responseElement.querySelector('.js-filter-results'); - if (resultsBlock) { - _self.resultsElement.innerHTML = resultsBlock.innerHTML; + this.xhr.onload = function () { + if (this.status >= 200 && this.status < 400) { + const responseElement = document.implementation.createHTMLDocument(''); + responseElement.body.innerHTML = this.response; + const resultsBlock = responseElement.querySelector('.js-filter-results'); + if (resultsBlock) { + _self.resultsElement.innerHTML = resultsBlock.innerHTML; - _self.ariaLiveElement.innerHTML = responseElement.querySelector('.js-filter-aria-live').innerHTML; + _self.ariaLiveElement.innerHTML = responseElement.querySelector('.js-filter-aria-live').innerHTML; - history.pushState('', 'New URL: ' + url, url); + history.pushState('', 'New URL: ' + url, url); - _self.scrollToStart(); + _self.scrollToStart(); + + _self.hideLoading(); + _self.styleClear(); + } else { + console.error('Could not find data on returned page.'); + } + const extraInfoBlock = responseElement.querySelector('.js-filter-extra-info'); + if (extraInfoBlock) { + _self.extraInfoElement.innerHTML = extraInfoBlock.innerHTML; + } - _self.hideLoading(); - _self.styleClear(); + _self.checkClearButtonStatus(); } else { - console.error('Could not find data on returned page.'); - } - const extraInfoBlock = responseElement.querySelector('.js-filter-extra-info'); - if (extraInfoBlock) { - _self.extraInfoElement.innerHTML = extraInfoBlock.innerHTML; + console.error('Something went wrong when fetching data.'); } + }; - _self.checkClearButtonStatus(); - } else { - console.error('Something went wrong when fetching data.'); - } - }; - - this.xhr.onerror = function () { - console.error('There was a connection error.'); - }; + this.xhr.onerror = function () { + console.error('There was a connection error.'); + }; - this.xhr.send(); + this.xhr.send(); + }, 100); } private scrollToStart() { @@ -369,6 +378,7 @@ export class FilterComponent { ) as HTMLInputElement; if (el) { el.checked = false; + this.clearElement(el); } else { const el = this.formElement.querySelector(`select[name='${element.name}']`) as HTMLSelectElement; if (el) { @@ -381,7 +391,7 @@ export class FilterComponent { } else { el.value = ''; } - el.dispatchEvent(this.jsChange); + this.clearElement(el); } } } else { @@ -389,6 +399,7 @@ export class FilterComponent { (this.formElement.querySelector(`input[name='${element.name}']`) as HTMLInputElement) ?? (this.formElement.querySelector(`select[name='${element.name}']`) as HTMLSelectElement); el.value = ''; + this.clearElement(el); } }); this.getFormAction(); @@ -399,6 +410,14 @@ export class FilterComponent { this.checkClearButtonStatus(); } + private clearElement(el: HTMLElement) { + el.dispatchEvent(this.jsChange); + const chipButton = el.nearest('button[aria-haspopup]'); + if (chipButton) { + chipButton.dispatchEvent(this.jsChange); + } + } + private styleClear() { if ( this.clearFilterButtonElement && @@ -490,6 +509,7 @@ export class FilterComponent { if (el.tagName === 'BUTTON' && el.hasAttribute('aria-haspopup')) { el.dispatchEvent(this.jsChange); } + this.clearElement(el as HTMLElement); }); this.styleClear(); diff --git a/tailoff/js/components/glide.component.ts b/tailoff/js/components/glide.component.ts index 0e07da00..fc1f0376 100644 --- a/tailoff/js/components/glide.component.ts +++ b/tailoff/js/components/glide.component.ts @@ -9,11 +9,11 @@ export class GlideComponent { } DOMHelper.onDynamicContent(document.documentElement, '.js-slider', (sliders) => { - this.processSliders(Array.from(sliders)); + this.processSliders(Array.from(sliders), true); }); } - private async processSliders(sliders: Array) { + private async processSliders(sliders: Array, ajaxLoaded?: boolean) { // @ts-ignore const Glide = await import('@glidejs/glide'); sliders.forEach((slider) => { @@ -36,8 +36,6 @@ export class GlideComponent { animationDuration: 800, gap: 20, peek: 100, - perTouch: 1, - perSwipe: 1, }); glide.on(['mount.after', 'resize'], function (e) { @@ -133,9 +131,13 @@ export class GlideComponent { } }); - window.addEventListener('load', function () { + if (ajaxLoaded) { glide.mount(); - }); + } else { + setTimeout(() => { + glide.mount(); + }, 0); + } } }); } diff --git a/tailoff/js/components/indeterminateChecks.component.ts b/tailoff/js/components/indeterminateChecks.component.ts index 584d875d..56579760 100644 --- a/tailoff/js/components/indeterminateChecks.component.ts +++ b/tailoff/js/components/indeterminateChecks.component.ts @@ -30,6 +30,7 @@ class IndeterminateChecks { private initCheckboxes() { Array.from(this.mainList.querySelectorAll('input[type=checkbox]')).forEach((checkbox: HTMLInputElement) => { checkbox.addEventListener('change', this.onCheckboxChange.bind(this)); + checkbox.addEventListener('jschange', this.onCheckboxChange.bind(this)); if (checkbox.checked) { this.checkUp(checkbox); } @@ -95,7 +96,7 @@ class IndeterminateChecks { } } - parentInput.dispatchEvent(this.jsChange); + // parentInput.dispatchEvent(this.jsChange); this.checkUp(parentInput); } @@ -106,7 +107,7 @@ class IndeterminateChecks { if (subList) { Array.from(subList.querySelectorAll('input[type=checkbox]')).forEach((input: HTMLInputElement) => { input.checked = check.checked; - input.dispatchEvent(this.jsChange); + // input.dispatchEvent(this.jsChange); }); } } diff --git a/tailoff/js/components/leaflet.component.ts b/tailoff/js/components/leaflet.component.ts index ff64a1f3..0352db5a 100644 --- a/tailoff/js/components/leaflet.component.ts +++ b/tailoff/js/components/leaflet.component.ts @@ -15,6 +15,16 @@ export class LeafletComponent { private async initMap(map: HTMLElement) { // @ts-ignore const leaflet = await import('leaflet/dist/leaflet.js'); + leaflet.Marker.prototype.options.icon = leaflet.icon({ + iconUrl: '/frontend/img/leaflet/marker-icon.png', + iconRetinaUrl: '/frontend/img/leaflet/marker-icon-2x.png', + shadowUrl: '/frontend/img/leaflet/marker-shadow.png', + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + tooltipAnchor: [16, -28], + shadowSize: [41, 41], + }); const lmap = leaflet.map(map, { // center: [data[0].locations[0].lat, data[0].locations[0].lng], zoom: 13, diff --git a/tailoff/js/components/masonry.component.ts b/tailoff/js/components/masonry.component.ts index 635ce4fa..377981ea 100644 --- a/tailoff/js/components/masonry.component.ts +++ b/tailoff/js/components/masonry.component.ts @@ -2,12 +2,6 @@ export class MasonryComponent { constructor() { if ('CSS' in window && CSS.supports('display', 'grid')) { this.initGridMasonry(); - } else { - /** - * Remove the code below when we decide not to support sucky browsers like IE11 - * And also remove all the related functions - */ - this.initFlexMasonry(); } } @@ -51,65 +45,4 @@ export class MasonryComponent { } } } - - private initFlexMasonry() { - window.addEventListener('load', this.rerenderFlexMasonry.bind(this)); - let timeoutDelay = null; - window.addEventListener('resize', () => { - clearTimeout(timeoutDelay); - timeoutDelay = setTimeout(() => { - this.rerenderFlexMasonry(); - }, 250); - }); - } - - private rerenderFlexMasonry() { - Array.from(document.querySelectorAll('.js-masonry')).forEach((masonry: HTMLElement) => { - masonry.style.height = null; - const items = Array.from(masonry.querySelectorAll('.js-masonry-item')); - items.forEach((item: HTMLElement) => { - item.style.height = null; - item.style.flexBasis = null; - }); - - const NrOfColumns = Math.round(masonry.offsetWidth / items[0].clientWidth); - const columns = Array.from(new Array(NrOfColumns)).map(() => { - return { - items: new Array(), - outerHeight: 0, - }; - }); - - items.forEach((item: HTMLElement) => { - const style = getComputedStyle(item); - item.style.height = `${ - parseInt(style.paddingTop) + - (item.querySelector('.js-masonry-content') as HTMLElement).offsetHeight + - parseInt(style.paddingBottom) - }px`; - - const minOuterHeight = Math.min(...columns.map((c) => c.outerHeight)); - const column = columns.find((c) => c.outerHeight == minOuterHeight); - column.items.push(item); - column.outerHeight += parseInt(item.style.height) + parseInt(style.paddingTop) + parseInt(style.paddingBottom); - }); - - const masonryHeight = Math.max(...columns.map((c) => c.outerHeight)); - - let order = 0; - columns.forEach((col) => { - col.items.forEach((item: HTMLElement) => { - item.style.order = `${order++}`; - }); - // set flex-basis of the last cell to fill the - // leftover space at the bottom of the column - // to prevent the first cell of the next column - // to be rendered at the bottom of this column - col.items[col.items.length - 1].style.flexBasis = - col.items[col.items.length - 1].offsetHeight + masonryHeight - col.outerHeight - 1 + 'px'; - }); - - masonry.style.height = masonryHeight + 1 + 'px'; - }); - } } diff --git a/tailoff/js/components/modal.component.ts b/tailoff/js/components/modal.component.ts index 94feb8d9..45e66041 100644 --- a/tailoff/js/components/modal.component.ts +++ b/tailoff/js/components/modal.component.ts @@ -6,7 +6,7 @@ import { ModalPlugin, ModalPluginConstructor } from '../plugins/modal/plugin.int export class ModalComponent { private siteLang = SiteLang.getLang(); // private lang = require(`../i18n/s-modal-${this.siteLang}.json`); - private lang = import(`../i18n/s-modal-${this.siteLang}.json`).then((module) => module.default); + private lang; private options = { closeHTML: ``, nextHTML: ``, @@ -40,6 +40,7 @@ export class ModalComponent { private startTouchY = 0; constructor(options: Object = {}) { + this.getLang(); this.options = { ...this.options, ...options }; this.mainContentBlock = document.getElementById('mainContentBlock'); @@ -67,6 +68,10 @@ export class ModalComponent { } } + private async getLang() { + this.lang = await import(`../i18n/s-modal-${this.siteLang}.json`); + } + private initTrigger(trigger: Element) { trigger.setAttribute('role', 'button'); trigger.addEventListener('click', (e) => { diff --git a/tailoff/js/components/pageFind.component.ts b/tailoff/js/components/pageFind.component.ts index 9a11c6e4..9b2715d4 100644 --- a/tailoff/js/components/pageFind.component.ts +++ b/tailoff/js/components/pageFind.component.ts @@ -191,6 +191,7 @@ export class PageFindComponent { private scrollToQuery(element: HTMLElement) { if (!element) return; const hiddenElement = this.isElementHidden(element); + if (hiddenElement) { let event; if (typeof Event === 'function') { @@ -199,6 +200,8 @@ export class PageFindComponent { event = document.createEvent('Event'); event.initEvent('show', true, true); } + console.log('trigger', hiddenElement); + hiddenElement.dispatchEvent(event); } @@ -220,7 +223,10 @@ export class PageFindComponent { private isElementHidden(element) { if (element) { - if (window.getComputedStyle(element).display === 'none') { + if ( + window.getComputedStyle(element).display === 'none' || + (element.hasAttribute('data-s-toggle') && !element.classList.contains('expanded')) + ) { return element; } else { if (element.parentElement) { diff --git a/tailoff/js/components/pullOut.component.ts b/tailoff/js/components/pullOut.component.ts index d1de47f0..e897f9b8 100644 --- a/tailoff/js/components/pullOut.component.ts +++ b/tailoff/js/components/pullOut.component.ts @@ -28,7 +28,7 @@ export class PullOutComponent { const query = JSON.parse(queryObject); let queryHit = null; query.forEach((q) => { - if (q.breakpoint < window.innerWidth) { + if (q.breakpoint <= window.innerWidth) { queryHit = q; } }); @@ -56,7 +56,7 @@ export class PullOutComponent { const paddingLeft = parseInt(window.getComputedStyle(block.parentElement, null).getPropertyValue('padding-left')); const paddingRight = parseInt(window.getComputedStyle(block.parentElement, null).getPropertyValue('padding-right')); - if (window.innerWidth > breakpoint) { + if (window.innerWidth >= breakpoint) { block.style.marginLeft = ''; block.style.marginRight = ''; block.style.width = ''; diff --git a/tailoff/js/components/rangeSlider.component.ts b/tailoff/js/components/rangeSlider.component.ts index 11300863..85c46a0b 100644 --- a/tailoff/js/components/rangeSlider.component.ts +++ b/tailoff/js/components/rangeSlider.component.ts @@ -20,7 +20,7 @@ export class RangeSliderComponent { export class RangeSlider { private siteLang = SiteLang.getLang(); // private lang = require(`../i18n/s-range-slider-${this.siteLang}.json`); - private lang = import(`../i18n/s-range-slider-${this.siteLang}.json`).then((module) => module.default); + private lang; private minValue: number; private maxValue: number; @@ -58,6 +58,12 @@ export class RangeSlider { private jsChange; constructor(el: HTMLElement) { + this.getLang().then(() => { + this.initRangeSlider(el); + }); + } + + private initRangeSlider(el: HTMLElement) { el.classList.remove('js-range-slider'); this.slider = el; this.minValue = parseInt(this.slider.getAttribute('data-slider-min')); @@ -200,6 +206,10 @@ export class RangeSlider { } } + private async getLang() { + this.lang = await import(`../i18n/s-range-slider-${this.siteLang}.json`); + } + private setMinValuePosition() { const ratio = (this.minStartValue - this.minValue) / (this.maxValue - this.minValue); diff --git a/tailoff/js/components/scrollParallax.component.ts b/tailoff/js/components/scrollParallax.component.ts index 75fbc984..f809d29b 100644 --- a/tailoff/js/components/scrollParallax.component.ts +++ b/tailoff/js/components/scrollParallax.component.ts @@ -60,6 +60,7 @@ class ScrollParallaxElement { private bgImageHeight: number; private isPixelUnit = false; private elementAnimation = null; + private coords = { top: 0, left: 0 }; constructor(el: HTMLElement) { this.parallaxElement = el; @@ -201,6 +202,8 @@ class ScrollParallaxElement { } } } + + this.coords = this.getCoords(this.container); } private initBackgroundImage() { @@ -395,6 +398,7 @@ class ScrollParallaxElement { private moveElement() { const scrollPercentage = this.getScrollPercentage(); + if (this.elementAnimation) { this.elementAnimation.currentTime = Math.round(scrollPercentage * this.options.animationDuration); } else { @@ -489,13 +493,30 @@ class ScrollParallaxElement { private getScrollPercentage() { const containerRect = this.container.getBoundingClientRect(); - if (this.container.offsetTop < this.windowHeight) { - return Math.max( - (this.container.offsetTop - containerRect.top) / (this.container.offsetTop + containerRect.height), - 0 - ); + + if (this.coords.top < this.windowHeight) { + return Math.max((this.coords.top - containerRect.top) / (this.coords.top + containerRect.height), 0); } return Math.max((this.windowHeight - containerRect.top) / (this.windowHeight + containerRect.height), 0); } + + private getCoords(elem) { + // crossbrowser version + var box = elem.getBoundingClientRect(); + + var body = document.body; + var docEl = document.documentElement; + + var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop; + var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft; + + var clientTop = docEl.clientTop || body.clientTop || 0; + var clientLeft = docEl.clientLeft || body.clientLeft || 0; + + var top = box.top + scrollTop - clientTop; + var left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + } } diff --git a/tailoff/js/components/stickyHeader.component.ts b/tailoff/js/components/stickyHeader.component.ts index 08650885..ea712910 100644 --- a/tailoff/js/components/stickyHeader.component.ts +++ b/tailoff/js/components/stickyHeader.component.ts @@ -7,72 +7,65 @@ export class StickyHeader { private dropInPlace = false; constructor() { - this.body = document.getElementsByTagName("BODY")[0] as HTMLBodyElement; - this.header = document.querySelector("[data-s-sticky-header]"); + this.body = document.getElementsByTagName('BODY')[0] as HTMLBodyElement; + this.header = document.querySelector('[data-s-sticky-header]'); if (this.header) { this.onlyShowOnScrollUp = - this.header.getAttribute("data-only-show-on-scroll-up") !== null && - this.header.getAttribute("data-only-show-on-scroll-up") !== "false"; + this.header.getAttribute('data-only-show-on-scroll-up') !== null && + this.header.getAttribute('data-only-show-on-scroll-up') !== 'false'; this.dropInPlace = - this.header.getAttribute("data-drop-in-place") !== null && - this.header.getAttribute("data-drop-in-place") !== "false"; + this.header.getAttribute('data-drop-in-place') !== null && + this.header.getAttribute('data-drop-in-place') !== 'false'; this.headerHeight = this.header.clientHeight; if (!this.onlyShowOnScrollUp) { - this.header.classList.add("fixed-sticky-header"); - this.body.style.paddingTop = `${this.headerHeight}px`; + this.header.classList.add('fixed-sticky-header'); + this.header.parentElement.style.paddingTop = `${this.headerHeight}px`; } - document.addEventListener("scroll", this.onPageScroll.bind(this)); + document.addEventListener('scroll', this.onPageScroll.bind(this)); } } private onPageScroll(e) { const top = window.pageYOffset || document.documentElement.scrollTop; if (this.onlyShowOnScrollUp) { - if ( - top > this.headerHeight && - !this.body.classList.contains("header-out-of-view") - ) { - this.header.classList.add("invisible"); - this.body.classList.add("header-out-of-view"); - this.body.style.paddingTop = `${this.headerHeight}px`; + if (top > this.headerHeight && !this.body.classList.contains('header-out-of-view')) { + this.header.classList.add('invisible'); + this.body.classList.add('header-out-of-view'); + if (this.dropInPlace) { + this.header.parentElement.style.paddingTop = `${this.headerHeight}px`; + } } if ( - ((!this.dropInPlace && top <= this.headerHeight) || - (this.dropInPlace && top <= 0)) && - this.body.classList.contains("header-out-of-view") + ((!this.dropInPlace && top <= this.headerHeight) || (this.dropInPlace && top <= 0)) && + this.body.classList.contains('header-out-of-view') ) { - this.body.classList.remove("header-out-of-view"); - this.body.style.paddingTop = ""; + this.header.classList.remove('invisible'); + this.body.classList.remove('header-out-of-view'); + this.header.parentElement.style.paddingTop = ''; } if ( top > this.headerHeight && top < this.previousTopPosition && - !this.body.classList.contains("header-slide-in") + !this.body.classList.contains('header-slide-in') ) { - this.header.classList.remove("invisible"); - this.body.classList.add("header-slide-in"); + this.header.classList.remove('invisible'); + this.body.classList.add('header-slide-in'); } if ( top > this.headerHeight && top > this.previousTopPosition && - this.body.classList.contains("header-slide-in") + this.body.classList.contains('header-slide-in') ) { - this.body.classList.remove("header-slide-in"); + this.body.classList.remove('header-slide-in'); } } else { - if ( - top > this.headerHeight && - !this.body.classList.contains("header-out-of-view") - ) { - this.body.classList.add("header-out-of-view"); + if (top > this.headerHeight && !this.body.classList.contains('header-out-of-view')) { + this.body.classList.add('header-out-of-view'); } - if ( - top <= this.headerHeight && - this.body.classList.contains("header-out-of-view") - ) { - this.body.classList.remove("header-out-of-view"); + if (top <= this.headerHeight && this.body.classList.contains('header-out-of-view')) { + this.body.classList.remove('header-out-of-view'); } } diff --git a/tailoff/js/components/toggle.component.ts b/tailoff/js/components/toggle.component.ts index 156fe88d..5b33d190 100644 --- a/tailoff/js/components/toggle.component.ts +++ b/tailoff/js/components/toggle.component.ts @@ -71,6 +71,12 @@ export class ToggleComponent { trigger.addEventListener('open', () => { this.toggleAction(trigger, target, changeClass, animation); }); + + target.addEventListener('show', () => { + console.log('show'); + + this.toggleAction(trigger, target, changeClass, animation); + }); } private toggleAction(trigger, target, changeClass, animation) { @@ -103,6 +109,7 @@ export class ToggleComponent { } else { target.style.maxHeight = 'none'; target.classList.remove(changeClass); + target.classList.add('expanded'); } } } @@ -120,6 +127,7 @@ export class ToggleComponent { } const height = this.getHeight(el); // Get the natural height el.classList.remove(changeClass); // Make the element visible + el.classList.add('expanded'); el.style.maxHeight = height; // Update the max-height // Once the transition is complete, remove the inline max-height so the content can scale responsively @@ -146,6 +154,7 @@ export class ToggleComponent { // When the transition is complete, hide it window.setTimeout(function () { el.classList.add(changeClass); + el.classList.remove('expanded'); }, speed); } diff --git a/tailoff/js/components/tooltip.component.ts b/tailoff/js/components/tooltip.component.ts index 726b2883..6f477be9 100644 --- a/tailoff/js/components/tooltip.component.ts +++ b/tailoff/js/components/tooltip.component.ts @@ -2,7 +2,7 @@ import tippy from 'tippy.js'; export class TooltipComponent { constructor() { - if (document.querySelectorAll('[data-tippy-content]').length > 0) { + if (document.querySelectorAll('[data-tippy-content]').length > 0 || document.querySelectorAll('[data-tippy-template]').length > 0) { this.initTippy(); } } diff --git a/tailoff/js/components/validation.component.ts b/tailoff/js/components/validation.component.ts index fe8fae7c..e2410c5b 100644 --- a/tailoff/js/components/validation.component.ts +++ b/tailoff/js/components/validation.component.ts @@ -18,8 +18,7 @@ ElementPrototype.activateNearest(); export class ValidationComponent { private siteLang = SiteLang.getLang(); - // public lang = require(`../i18n/s-validation-${this.siteLang}.json`); - public lang = import(`../i18n/s-validation-${this.siteLang}.json`).then((module) => module.default); + public lang; private options = { errorClassFormElement: 'form__error', // The class to give the form element ex.: input, select @@ -34,26 +33,32 @@ export class ValidationComponent { }; constructor(options: Object = {}) { - this.options = { ...this.options, ...options }; + this.getLang().then(() => { + this.options = { ...this.options, ...options }; - const forms = document.querySelectorAll('[data-s-validate]'); - Array.from(forms).forEach((form, index) => { - form.setAttribute('novalidate', 'true'); - this.initFormElements(form, index); - this.initFormSubmit(form); - }); + const forms = document.querySelectorAll('[data-s-validate]'); + Array.from(forms).forEach((form, index) => { + form.setAttribute('novalidate', 'true'); + this.initFormElements(form, index); + this.initFormSubmit(form); + }); + + this.options.plugins.forEach( + (plugin: ValidationPluginConstructor | { plugin: ValidationPluginConstructor; options: {} }) => { + const p = typeof plugin == 'function' ? new plugin(this) : new plugin.plugin(this); + p.initElement(); + } + ); - this.options.plugins.forEach( - (plugin: ValidationPluginConstructor | { plugin: ValidationPluginConstructor; options: {} }) => { - const p = typeof plugin == 'function' ? new plugin(this) : new plugin.plugin(this); - p.initElement(); + const initialError = document.querySelector('.form__msg-error'); + if (initialError) { + ScrollHelper.scrollToY((initialError as HTMLObjectElement).parentElement, this.options.scrollSpeed); } - ); + }); + } - const initialError = document.querySelector('.form__msg-error'); - if (initialError) { - ScrollHelper.scrollToY((initialError as HTMLObjectElement).parentElement, this.options.scrollSpeed); - } + private async getLang() { + this.lang = await import(`../i18n/s-validation-${this.siteLang}.json`); } private initFormElements(el: Element, index: number) { diff --git a/tailoff/js/i18n/s-validation-en.json b/tailoff/js/i18n/s-validation-en.json index 3d4fac0e..882fc50d 100644 --- a/tailoff/js/i18n/s-validation-en.json +++ b/tailoff/js/i18n/s-validation-en.json @@ -17,5 +17,6 @@ "range": "This value should be between %s and %s.", "minlength": "This value is too short. It should have %s characters or more.", "maxlength": "This value is too long. It should have %s characters or fewer.", - "equalto": "This value should be the same." + "equalto": "This value should be the same.", + "strength": "The password needs to contain a minimum of %s characters. With a minimum of %s uppercase, %s numbers and %s special characters. And a maximum of %s characters." } diff --git a/tailoff/js/i18n/s-validation-fr.json b/tailoff/js/i18n/s-validation-fr.json index fd002789..2b1d4e71 100644 --- a/tailoff/js/i18n/s-validation-fr.json +++ b/tailoff/js/i18n/s-validation-fr.json @@ -17,5 +17,6 @@ "range": "Cette valeur doit être comprise entre %s et %s.", "minlength": "Cette valeur est trop courte. Il doit comporter au moins %s caractères ou plus.", "maxlength": "Cette valeur est trop longue. Il doit comporter %s caractères ou moins.", - "equalto": "Cette valeur doit être la même." + "equalto": "Cette valeur doit être la même.", + "strength": "Le mot de passe doit contenir un minimum de %s caractères. Avec un minimum de %s majuscules, %s chiffres et %s caractères spéciaux. Et un maximum de %s caractères." } diff --git a/tailoff/js/i18n/s-validation-nl.json b/tailoff/js/i18n/s-validation-nl.json index 3ecc212f..f83c333a 100644 --- a/tailoff/js/i18n/s-validation-nl.json +++ b/tailoff/js/i18n/s-validation-nl.json @@ -17,5 +17,6 @@ "range": "Deze waarde moet tussen %s en %s liggen.", "minlength": "Deze tekst is te kort. Deze moet uit minimaal %s karakters bestaan.", "maxlength": "Deze waarde is te lang. Deze mag maximaal %s karakters lang zijn.", - "equalto": "Deze waardes moeten identiek zijn." + "equalto": "Deze waardes moeten identiek zijn.", + "strength": "Het wachtwoord moet minimaal %s karakters bevatten, waarvan minimum %s hoofdletter, %s cijfer en %s speciaal teken. En maximaal %s karakters." } diff --git a/tailoff/js/plugins/validation/passwordStrength.plugin.ts b/tailoff/js/plugins/validation/passwordStrength.plugin.ts new file mode 100644 index 00000000..c039d786 --- /dev/null +++ b/tailoff/js/plugins/validation/passwordStrength.plugin.ts @@ -0,0 +1,144 @@ +import { ValidationPlugin } from './plugin.interface'; +import { ValidationComponent } from '../../components/validation.component'; +import { Formatter } from '../../utils/formater'; + +export class PasswordStrengthPlugin implements ValidationPlugin { + private validationComponent: ValidationComponent; + + private minLength = 16; + private maxLength = 160; + private cases = true; + private numbers = true; + private symbols = true; + private showStrengthIndicator = true; + private showStrengthIndicatorText = true; + private strengthIndicator; + private isValid = false; + + private passwordStrengthScore = 2; + + constructor(validationComponent: ValidationComponent) { + this.validationComponent = validationComponent; + } + + public initElement() { + const passwords = document.querySelectorAll('input[data-s-strength]'); + console.log(passwords); + + Array.from(passwords).forEach((password) => { + this.initPasswordStrength(password as HTMLInputElement); + }); + } + + private initPasswordStrength(password: HTMLInputElement) { + this.minLength = password.dataset.sMinLength ? parseInt(password.dataset.sMinLength, 10) : this.minLength; + this.maxLength = password.dataset.sMaxLength ? parseInt(password.dataset.sMaxLength, 10) : this.maxLength; + this.cases = password.dataset.sCases ? password.dataset.sCases === 'true' : this.cases; + this.numbers = password.dataset.sNumbers ? password.dataset.sNumbers === 'true' : this.numbers; + this.symbols = password.dataset.sSymbols ? password.dataset.sSymbols === 'true' : this.symbols; + this.showStrengthIndicator = password.dataset.sShowStrengthIndicator + ? password.dataset.sShowStrengthIndicator === 'true' + : this.showStrengthIndicator; + this.showStrengthIndicatorText = password.dataset.sShowStrengthIndicatorText + ? password.dataset.sShowStrengthIndicatorText === 'true' + : this.showStrengthIndicatorText; + + if (this.showStrengthIndicatorText) { + const strengthIndicatorText = document.createElement('div'); + strengthIndicatorText.classList.add('strength-indicator-text'); + strengthIndicatorText.innerHTML = Formatter.sprintf(this.validationComponent.lang.strength, { + min: this.minLength, + cases: this.cases ? '1' : '0', + numbers: this.numbers ? '1' : '0', + symbols: this.symbols ? '1' : '0', + max: this.maxLength, + }); + + password.parentNode.insertBefore(strengthIndicatorText, password.nextSibling); + } + if (this.showStrengthIndicator) { + this.strengthIndicator = document.createElement('div'); + this.strengthIndicator.classList.add('strength-indicator'); + + const strengthIndicatorWrapper = document.createElement('div'); + strengthIndicatorWrapper.classList.add('strength-indicator-wrapper'); + strengthIndicatorWrapper.appendChild(this.strengthIndicator); + password.parentNode.insertBefore(strengthIndicatorWrapper, password.nextSibling); + + this.passwordStrengthScore += (this.cases ? 1 : 0) + (this.numbers ? 1 : 0) + (this.symbols ? 1 : 0); + } + + password.addEventListener('invalid', (e) => { + e.preventDefault(); + this.validationComponent.checkValidation(e); + }); + + const checkStrength = (e) => { + const passwordValue = password.value; + + //test if value has at least one uppercase letter + const hasUpperCase = this.cases ? /[A-Z]/.test(passwordValue) : true; + //test if value has at least one number + const hasNumber = this.numbers ? /\d/.test(passwordValue) : true; + //test if value has at least one special character + const hasSpecial = this.symbols ? /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(passwordValue) : true; + const isLongEnough = passwordValue.length >= this.minLength; + const isShortEnough = passwordValue.length <= this.maxLength; + + if (this.showStrengthIndicator) { + const currentStrength = + (passwordValue.length > 0 ? 1 : 0) + + (hasUpperCase ? 1 : 0) + + (hasNumber ? 1 : 0) + + (hasSpecial ? 1 : 0) + + (isLongEnough ? 1 : 0); + const strengthPercentage = (currentStrength / this.passwordStrengthScore) * 100; + this.strengthIndicator.classList.remove('very-weak', 'weak', 'medium', 'strong', 'very-strong'); + this.isValid = false; + if (isShortEnough) { + this.strengthIndicator.style.width = strengthPercentage + '%'; + if (strengthPercentage <= 20) { + this.strengthIndicator.classList.add('very-weak'); + } else if (strengthPercentage <= 40) { + this.strengthIndicator.classList.add('weak'); + } else if (strengthPercentage <= 60) { + this.strengthIndicator.classList.add('medium'); + } else if (strengthPercentage <= 80) { + this.strengthIndicator.classList.add('strong'); + } else { + this.strengthIndicator.classList.add('very-strong'); + this.isValid = true; + } + } else { + this.strengthIndicator.style.width = '100%'; + this.strengthIndicator.classList.add('weak'); + } + } + }; + + const checkValidation = (e) => { + if (!this.isValid) { + if (this.showStrengthIndicatorText) { + password.setCustomValidity(this.validationComponent.lang.defaultMessage); + } else { + password.setCustomValidity( + Formatter.sprintf(this.validationComponent.lang.strength, { + min: this.minLength, + cases: this.cases ? '1' : '0', + numbers: this.numbers ? '1' : '0', + symbols: this.symbols ? '1' : '0', + max: this.maxLength, + }) + ); + } + password.reportValidity(); + } else { + password.setCustomValidity(''); + password.reportValidity(); + } + }; + + password.addEventListener('keyup', checkStrength); + password.addEventListener('change', checkValidation); + } +} diff --git a/tailoff/js/site.ts b/tailoff/js/site.ts index 0a63a57f..c7979c7d 100644 --- a/tailoff/js/site.ts +++ b/tailoff/js/site.ts @@ -130,8 +130,9 @@ import { ValidationComponent } from './components/validation.component'; import { CountdownPlugin } from './plugins/validation/countdown.plugin'; import { PasswordConfirmPlugin } from './plugins/validation/passwordConfirm.plugin'; import { CheckboxRangePlugin } from './plugins/validation/checkboxRange.plugin'; +import { PasswordStrengthPlugin } from './plugins/validation/passwordStrength.plugin'; new ValidationComponent({ - plugins: [CountdownPlugin, PasswordConfirmPlugin, CheckboxRangePlugin], + plugins: [CountdownPlugin, PasswordConfirmPlugin, CheckboxRangePlugin, PasswordStrengthPlugin], }); import { VideoBackgroundComponent } from './components/videoBackground.component'; diff --git a/tailoff/js/site2.ts b/tailoff/js/site2.ts index e9852478..ab47012b 100644 --- a/tailoff/js/site2.ts +++ b/tailoff/js/site2.ts @@ -130,8 +130,9 @@ import { ValidationComponent } from './components/validation.component'; import { CountdownPlugin } from './plugins/validation/countdown.plugin'; import { PasswordConfirmPlugin } from './plugins/validation/passwordConfirm.plugin'; import { CheckboxRangePlugin } from './plugins/validation/checkboxRange.plugin'; +import { PasswordStrengthPlugin } from './plugins/validation/passwordStrength.plugin'; new ValidationComponent({ - plugins: [CountdownPlugin, PasswordConfirmPlugin, CheckboxRangePlugin], + plugins: [CountdownPlugin, PasswordConfirmPlugin, CheckboxRangePlugin, PasswordStrengthPlugin], }); import { VideoBackgroundComponent } from './components/videoBackground.component'; diff --git a/tailoff/vite/vite-plugin-statik-copy/index.cjs b/tailoff/vite/vite-plugin-statik-copy/index.cjs new file mode 100644 index 00000000..5128f3db --- /dev/null +++ b/tailoff/vite/vite-plugin-statik-copy/index.cjs @@ -0,0 +1,1114 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/index.ts +var src_exports = {}; +__export(src_exports, { + viteStaticCopy: () => viteStaticCopy +}); +module.exports = __toCommonJS(src_exports); + +// src/options.ts +var resolveOptions = (options) => { + var _a, _b, _c; + return { + targets: options.targets, + flatten: options.flatten ?? true, + watch: { + options: ((_a = options.watch) == null ? void 0 : _a.options) ?? {}, + reloadPageOnChange: ((_b = options.watch) == null ? void 0 : _b.reloadPageOnChange) ?? false, + copyToDest: ((_c = options.watch) == null ? void 0 : _c.copyToDest) ?? false + } + }; +}; + +// node_modules/@polka/url/build.mjs +var qs = __toESM(require("querystring"), 1); +function parse2(req) { + let raw = req.url; + if (raw == null) + return; + let prev = req._parsedUrl; + if (prev && prev.raw === raw) + return prev; + let pathname = raw, search = "", query; + if (raw.length > 1) { + let idx = raw.indexOf("?", 1); + if (idx !== -1) { + search = raw.substring(idx); + pathname = raw.substring(0, idx); + if (search.length > 1) { + query = qs.parse(search.substring(1)); + } + } + } + return req._parsedUrl = { pathname, search, query, raw }; +} + +// node_modules/mrmime/index.mjs +var mimes = { + "ez": "application/andrew-inset", + "aw": "application/applixware", + "atom": "application/atom+xml", + "atomcat": "application/atomcat+xml", + "atomdeleted": "application/atomdeleted+xml", + "atomsvc": "application/atomsvc+xml", + "dwd": "application/atsc-dwd+xml", + "held": "application/atsc-held+xml", + "rsat": "application/atsc-rsat+xml", + "bdoc": "application/bdoc", + "xcs": "application/calendar+xml", + "ccxml": "application/ccxml+xml", + "cdfx": "application/cdfx+xml", + "cdmia": "application/cdmi-capability", + "cdmic": "application/cdmi-container", + "cdmid": "application/cdmi-domain", + "cdmio": "application/cdmi-object", + "cdmiq": "application/cdmi-queue", + "cu": "application/cu-seeme", + "mpd": "application/dash+xml", + "davmount": "application/davmount+xml", + "dbk": "application/docbook+xml", + "dssc": "application/dssc+der", + "xdssc": "application/dssc+xml", + "es": "application/ecmascript", + "ecma": "application/ecmascript", + "emma": "application/emma+xml", + "emotionml": "application/emotionml+xml", + "epub": "application/epub+zip", + "exi": "application/exi", + "fdt": "application/fdt+xml", + "pfr": "application/font-tdpfr", + "geojson": "application/geo+json", + "gml": "application/gml+xml", + "gpx": "application/gpx+xml", + "gxf": "application/gxf", + "gz": "application/gzip", + "hjson": "application/hjson", + "stk": "application/hyperstudio", + "ink": "application/inkml+xml", + "inkml": "application/inkml+xml", + "ipfix": "application/ipfix", + "its": "application/its+xml", + "jar": "application/java-archive", + "war": "application/java-archive", + "ear": "application/java-archive", + "ser": "application/java-serialized-object", + "class": "application/java-vm", + "js": "application/javascript", + "mjs": "application/javascript", + "json": "application/json", + "map": "application/json", + "json5": "application/json5", + "jsonml": "application/jsonml+json", + "jsonld": "application/ld+json", + "lgr": "application/lgr+xml", + "lostxml": "application/lost+xml", + "hqx": "application/mac-binhex40", + "cpt": "application/mac-compactpro", + "mads": "application/mads+xml", + "webmanifest": "application/manifest+json", + "mrc": "application/marc", + "mrcx": "application/marcxml+xml", + "ma": "application/mathematica", + "nb": "application/mathematica", + "mb": "application/mathematica", + "mathml": "application/mathml+xml", + "mbox": "application/mbox", + "mscml": "application/mediaservercontrol+xml", + "metalink": "application/metalink+xml", + "meta4": "application/metalink4+xml", + "mets": "application/mets+xml", + "maei": "application/mmt-aei+xml", + "musd": "application/mmt-usd+xml", + "mods": "application/mods+xml", + "m21": "application/mp21", + "mp21": "application/mp21", + "mp4s": "application/mp4", + "m4p": "application/mp4", + "doc": "application/msword", + "dot": "application/msword", + "mxf": "application/mxf", + "nq": "application/n-quads", + "nt": "application/n-triples", + "cjs": "application/node", + "bin": "application/octet-stream", + "dms": "application/octet-stream", + "lrf": "application/octet-stream", + "mar": "application/octet-stream", + "so": "application/octet-stream", + "dist": "application/octet-stream", + "distz": "application/octet-stream", + "pkg": "application/octet-stream", + "bpk": "application/octet-stream", + "dump": "application/octet-stream", + "elc": "application/octet-stream", + "deploy": "application/octet-stream", + "exe": "application/octet-stream", + "dll": "application/octet-stream", + "deb": "application/octet-stream", + "dmg": "application/octet-stream", + "iso": "application/octet-stream", + "img": "application/octet-stream", + "msi": "application/octet-stream", + "msp": "application/octet-stream", + "msm": "application/octet-stream", + "buffer": "application/octet-stream", + "oda": "application/oda", + "opf": "application/oebps-package+xml", + "ogx": "application/ogg", + "omdoc": "application/omdoc+xml", + "onetoc": "application/onenote", + "onetoc2": "application/onenote", + "onetmp": "application/onenote", + "onepkg": "application/onenote", + "oxps": "application/oxps", + "relo": "application/p2p-overlay+xml", + "xer": "application/patch-ops-error+xml", + "pdf": "application/pdf", + "pgp": "application/pgp-encrypted", + "asc": "application/pgp-signature", + "sig": "application/pgp-signature", + "prf": "application/pics-rules", + "p10": "application/pkcs10", + "p7m": "application/pkcs7-mime", + "p7c": "application/pkcs7-mime", + "p7s": "application/pkcs7-signature", + "p8": "application/pkcs8", + "ac": "application/pkix-attr-cert", + "cer": "application/pkix-cert", + "crl": "application/pkix-crl", + "pkipath": "application/pkix-pkipath", + "pki": "application/pkixcmp", + "pls": "application/pls+xml", + "ai": "application/postscript", + "eps": "application/postscript", + "ps": "application/postscript", + "provx": "application/provenance+xml", + "cww": "application/prs.cww", + "pskcxml": "application/pskc+xml", + "raml": "application/raml+yaml", + "rdf": "application/rdf+xml", + "owl": "application/rdf+xml", + "rif": "application/reginfo+xml", + "rnc": "application/relax-ng-compact-syntax", + "rl": "application/resource-lists+xml", + "rld": "application/resource-lists-diff+xml", + "rs": "application/rls-services+xml", + "rapd": "application/route-apd+xml", + "sls": "application/route-s-tsid+xml", + "rusd": "application/route-usd+xml", + "gbr": "application/rpki-ghostbusters", + "mft": "application/rpki-manifest", + "roa": "application/rpki-roa", + "rsd": "application/rsd+xml", + "rss": "application/rss+xml", + "rtf": "application/rtf", + "sbml": "application/sbml+xml", + "scq": "application/scvp-cv-request", + "scs": "application/scvp-cv-response", + "spq": "application/scvp-vp-request", + "spp": "application/scvp-vp-response", + "sdp": "application/sdp", + "senmlx": "application/senml+xml", + "sensmlx": "application/sensml+xml", + "setpay": "application/set-payment-initiation", + "setreg": "application/set-registration-initiation", + "shf": "application/shf+xml", + "siv": "application/sieve", + "sieve": "application/sieve", + "smi": "application/smil+xml", + "smil": "application/smil+xml", + "rq": "application/sparql-query", + "srx": "application/sparql-results+xml", + "gram": "application/srgs", + "grxml": "application/srgs+xml", + "sru": "application/sru+xml", + "ssdl": "application/ssdl+xml", + "ssml": "application/ssml+xml", + "swidtag": "application/swid+xml", + "tei": "application/tei+xml", + "teicorpus": "application/tei+xml", + "tfi": "application/thraud+xml", + "tsd": "application/timestamped-data", + "toml": "application/toml", + "trig": "application/trig", + "ttml": "application/ttml+xml", + "ubj": "application/ubjson", + "rsheet": "application/urc-ressheet+xml", + "td": "application/urc-targetdesc+xml", + "vxml": "application/voicexml+xml", + "wasm": "application/wasm", + "wgt": "application/widget", + "hlp": "application/winhlp", + "wsdl": "application/wsdl+xml", + "wspolicy": "application/wspolicy+xml", + "xaml": "application/xaml+xml", + "xav": "application/xcap-att+xml", + "xca": "application/xcap-caps+xml", + "xdf": "application/xcap-diff+xml", + "xel": "application/xcap-el+xml", + "xns": "application/xcap-ns+xml", + "xenc": "application/xenc+xml", + "xhtml": "application/xhtml+xml", + "xht": "application/xhtml+xml", + "xlf": "application/xliff+xml", + "xml": "application/xml", + "xsl": "application/xml", + "xsd": "application/xml", + "rng": "application/xml", + "dtd": "application/xml-dtd", + "xop": "application/xop+xml", + "xpl": "application/xproc+xml", + "xslt": "application/xml", + "xspf": "application/xspf+xml", + "mxml": "application/xv+xml", + "xhvml": "application/xv+xml", + "xvml": "application/xv+xml", + "xvm": "application/xv+xml", + "yang": "application/yang", + "yin": "application/yin+xml", + "zip": "application/zip", + "3gpp": "video/3gpp", + "adp": "audio/adpcm", + "amr": "audio/amr", + "au": "audio/basic", + "snd": "audio/basic", + "mid": "audio/midi", + "midi": "audio/midi", + "kar": "audio/midi", + "rmi": "audio/midi", + "mxmf": "audio/mobile-xmf", + "mp3": "audio/mpeg", + "m4a": "audio/mp4", + "mp4a": "audio/mp4", + "mpga": "audio/mpeg", + "mp2": "audio/mpeg", + "mp2a": "audio/mpeg", + "m2a": "audio/mpeg", + "m3a": "audio/mpeg", + "oga": "audio/ogg", + "ogg": "audio/ogg", + "spx": "audio/ogg", + "opus": "audio/ogg", + "s3m": "audio/s3m", + "sil": "audio/silk", + "wav": "audio/wav", + "weba": "audio/webm", + "xm": "audio/xm", + "ttc": "font/collection", + "otf": "font/otf", + "ttf": "font/ttf", + "woff": "font/woff", + "woff2": "font/woff2", + "exr": "image/aces", + "apng": "image/apng", + "avif": "image/avif", + "bmp": "image/bmp", + "cgm": "image/cgm", + "drle": "image/dicom-rle", + "emf": "image/emf", + "fits": "image/fits", + "g3": "image/g3fax", + "gif": "image/gif", + "heic": "image/heic", + "heics": "image/heic-sequence", + "heif": "image/heif", + "heifs": "image/heif-sequence", + "hej2": "image/hej2k", + "hsj2": "image/hsj2", + "ief": "image/ief", + "jls": "image/jls", + "jp2": "image/jp2", + "jpg2": "image/jp2", + "jpeg": "image/jpeg", + "jpg": "image/jpeg", + "jpe": "image/jpeg", + "jph": "image/jph", + "jhc": "image/jphc", + "jpm": "image/jpm", + "jpx": "image/jpx", + "jpf": "image/jpx", + "jxr": "image/jxr", + "jxra": "image/jxra", + "jxrs": "image/jxrs", + "jxs": "image/jxs", + "jxsc": "image/jxsc", + "jxsi": "image/jxsi", + "jxss": "image/jxss", + "ktx": "image/ktx", + "ktx2": "image/ktx2", + "png": "image/png", + "btif": "image/prs.btif", + "pti": "image/prs.pti", + "sgi": "image/sgi", + "svg": "image/svg+xml", + "svgz": "image/svg+xml", + "t38": "image/t38", + "tif": "image/tiff", + "tiff": "image/tiff", + "tfx": "image/tiff-fx", + "webp": "image/webp", + "wmf": "image/wmf", + "disposition-notification": "message/disposition-notification", + "u8msg": "message/global", + "u8dsn": "message/global-delivery-status", + "u8mdn": "message/global-disposition-notification", + "u8hdr": "message/global-headers", + "eml": "message/rfc822", + "mime": "message/rfc822", + "3mf": "model/3mf", + "gltf": "model/gltf+json", + "glb": "model/gltf-binary", + "igs": "model/iges", + "iges": "model/iges", + "msh": "model/mesh", + "mesh": "model/mesh", + "silo": "model/mesh", + "mtl": "model/mtl", + "obj": "model/obj", + "stpz": "model/step+zip", + "stpxz": "model/step-xml+zip", + "stl": "model/stl", + "wrl": "model/vrml", + "vrml": "model/vrml", + "x3db": "model/x3d+fastinfoset", + "x3dbz": "model/x3d+binary", + "x3dv": "model/x3d-vrml", + "x3dvz": "model/x3d+vrml", + "x3d": "model/x3d+xml", + "x3dz": "model/x3d+xml", + "appcache": "text/cache-manifest", + "manifest": "text/cache-manifest", + "ics": "text/calendar", + "ifb": "text/calendar", + "coffee": "text/coffeescript", + "litcoffee": "text/coffeescript", + "css": "text/css", + "csv": "text/csv", + "html": "text/html", + "htm": "text/html", + "shtml": "text/html", + "jade": "text/jade", + "jsx": "text/jsx", + "less": "text/less", + "markdown": "text/markdown", + "md": "text/markdown", + "mml": "text/mathml", + "mdx": "text/mdx", + "n3": "text/n3", + "txt": "text/plain", + "text": "text/plain", + "conf": "text/plain", + "def": "text/plain", + "list": "text/plain", + "log": "text/plain", + "in": "text/plain", + "ini": "text/plain", + "dsc": "text/prs.lines.tag", + "rtx": "text/richtext", + "sgml": "text/sgml", + "sgm": "text/sgml", + "shex": "text/shex", + "slim": "text/slim", + "slm": "text/slim", + "spdx": "text/spdx", + "stylus": "text/stylus", + "styl": "text/stylus", + "tsv": "text/tab-separated-values", + "t": "text/troff", + "tr": "text/troff", + "roff": "text/troff", + "man": "text/troff", + "me": "text/troff", + "ms": "text/troff", + "ttl": "text/turtle", + "uri": "text/uri-list", + "uris": "text/uri-list", + "urls": "text/uri-list", + "vcard": "text/vcard", + "vtt": "text/vtt", + "yaml": "text/yaml", + "yml": "text/yaml", + "3gp": "video/3gpp", + "3g2": "video/3gpp2", + "h261": "video/h261", + "h263": "video/h263", + "h264": "video/h264", + "m4s": "video/iso.segment", + "jpgv": "video/jpeg", + "jpgm": "image/jpm", + "mj2": "video/mj2", + "mjp2": "video/mj2", + "ts": "video/mp2t", + "mp4": "video/mp4", + "mp4v": "video/mp4", + "mpg4": "video/mp4", + "mpeg": "video/mpeg", + "mpg": "video/mpeg", + "mpe": "video/mpeg", + "m1v": "video/mpeg", + "m2v": "video/mpeg", + "ogv": "video/ogg", + "qt": "video/quicktime", + "mov": "video/quicktime", + "webm": "video/webm" +}; +function lookup(extn) { + let tmp = ("" + extn).trim().toLowerCase(); + let idx = tmp.lastIndexOf("."); + return mimes[!~idx ? tmp : tmp.substring(++idx)]; +} + +// src/middleware.ts +var import_node_fs = require("fs"); +var import_node_path2 = require("path"); + +// src/utils.ts +var import_fast_glob = __toESM(require("fast-glob"), 1); +var import_node_path = __toESM(require("path"), 1); +var import_fs_extra = __toESM(require("fs-extra"), 1); +var import_picocolors = __toESM(require("picocolors"), 1); +var import_node_crypto = require("crypto"); +async function renameTarget(target, rename, src) { + const parsedPath = import_node_path.default.parse(target); + if (typeof rename === "string") { + return rename; + } + return rename(parsedPath.name, parsedPath.ext.replace(".", ""), src); +} +var collectCopyTargets = async (root, targets, flatten) => { + const copyTargets = []; + for (const target of targets) { + const { src, dest, rename, transform, preserveTimestamps, dereference } = target; + const matchedPaths = await (0, import_fast_glob.default)(src, { + onlyFiles: false, + dot: true, + cwd: root + }); + for (const matchedPath of matchedPaths) { + if (transform) { + const srcStat = await import_fs_extra.default.stat(import_node_path.default.resolve(root, matchedPath)); + if (!srcStat.isFile()) { + throw new Error( + `"transform" option only supports a file: '${matchedPath}' is not a file` + ); + } + } + const { base, dir } = import_node_path.default.parse(matchedPath); + const destDir = flatten || !flatten && !dir ? dest : dir.replace(dir.split("/")[0], dest); + copyTargets.push({ + src: matchedPath, + dest: import_node_path.default.join( + destDir, + rename ? await renameTarget(base, rename, matchedPath) : base + ), + transform, + preserveTimestamps: preserveTimestamps ?? false, + dereference: dereference ?? true + }); + } + } + return copyTargets; +}; +async function getTransformedContent(file, transform) { + if (transform.encoding === "buffer") { + const content2 = await import_fs_extra.default.readFile(file); + return transform.handler(content2, file); + } + const content = await import_fs_extra.default.readFile(file, transform.encoding); + return transform.handler(content, file); +} +async function transformCopy(transform, src, dest) { + const transformedContent = await getTransformedContent(src, transform); + if (transformedContent !== null) { + await import_fs_extra.default.outputFile(dest, transformedContent); + } +} +var copyAll = async (rootSrc, rootDest, targets, flatten) => { + const copyTargets = await collectCopyTargets(rootSrc, targets, flatten); + for (const copyTarget of copyTargets) { + const { src, dest, transform, preserveTimestamps, dereference } = copyTarget; + const resolvedSrc = import_node_path.default.resolve(rootSrc, src); + const resolvedDest = import_node_path.default.resolve(rootSrc, rootDest, dest); + const transformOption = resolveTransformOption(transform); + if (transformOption) { + await transformCopy(transformOption, resolvedSrc, resolvedDest); + } else { + await import_fs_extra.default.copy(resolvedSrc, resolvedDest, { + preserveTimestamps, + dereference + }); + } + } + return copyTargets.length; +}; +var copyFile = async (file, rootSrc, rootDest, targets, flatten) => { + const copyTargets = await collectCopyTargets(rootSrc, targets, flatten); + const changedFiles = []; + for (const copyTarget of copyTargets) { + const { src, dest, transform, preserveTimestamps, dereference } = copyTarget; + const relative = import_node_path.default.relative(file, src); + if (relative.length == 0 || relative.startsWith("..") && relative.endsWith("..")) { + const resolvedSrc = import_node_path.default.resolve(rootSrc, file); + let resolvedDest = import_node_path.default.resolve(rootSrc, rootDest, dest); + const transformOption = resolveTransformOption(transform); + if (import_fs_extra.default.statSync(resolvedDest).isDirectory()) { + resolvedDest = resolvedDest + "/" + import_node_path.default.relative(src, file); + } + if (transformOption) { + await transformCopy(transformOption, resolvedSrc, resolvedDest); + } else { + await import_fs_extra.default.copy(resolvedSrc, resolvedDest, { + preserveTimestamps, + dereference + }); + } + changedFiles.push( + import_node_path.default.normalize(rootDest + "/" + dest + "/" + import_node_path.default.relative(src, file)) + ); + } + } + return changedFiles; +}; +var removeFile = async (file, rootSrc, rootDest, targets, flatten) => { + const copyTargets = await collectCopyTargets(rootSrc, targets, flatten); + const changedFiles = []; + for (const copyTarget of copyTargets) { + const { src, dest } = copyTarget; + const relative = import_node_path.default.relative(file, src); + if (relative.length == 0 || relative.startsWith("..") && relative.endsWith("..")) { + let resolvedDest = import_node_path.default.resolve(rootSrc, rootDest, dest); + if (import_fs_extra.default.statSync(resolvedDest).isDirectory()) { + resolvedDest = resolvedDest + "/" + import_node_path.default.relative(src, file); + } + await import_fs_extra.default.remove(resolvedDest); + changedFiles.push( + import_node_path.default.normalize(rootDest + "/" + dest + "/" + import_node_path.default.relative(src, file)) + ); + } + } + return changedFiles; +}; +var updateFileMapFromTargets = (targets, fileMap) => { + fileMap.clear(); + for (const target of [...targets].reverse()) { + let dest = target.dest.replace(/\\/g, "/"); + if (!dest.startsWith("/")) { + dest = `/${dest}`; + } + if (!fileMap.has(dest)) { + fileMap.set(dest, []); + } + fileMap.get(dest).push({ + src: target.src, + transform: target.transform + }); + } +}; +var calculateMd5Base64 = (content) => (0, import_node_crypto.createHash)("md5").update(content).digest("base64"); +var formatConsole = (msg) => `${import_picocolors.default.cyan("[vite-plugin-static-copy]")} ${msg}`; +var outputCollectedLog = (logger, collectedMap) => { + if (collectedMap.size > 0) { + logger.info( + formatConsole(import_picocolors.default.green(`Collected ${collectedMap.size} items.`)) + ); + if (process.env.DEBUG === "vite:plugin-static-copy") { + for (const [key, vals] of collectedMap) { + for (const val of vals) { + logger.info( + formatConsole( + ` - '${key}' -> '${val.src}'${val.transform ? " (with content transform)" : ""}` + ) + ); + } + } + } + } else { + logger.warn(formatConsole(import_picocolors.default.yellow("No items found."))); + } +}; +var outputCopyLog = (logger, copyCount) => { + if (copyCount === void 0) { + logger.error(formatConsole(import_picocolors.default.yellow("Copy count was not set."))); + } else if (copyCount > 0) { + logger.info(formatConsole(import_picocolors.default.green(`Copied ${copyCount} items.`))); + } else { + logger.warn(formatConsole(import_picocolors.default.yellow("No items to copy."))); + } +}; +function resolveTransformOption(transformOption) { + if (typeof transformOption === "function") { + return { + handler: transformOption, + encoding: "utf8" + }; + } + return transformOption; +} + +// src/middleware.ts +function viaLocal(root, fileMap, uri) { + if (uri.endsWith("/")) { + uri = uri.slice(0, -1); + } + const files = fileMap.get(uri); + if (files && files[0]) { + const file = files[0]; + const filepath = (0, import_node_path2.resolve)(root, file.src); + const stats = (0, import_node_fs.statSync)(filepath); + return { filepath, stats, transform: file.transform }; + } + for (const [key, vals] of fileMap) { + const dir = key.endsWith("/") ? key : `${key}/`; + if (!uri.startsWith(dir)) + continue; + for (const val of vals) { + const filepath = (0, import_node_path2.resolve)(root, val.src, uri.slice(dir.length)); + try { + const stats = (0, import_node_fs.statSync)(filepath); + return { filepath, stats }; + } catch { + } + } + return void 0; + } + return void 0; +} +function getStaticHeaders(name, stats) { + let ctype = lookup(name) || ""; + if (ctype === "text/html") + ctype += ";charset=utf-8"; + const headers = { + "Content-Length": stats.size, + "Content-Type": ctype, + "Last-Modified": stats.mtime.toUTCString(), + ETag: `W/"${stats.size}-${stats.mtime.getTime()}"`, + "Cache-Control": "no-cache" + }; + return headers; +} +function getTransformHeaders(name, encoding, content) { + let ctype = lookup(name) || ""; + if (ctype === "text/html") + ctype += ";charset=utf-8"; + const headers = { + "Content-Length": Buffer.byteLength( + content, + encoding === "buffer" ? void 0 : encoding + ), + "Content-Type": ctype, + ETag: `W/"${calculateMd5Base64(content)}"`, + "Cache-Control": "no-cache" + }; + return headers; +} +function getMergeHeaders(headers, res) { + headers = { ...headers }; + for (const key in headers) { + const tmp = res.getHeader(key); + if (tmp) + headers[key] = tmp; + } + const contentTypeHeader = res.getHeader("content-type"); + if (contentTypeHeader) { + headers["Content-Type"] = contentTypeHeader; + } + return headers; +} +function sendStatic(req, res, file, stats) { + const staticHeaders = getStaticHeaders(file, stats); + if (req.headers["if-none-match"] === staticHeaders["ETag"]) { + res.writeHead(304); + res.end(); + return; + } + let code = 200; + const headers = getMergeHeaders(staticHeaders, res); + const opts = {}; + if (req.headers.range) { + code = 206; + const [x, y] = req.headers.range.replace("bytes=", "").split("-"); + const end = (y ? parseInt(y, 10) : 0) || stats.size - 1; + const start = (x ? parseInt(x, 10) : 0) || 0; + opts.end = end; + opts.start = start; + if (start >= stats.size || end >= stats.size) { + res.setHeader("Content-Range", `bytes */${stats.size}`); + res.statusCode = 416; + res.end(); + return; + } + headers["Content-Range"] = `bytes ${start}-${end}/${stats.size}`; + headers["Content-Length"] = end - start + 1; + headers["Accept-Ranges"] = "bytes"; + } + res.writeHead(code, headers); + (0, import_node_fs.createReadStream)(file, opts).pipe(res); +} +async function sendTransform(req, res, file, transform) { + const transformedContent = await getTransformedContent(file, transform); + if (transformedContent === null) { + return false; + } + const transformHeaders = getTransformHeaders( + file, + transform.encoding, + transformedContent + ); + if (req.headers["if-none-match"] === transformHeaders["ETag"]) { + res.writeHead(304); + res.end(); + return true; + } + const code = 200; + const headers = getMergeHeaders(transformHeaders, res); + res.writeHead(code, headers); + res.end(transformedContent); + return true; +} +function return404(res, next) { + if (next) { + next(); + return; + } + res.statusCode = 404; + res.end(); +} +function serveStaticCopyMiddleware(root, fileMap) { + return async function viteServeStaticCopyMiddleware(req, res, next) { + let pathname = parse2(req).pathname; + if (pathname.includes("%")) { + try { + pathname = decodeURIComponent(pathname); + } catch (err) { + } + } + const data = viaLocal(root, fileMap, pathname); + if (!data) { + return404(res, next); + return; + } + if (/\.[tj]sx?$/.test(pathname)) { + res.setHeader("Content-Type", "application/javascript"); + } + const transformOption = resolveTransformOption(data.transform); + if (transformOption) { + const sent = await sendTransform(req, res, data.filepath, transformOption); + if (!sent) { + return404(res, next); + return; + } + return; + } + sendStatic(req, res, data.filepath, data.stats); + }; +} + +// node_modules/throttle-debounce/esm/index.js +function throttle(delay, callback, options) { + var _ref = options || {}, _ref$noTrailing = _ref.noTrailing, noTrailing = _ref$noTrailing === void 0 ? false : _ref$noTrailing, _ref$noLeading = _ref.noLeading, noLeading = _ref$noLeading === void 0 ? false : _ref$noLeading, _ref$debounceMode = _ref.debounceMode, debounceMode = _ref$debounceMode === void 0 ? void 0 : _ref$debounceMode; + var timeoutID; + var cancelled = false; + var lastExec = 0; + function clearExistingTimeout() { + if (timeoutID) { + clearTimeout(timeoutID); + } + } + function cancel(options2) { + var _ref2 = options2 || {}, _ref2$upcomingOnly = _ref2.upcomingOnly, upcomingOnly = _ref2$upcomingOnly === void 0 ? false : _ref2$upcomingOnly; + clearExistingTimeout(); + cancelled = !upcomingOnly; + } + function wrapper() { + for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) { + arguments_[_key] = arguments[_key]; + } + var self = this; + var elapsed = Date.now() - lastExec; + if (cancelled) { + return; + } + function exec() { + lastExec = Date.now(); + callback.apply(self, arguments_); + } + function clear() { + timeoutID = void 0; + } + if (!noLeading && debounceMode && !timeoutID) { + exec(); + } + clearExistingTimeout(); + if (debounceMode === void 0 && elapsed > delay) { + if (noLeading) { + lastExec = Date.now(); + if (!noTrailing) { + timeoutID = setTimeout(debounceMode ? clear : exec, delay); + } + } else { + exec(); + } + } else if (noTrailing !== true) { + timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === void 0 ? delay - elapsed : delay); + } + } + wrapper.cancel = cancel; + return wrapper; +} +function debounce(delay, callback, options) { + var _ref = options || {}, _ref$atBegin = _ref.atBegin, atBegin = _ref$atBegin === void 0 ? false : _ref$atBegin; + return throttle(delay, callback, { + debounceMode: atBegin !== false + }); +} + +// src/serve.ts +var import_chokidar = __toESM(require("chokidar"), 1); +var import_picocolors2 = __toESM(require("picocolors"), 1); +var servePlugin = ({ + targets, + flatten, + watch +}) => { + let config; + let watcher; + const fileMap = /* @__PURE__ */ new Map(); + const collectFileMap = async () => { + try { + const copyTargets = await collectCopyTargets( + config.root, + targets, + flatten + ); + updateFileMapFromTargets(copyTargets, fileMap); + } catch (e) { + config.logger.error(formatConsole(import_picocolors2.default.red(e.toString()))); + } + }; + const collectFileMapDebounce = debounce(100, async () => { + await collectFileMap(); + }); + return { + name: "vite-plugin-static-copy:serve", + apply: "serve", + configResolved(_config) { + config = _config; + }, + async buildStart() { + await collectFileMap(); + }, + configureServer({ httpServer, middlewares, ws }) { + const reloadPage = () => { + ws.send({ type: "full-reload", path: "*" }); + }; + if (watch.copyToDest) { + copyAll(config.root, config.build.outDir, targets, flatten).then( + (copyCount) => { + outputCopyLog(config.logger, copyCount); + } + ); + } + watcher = import_chokidar.default.watch( + targets.flatMap((target) => target.src), + { + cwd: config.root, + ignoreInitial: true, + ...watch.options + } + ); + watcher.on("add", async (path2) => { + config.logger.info( + formatConsole(`${import_picocolors2.default.green("detected new file")} ${path2}`), + { + timestamp: true + } + ); + await collectFileMapDebounce(); + if (watch.copyToDest) { + const dest = await copyFile( + path2, + config.root, + config.build.outDir, + targets, + flatten + ); + config.logger.info( + formatConsole( + `${import_picocolors2.default.green("file added and copied")} ${path2} ${import_picocolors2.default.green( + "->" + )} ${dest.join(import_picocolors2.default.green(", "))}` + ), + { + timestamp: true + } + ); + if (watch.reloadPageOnChange) { + reloadPage(); + } + } + if (watch.reloadPageOnChange && !watch.copyToDest) { + reloadPage(); + } + }); + if (watch.copyToDest) { + watcher.on("change", async (path2) => { + const dest = await copyFile( + path2, + config.root, + config.build.outDir, + targets, + flatten + ); + if (watch.reloadPageOnChange) { + reloadPage(); + } + config.logger.info( + formatConsole( + `${import_picocolors2.default.green("file changed and copied")} ${path2} ${import_picocolors2.default.green( + "->" + )} ${dest.join(import_picocolors2.default.green(", "))}` + ), + { + timestamp: true + } + ); + }); + watcher.on("unlink", async (path2) => { + const dest = await removeFile( + path2, + config.root, + config.build.outDir, + targets, + flatten + ); + if (dest.length) { + config.logger.info( + formatConsole( + `${import_picocolors2.default.green("file deleted and removed")} ${path2} ${import_picocolors2.default.green( + "and" + )} ${dest.join(import_picocolors2.default.green(", "))}` + ), + { + timestamp: true + } + ); + } + }); + } + if (watch.reloadPageOnChange && !watch.copyToDest) { + watcher.on("change", (path2) => { + config.logger.info( + formatConsole(`${import_picocolors2.default.green("file changed")} ${path2}`), + { + timestamp: true + } + ); + reloadPage(); + }); + watcher.on("unlink", (path2) => { + config.logger.info( + formatConsole(`${import_picocolors2.default.green("file deleted")} ${path2}`), + { + timestamp: true + } + ); + reloadPage(); + }); + } + httpServer == null ? void 0 : httpServer.once("listening", () => { + setTimeout(() => { + outputCollectedLog(config.logger, fileMap); + }, 0); + }); + return () => { + middlewares.use(serveStaticCopyMiddleware(config.root, fileMap)); + const transformMiddlewareIndex = findMiddlewareIndex( + middlewares.stack, + "viteTransformMiddleware" + ); + const serveStaticCopyMiddlewareIndex = findMiddlewareIndex( + middlewares.stack, + "viteServeStaticCopyMiddleware" + ); + const serveStaticCopyMiddlewareItem = middlewares.stack.splice( + serveStaticCopyMiddlewareIndex, + 1 + )[0]; + if (serveStaticCopyMiddlewareItem === void 0) + throw new Error(); + middlewares.stack.splice( + transformMiddlewareIndex, + 0, + serveStaticCopyMiddlewareItem + ); + }; + }, + async closeBundle() { + await watcher.close(); + } + }; +}; +var findMiddlewareIndex = (stack, name) => stack.findIndex( + (middleware) => typeof middleware.handle === "function" && middleware.handle.name === name +); + +// src/build.ts +var buildPlugin = ({ + targets, + flatten +}) => { + let config; + let copyCount; + return { + name: "vite-plugin-static-copy:build", + apply: "build", + configResolved(_config) { + config = _config; + }, + async writeBundle() { + copyCount = await copyAll( + config.root, + config.build.outDir, + targets, + flatten + ); + }, + closeBundle() { + outputCopyLog(config.logger, copyCount); + } + }; +}; + +// src/index.ts +var viteStaticCopy = (options) => { + const resolvedOptions = resolveOptions(options); + return [servePlugin(resolvedOptions), buildPlugin(resolvedOptions)]; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + viteStaticCopy +}); diff --git a/tailoff/vite/vite-plugin-statik-copy/index.d.ts b/tailoff/vite/vite-plugin-statik-copy/index.d.ts new file mode 100644 index 00000000..fe9318f8 --- /dev/null +++ b/tailoff/vite/vite-plugin-statik-copy/index.d.ts @@ -0,0 +1,86 @@ +import { Plugin } from 'vite'; +import { WatchOptions } from 'chokidar'; + +type MaybePromise = T | Promise; +type RenameFunc = (fileName: string, fileExtension: string, fullPath: string) => MaybePromise; +/** + * @param content content of file + * @param filename absolute path to the file + * @returns the transformed content. when `null` is returned, the file won't be created. + */ +type TransformFunc = (content: T, filename: string) => MaybePromise; +type TransformOptionObject = { + encoding: Exclude; + handler: TransformFunc; +} | { + encoding: 'buffer'; + handler: TransformFunc; +}; +type TransformOption = TransformFunc | TransformOptionObject; +type Target = { + /** + * path or glob + */ + src: string | string[]; + /** + * destination + */ + dest: string; + /** + * rename + */ + rename?: string | RenameFunc; + /** + * transform + * + * `src` should only include files when this option is used + */ + transform?: TransformOption; + /** + * Should timestamps on copied files be preserved? + * + * When false, timestamp behavior is OS-dependent. + * Ignored for transformed files. + * @default false + */ + preserveTimestamps?: boolean; + /** + * Whether to dereference symlinks. + * + * When true, symlinks will be dereferenced. + * When false, symlinks will not be dereferenced. + * @default true + */ + dereference?: boolean; +}; +type ViteStaticCopyOptions = { + /** + * Array of targets to copy. + */ + targets: Target[]; + /** + * Remove the directory structure. + * @default true + */ + flatten?: boolean; + watch?: { + /** + * Watch options + */ + options?: WatchOptions; + /** + * Reloads page on file change when true + * @default false + */ + reloadPageOnChange?: boolean; + /** + * Copy files to the dist on change + * @default false + */ + copyToDest?: boolean; + }; +}; + +declare const viteStaticCopy: (options: ViteStaticCopyOptions) => Plugin[]; + +export { RenameFunc, Target, TransformFunc, TransformOption, ViteStaticCopyOptions, viteStaticCopy }; diff --git a/tailoff/vite/vite-plugin-statik-copy/index.js b/tailoff/vite/vite-plugin-statik-copy/index.js new file mode 100644 index 00000000..accb01f9 --- /dev/null +++ b/tailoff/vite/vite-plugin-statik-copy/index.js @@ -0,0 +1,1081 @@ +// src/options.ts +var resolveOptions = (options) => { + var _a, _b, _c; + return { + targets: options.targets, + flatten: options.flatten ?? true, + watch: { + options: ((_a = options.watch) == null ? void 0 : _a.options) ?? {}, + reloadPageOnChange: ((_b = options.watch) == null ? void 0 : _b.reloadPageOnChange) ?? false, + copyToDest: ((_c = options.watch) == null ? void 0 : _c.copyToDest) ?? false + } + }; +}; + +// node_modules/@polka/url/build.mjs +import * as qs from "querystring"; +function parse2(req) { + let raw = req.url; + if (raw == null) + return; + let prev = req._parsedUrl; + if (prev && prev.raw === raw) + return prev; + let pathname = raw, search = "", query; + if (raw.length > 1) { + let idx = raw.indexOf("?", 1); + if (idx !== -1) { + search = raw.substring(idx); + pathname = raw.substring(0, idx); + if (search.length > 1) { + query = qs.parse(search.substring(1)); + } + } + } + return req._parsedUrl = { pathname, search, query, raw }; +} + +// node_modules/mrmime/index.mjs +var mimes = { + "ez": "application/andrew-inset", + "aw": "application/applixware", + "atom": "application/atom+xml", + "atomcat": "application/atomcat+xml", + "atomdeleted": "application/atomdeleted+xml", + "atomsvc": "application/atomsvc+xml", + "dwd": "application/atsc-dwd+xml", + "held": "application/atsc-held+xml", + "rsat": "application/atsc-rsat+xml", + "bdoc": "application/bdoc", + "xcs": "application/calendar+xml", + "ccxml": "application/ccxml+xml", + "cdfx": "application/cdfx+xml", + "cdmia": "application/cdmi-capability", + "cdmic": "application/cdmi-container", + "cdmid": "application/cdmi-domain", + "cdmio": "application/cdmi-object", + "cdmiq": "application/cdmi-queue", + "cu": "application/cu-seeme", + "mpd": "application/dash+xml", + "davmount": "application/davmount+xml", + "dbk": "application/docbook+xml", + "dssc": "application/dssc+der", + "xdssc": "application/dssc+xml", + "es": "application/ecmascript", + "ecma": "application/ecmascript", + "emma": "application/emma+xml", + "emotionml": "application/emotionml+xml", + "epub": "application/epub+zip", + "exi": "application/exi", + "fdt": "application/fdt+xml", + "pfr": "application/font-tdpfr", + "geojson": "application/geo+json", + "gml": "application/gml+xml", + "gpx": "application/gpx+xml", + "gxf": "application/gxf", + "gz": "application/gzip", + "hjson": "application/hjson", + "stk": "application/hyperstudio", + "ink": "application/inkml+xml", + "inkml": "application/inkml+xml", + "ipfix": "application/ipfix", + "its": "application/its+xml", + "jar": "application/java-archive", + "war": "application/java-archive", + "ear": "application/java-archive", + "ser": "application/java-serialized-object", + "class": "application/java-vm", + "js": "application/javascript", + "mjs": "application/javascript", + "json": "application/json", + "map": "application/json", + "json5": "application/json5", + "jsonml": "application/jsonml+json", + "jsonld": "application/ld+json", + "lgr": "application/lgr+xml", + "lostxml": "application/lost+xml", + "hqx": "application/mac-binhex40", + "cpt": "application/mac-compactpro", + "mads": "application/mads+xml", + "webmanifest": "application/manifest+json", + "mrc": "application/marc", + "mrcx": "application/marcxml+xml", + "ma": "application/mathematica", + "nb": "application/mathematica", + "mb": "application/mathematica", + "mathml": "application/mathml+xml", + "mbox": "application/mbox", + "mscml": "application/mediaservercontrol+xml", + "metalink": "application/metalink+xml", + "meta4": "application/metalink4+xml", + "mets": "application/mets+xml", + "maei": "application/mmt-aei+xml", + "musd": "application/mmt-usd+xml", + "mods": "application/mods+xml", + "m21": "application/mp21", + "mp21": "application/mp21", + "mp4s": "application/mp4", + "m4p": "application/mp4", + "doc": "application/msword", + "dot": "application/msword", + "mxf": "application/mxf", + "nq": "application/n-quads", + "nt": "application/n-triples", + "cjs": "application/node", + "bin": "application/octet-stream", + "dms": "application/octet-stream", + "lrf": "application/octet-stream", + "mar": "application/octet-stream", + "so": "application/octet-stream", + "dist": "application/octet-stream", + "distz": "application/octet-stream", + "pkg": "application/octet-stream", + "bpk": "application/octet-stream", + "dump": "application/octet-stream", + "elc": "application/octet-stream", + "deploy": "application/octet-stream", + "exe": "application/octet-stream", + "dll": "application/octet-stream", + "deb": "application/octet-stream", + "dmg": "application/octet-stream", + "iso": "application/octet-stream", + "img": "application/octet-stream", + "msi": "application/octet-stream", + "msp": "application/octet-stream", + "msm": "application/octet-stream", + "buffer": "application/octet-stream", + "oda": "application/oda", + "opf": "application/oebps-package+xml", + "ogx": "application/ogg", + "omdoc": "application/omdoc+xml", + "onetoc": "application/onenote", + "onetoc2": "application/onenote", + "onetmp": "application/onenote", + "onepkg": "application/onenote", + "oxps": "application/oxps", + "relo": "application/p2p-overlay+xml", + "xer": "application/patch-ops-error+xml", + "pdf": "application/pdf", + "pgp": "application/pgp-encrypted", + "asc": "application/pgp-signature", + "sig": "application/pgp-signature", + "prf": "application/pics-rules", + "p10": "application/pkcs10", + "p7m": "application/pkcs7-mime", + "p7c": "application/pkcs7-mime", + "p7s": "application/pkcs7-signature", + "p8": "application/pkcs8", + "ac": "application/pkix-attr-cert", + "cer": "application/pkix-cert", + "crl": "application/pkix-crl", + "pkipath": "application/pkix-pkipath", + "pki": "application/pkixcmp", + "pls": "application/pls+xml", + "ai": "application/postscript", + "eps": "application/postscript", + "ps": "application/postscript", + "provx": "application/provenance+xml", + "cww": "application/prs.cww", + "pskcxml": "application/pskc+xml", + "raml": "application/raml+yaml", + "rdf": "application/rdf+xml", + "owl": "application/rdf+xml", + "rif": "application/reginfo+xml", + "rnc": "application/relax-ng-compact-syntax", + "rl": "application/resource-lists+xml", + "rld": "application/resource-lists-diff+xml", + "rs": "application/rls-services+xml", + "rapd": "application/route-apd+xml", + "sls": "application/route-s-tsid+xml", + "rusd": "application/route-usd+xml", + "gbr": "application/rpki-ghostbusters", + "mft": "application/rpki-manifest", + "roa": "application/rpki-roa", + "rsd": "application/rsd+xml", + "rss": "application/rss+xml", + "rtf": "application/rtf", + "sbml": "application/sbml+xml", + "scq": "application/scvp-cv-request", + "scs": "application/scvp-cv-response", + "spq": "application/scvp-vp-request", + "spp": "application/scvp-vp-response", + "sdp": "application/sdp", + "senmlx": "application/senml+xml", + "sensmlx": "application/sensml+xml", + "setpay": "application/set-payment-initiation", + "setreg": "application/set-registration-initiation", + "shf": "application/shf+xml", + "siv": "application/sieve", + "sieve": "application/sieve", + "smi": "application/smil+xml", + "smil": "application/smil+xml", + "rq": "application/sparql-query", + "srx": "application/sparql-results+xml", + "gram": "application/srgs", + "grxml": "application/srgs+xml", + "sru": "application/sru+xml", + "ssdl": "application/ssdl+xml", + "ssml": "application/ssml+xml", + "swidtag": "application/swid+xml", + "tei": "application/tei+xml", + "teicorpus": "application/tei+xml", + "tfi": "application/thraud+xml", + "tsd": "application/timestamped-data", + "toml": "application/toml", + "trig": "application/trig", + "ttml": "application/ttml+xml", + "ubj": "application/ubjson", + "rsheet": "application/urc-ressheet+xml", + "td": "application/urc-targetdesc+xml", + "vxml": "application/voicexml+xml", + "wasm": "application/wasm", + "wgt": "application/widget", + "hlp": "application/winhlp", + "wsdl": "application/wsdl+xml", + "wspolicy": "application/wspolicy+xml", + "xaml": "application/xaml+xml", + "xav": "application/xcap-att+xml", + "xca": "application/xcap-caps+xml", + "xdf": "application/xcap-diff+xml", + "xel": "application/xcap-el+xml", + "xns": "application/xcap-ns+xml", + "xenc": "application/xenc+xml", + "xhtml": "application/xhtml+xml", + "xht": "application/xhtml+xml", + "xlf": "application/xliff+xml", + "xml": "application/xml", + "xsl": "application/xml", + "xsd": "application/xml", + "rng": "application/xml", + "dtd": "application/xml-dtd", + "xop": "application/xop+xml", + "xpl": "application/xproc+xml", + "xslt": "application/xml", + "xspf": "application/xspf+xml", + "mxml": "application/xv+xml", + "xhvml": "application/xv+xml", + "xvml": "application/xv+xml", + "xvm": "application/xv+xml", + "yang": "application/yang", + "yin": "application/yin+xml", + "zip": "application/zip", + "3gpp": "video/3gpp", + "adp": "audio/adpcm", + "amr": "audio/amr", + "au": "audio/basic", + "snd": "audio/basic", + "mid": "audio/midi", + "midi": "audio/midi", + "kar": "audio/midi", + "rmi": "audio/midi", + "mxmf": "audio/mobile-xmf", + "mp3": "audio/mpeg", + "m4a": "audio/mp4", + "mp4a": "audio/mp4", + "mpga": "audio/mpeg", + "mp2": "audio/mpeg", + "mp2a": "audio/mpeg", + "m2a": "audio/mpeg", + "m3a": "audio/mpeg", + "oga": "audio/ogg", + "ogg": "audio/ogg", + "spx": "audio/ogg", + "opus": "audio/ogg", + "s3m": "audio/s3m", + "sil": "audio/silk", + "wav": "audio/wav", + "weba": "audio/webm", + "xm": "audio/xm", + "ttc": "font/collection", + "otf": "font/otf", + "ttf": "font/ttf", + "woff": "font/woff", + "woff2": "font/woff2", + "exr": "image/aces", + "apng": "image/apng", + "avif": "image/avif", + "bmp": "image/bmp", + "cgm": "image/cgm", + "drle": "image/dicom-rle", + "emf": "image/emf", + "fits": "image/fits", + "g3": "image/g3fax", + "gif": "image/gif", + "heic": "image/heic", + "heics": "image/heic-sequence", + "heif": "image/heif", + "heifs": "image/heif-sequence", + "hej2": "image/hej2k", + "hsj2": "image/hsj2", + "ief": "image/ief", + "jls": "image/jls", + "jp2": "image/jp2", + "jpg2": "image/jp2", + "jpeg": "image/jpeg", + "jpg": "image/jpeg", + "jpe": "image/jpeg", + "jph": "image/jph", + "jhc": "image/jphc", + "jpm": "image/jpm", + "jpx": "image/jpx", + "jpf": "image/jpx", + "jxr": "image/jxr", + "jxra": "image/jxra", + "jxrs": "image/jxrs", + "jxs": "image/jxs", + "jxsc": "image/jxsc", + "jxsi": "image/jxsi", + "jxss": "image/jxss", + "ktx": "image/ktx", + "ktx2": "image/ktx2", + "png": "image/png", + "btif": "image/prs.btif", + "pti": "image/prs.pti", + "sgi": "image/sgi", + "svg": "image/svg+xml", + "svgz": "image/svg+xml", + "t38": "image/t38", + "tif": "image/tiff", + "tiff": "image/tiff", + "tfx": "image/tiff-fx", + "webp": "image/webp", + "wmf": "image/wmf", + "disposition-notification": "message/disposition-notification", + "u8msg": "message/global", + "u8dsn": "message/global-delivery-status", + "u8mdn": "message/global-disposition-notification", + "u8hdr": "message/global-headers", + "eml": "message/rfc822", + "mime": "message/rfc822", + "3mf": "model/3mf", + "gltf": "model/gltf+json", + "glb": "model/gltf-binary", + "igs": "model/iges", + "iges": "model/iges", + "msh": "model/mesh", + "mesh": "model/mesh", + "silo": "model/mesh", + "mtl": "model/mtl", + "obj": "model/obj", + "stpz": "model/step+zip", + "stpxz": "model/step-xml+zip", + "stl": "model/stl", + "wrl": "model/vrml", + "vrml": "model/vrml", + "x3db": "model/x3d+fastinfoset", + "x3dbz": "model/x3d+binary", + "x3dv": "model/x3d-vrml", + "x3dvz": "model/x3d+vrml", + "x3d": "model/x3d+xml", + "x3dz": "model/x3d+xml", + "appcache": "text/cache-manifest", + "manifest": "text/cache-manifest", + "ics": "text/calendar", + "ifb": "text/calendar", + "coffee": "text/coffeescript", + "litcoffee": "text/coffeescript", + "css": "text/css", + "csv": "text/csv", + "html": "text/html", + "htm": "text/html", + "shtml": "text/html", + "jade": "text/jade", + "jsx": "text/jsx", + "less": "text/less", + "markdown": "text/markdown", + "md": "text/markdown", + "mml": "text/mathml", + "mdx": "text/mdx", + "n3": "text/n3", + "txt": "text/plain", + "text": "text/plain", + "conf": "text/plain", + "def": "text/plain", + "list": "text/plain", + "log": "text/plain", + "in": "text/plain", + "ini": "text/plain", + "dsc": "text/prs.lines.tag", + "rtx": "text/richtext", + "sgml": "text/sgml", + "sgm": "text/sgml", + "shex": "text/shex", + "slim": "text/slim", + "slm": "text/slim", + "spdx": "text/spdx", + "stylus": "text/stylus", + "styl": "text/stylus", + "tsv": "text/tab-separated-values", + "t": "text/troff", + "tr": "text/troff", + "roff": "text/troff", + "man": "text/troff", + "me": "text/troff", + "ms": "text/troff", + "ttl": "text/turtle", + "uri": "text/uri-list", + "uris": "text/uri-list", + "urls": "text/uri-list", + "vcard": "text/vcard", + "vtt": "text/vtt", + "yaml": "text/yaml", + "yml": "text/yaml", + "3gp": "video/3gpp", + "3g2": "video/3gpp2", + "h261": "video/h261", + "h263": "video/h263", + "h264": "video/h264", + "m4s": "video/iso.segment", + "jpgv": "video/jpeg", + "jpgm": "image/jpm", + "mj2": "video/mj2", + "mjp2": "video/mj2", + "ts": "video/mp2t", + "mp4": "video/mp4", + "mp4v": "video/mp4", + "mpg4": "video/mp4", + "mpeg": "video/mpeg", + "mpg": "video/mpeg", + "mpe": "video/mpeg", + "m1v": "video/mpeg", + "m2v": "video/mpeg", + "ogv": "video/ogg", + "qt": "video/quicktime", + "mov": "video/quicktime", + "webm": "video/webm" +}; +function lookup(extn) { + let tmp = ("" + extn).trim().toLowerCase(); + let idx = tmp.lastIndexOf("."); + return mimes[!~idx ? tmp : tmp.substring(++idx)]; +} + +// src/middleware.ts +import { statSync, createReadStream } from "node:fs"; +import { resolve } from "node:path"; + +// src/utils.ts +import fastglob from "fast-glob"; +import path from "node:path"; +import fs from "fs-extra"; +import pc from "picocolors"; +import { createHash } from "node:crypto"; +async function renameTarget(target, rename, src) { + const parsedPath = path.parse(target); + if (typeof rename === "string") { + return rename; + } + return rename(parsedPath.name, parsedPath.ext.replace(".", ""), src); +} +var collectCopyTargets = async (root, targets, flatten) => { + const copyTargets = []; + for (const target of targets) { + const { src, dest, rename, transform, preserveTimestamps, dereference } = target; + const matchedPaths = await fastglob(src, { + onlyFiles: false, + dot: true, + cwd: root + }); + for (const matchedPath of matchedPaths) { + if (transform) { + const srcStat = await fs.stat(path.resolve(root, matchedPath)); + if (!srcStat.isFile()) { + throw new Error( + `"transform" option only supports a file: '${matchedPath}' is not a file` + ); + } + } + const { base, dir } = path.parse(matchedPath); + const destDir = flatten || !flatten && !dir ? dest : dir.replace(dir.split("/")[0], dest); + copyTargets.push({ + src: matchedPath, + dest: path.join( + destDir, + rename ? await renameTarget(base, rename, matchedPath) : base + ), + transform, + preserveTimestamps: preserveTimestamps ?? false, + dereference: dereference ?? true + }); + } + } + return copyTargets; +}; +async function getTransformedContent(file, transform) { + if (transform.encoding === "buffer") { + const content2 = await fs.readFile(file); + return transform.handler(content2, file); + } + const content = await fs.readFile(file, transform.encoding); + return transform.handler(content, file); +} +async function transformCopy(transform, src, dest) { + const transformedContent = await getTransformedContent(src, transform); + if (transformedContent !== null) { + await fs.outputFile(dest, transformedContent); + } +} +var copyAll = async (rootSrc, rootDest, targets, flatten) => { + const copyTargets = await collectCopyTargets(rootSrc, targets, flatten); + for (const copyTarget of copyTargets) { + const { src, dest, transform, preserveTimestamps, dereference } = copyTarget; + const resolvedSrc = path.resolve(rootSrc, src); + const resolvedDest = path.resolve(rootSrc, rootDest, dest); + const transformOption = resolveTransformOption(transform); + if (transformOption) { + await transformCopy(transformOption, resolvedSrc, resolvedDest); + } else { + await fs.copy(resolvedSrc, resolvedDest, { + preserveTimestamps, + dereference + }); + } + } + return copyTargets.length; +}; +var copyFile = async (file, rootSrc, rootDest, targets, flatten) => { + const copyTargets = await collectCopyTargets(rootSrc, targets, flatten); + const changedFiles = []; + for (const copyTarget of copyTargets) { + const { src, dest, transform, preserveTimestamps, dereference } = copyTarget; + const relative = path.relative(file, src); + if (relative.length == 0 || relative.startsWith("..") && relative.endsWith("..")) { + const resolvedSrc = path.resolve(rootSrc, file); + let resolvedDest = path.resolve(rootSrc, rootDest, dest); + const transformOption = resolveTransformOption(transform); + if (fs.statSync(resolvedDest).isDirectory()) { + resolvedDest = resolvedDest + "/" + path.relative(src, file); + } + if (transformOption) { + await transformCopy(transformOption, resolvedSrc, resolvedDest); + } else { + await fs.copy(resolvedSrc, resolvedDest, { + preserveTimestamps, + dereference + }); + } + changedFiles.push( + path.normalize(rootDest + "/" + dest + "/" + path.relative(src, file)) + ); + } + } + return changedFiles; +}; +var removeFile = async (file, rootSrc, rootDest, targets, flatten) => { + const copyTargets = await collectCopyTargets(rootSrc, targets, flatten); + const changedFiles = []; + for (const copyTarget of copyTargets) { + const { src, dest } = copyTarget; + const relative = path.relative(file, src); + if (relative.length == 0 || relative.startsWith("..") && relative.endsWith("..")) { + let resolvedDest = path.resolve(rootSrc, rootDest, dest); + if (fs.statSync(resolvedDest).isDirectory()) { + resolvedDest = resolvedDest + "/" + path.relative(src, file); + } + await fs.remove(resolvedDest); + changedFiles.push( + path.normalize(rootDest + "/" + dest + "/" + path.relative(src, file)) + ); + } + } + return changedFiles; +}; +var updateFileMapFromTargets = (targets, fileMap) => { + fileMap.clear(); + for (const target of [...targets].reverse()) { + let dest = target.dest.replace(/\\/g, "/"); + if (!dest.startsWith("/")) { + dest = `/${dest}`; + } + if (!fileMap.has(dest)) { + fileMap.set(dest, []); + } + fileMap.get(dest).push({ + src: target.src, + transform: target.transform + }); + } +}; +var calculateMd5Base64 = (content) => createHash("md5").update(content).digest("base64"); +var formatConsole = (msg) => `${pc.cyan("[vite-plugin-static-copy]")} ${msg}`; +var outputCollectedLog = (logger, collectedMap) => { + if (collectedMap.size > 0) { + logger.info( + formatConsole(pc.green(`Collected ${collectedMap.size} items.`)) + ); + if (process.env.DEBUG === "vite:plugin-static-copy") { + for (const [key, vals] of collectedMap) { + for (const val of vals) { + logger.info( + formatConsole( + ` - '${key}' -> '${val.src}'${val.transform ? " (with content transform)" : ""}` + ) + ); + } + } + } + } else { + logger.warn(formatConsole(pc.yellow("No items found."))); + } +}; +var outputCopyLog = (logger, copyCount) => { + if (copyCount === void 0) { + logger.error(formatConsole(pc.yellow("Copy count was not set."))); + } else if (copyCount > 0) { + logger.info(formatConsole(pc.green(`Copied ${copyCount} items.`))); + } else { + logger.warn(formatConsole(pc.yellow("No items to copy."))); + } +}; +function resolveTransformOption(transformOption) { + if (typeof transformOption === "function") { + return { + handler: transformOption, + encoding: "utf8" + }; + } + return transformOption; +} + +// src/middleware.ts +function viaLocal(root, fileMap, uri) { + if (uri.endsWith("/")) { + uri = uri.slice(0, -1); + } + const files = fileMap.get(uri); + if (files && files[0]) { + const file = files[0]; + const filepath = resolve(root, file.src); + const stats = statSync(filepath); + return { filepath, stats, transform: file.transform }; + } + for (const [key, vals] of fileMap) { + const dir = key.endsWith("/") ? key : `${key}/`; + if (!uri.startsWith(dir)) + continue; + for (const val of vals) { + const filepath = resolve(root, val.src, uri.slice(dir.length)); + try { + const stats = statSync(filepath); + return { filepath, stats }; + } catch { + } + } + return void 0; + } + return void 0; +} +function getStaticHeaders(name, stats) { + let ctype = lookup(name) || ""; + if (ctype === "text/html") + ctype += ";charset=utf-8"; + const headers = { + "Content-Length": stats.size, + "Content-Type": ctype, + "Last-Modified": stats.mtime.toUTCString(), + ETag: `W/"${stats.size}-${stats.mtime.getTime()}"`, + "Cache-Control": "no-cache" + }; + return headers; +} +function getTransformHeaders(name, encoding, content) { + let ctype = lookup(name) || ""; + if (ctype === "text/html") + ctype += ";charset=utf-8"; + const headers = { + "Content-Length": Buffer.byteLength( + content, + encoding === "buffer" ? void 0 : encoding + ), + "Content-Type": ctype, + ETag: `W/"${calculateMd5Base64(content)}"`, + "Cache-Control": "no-cache" + }; + return headers; +} +function getMergeHeaders(headers, res) { + headers = { ...headers }; + for (const key in headers) { + const tmp = res.getHeader(key); + if (tmp) + headers[key] = tmp; + } + const contentTypeHeader = res.getHeader("content-type"); + if (contentTypeHeader) { + headers["Content-Type"] = contentTypeHeader; + } + return headers; +} +function sendStatic(req, res, file, stats) { + const staticHeaders = getStaticHeaders(file, stats); + if (req.headers["if-none-match"] === staticHeaders["ETag"]) { + res.writeHead(304); + res.end(); + return; + } + let code = 200; + const headers = getMergeHeaders(staticHeaders, res); + const opts = {}; + if (req.headers.range) { + code = 206; + const [x, y] = req.headers.range.replace("bytes=", "").split("-"); + const end = (y ? parseInt(y, 10) : 0) || stats.size - 1; + const start = (x ? parseInt(x, 10) : 0) || 0; + opts.end = end; + opts.start = start; + if (start >= stats.size || end >= stats.size) { + res.setHeader("Content-Range", `bytes */${stats.size}`); + res.statusCode = 416; + res.end(); + return; + } + headers["Content-Range"] = `bytes ${start}-${end}/${stats.size}`; + headers["Content-Length"] = end - start + 1; + headers["Accept-Ranges"] = "bytes"; + } + res.writeHead(code, headers); + createReadStream(file, opts).pipe(res); +} +async function sendTransform(req, res, file, transform) { + const transformedContent = await getTransformedContent(file, transform); + if (transformedContent === null) { + return false; + } + const transformHeaders = getTransformHeaders( + file, + transform.encoding, + transformedContent + ); + if (req.headers["if-none-match"] === transformHeaders["ETag"]) { + res.writeHead(304); + res.end(); + return true; + } + const code = 200; + const headers = getMergeHeaders(transformHeaders, res); + res.writeHead(code, headers); + res.end(transformedContent); + return true; +} +function return404(res, next) { + if (next) { + next(); + return; + } + res.statusCode = 404; + res.end(); +} +function serveStaticCopyMiddleware(root, fileMap) { + return async function viteServeStaticCopyMiddleware(req, res, next) { + let pathname = parse2(req).pathname; + if (pathname.includes("%")) { + try { + pathname = decodeURIComponent(pathname); + } catch (err) { + } + } + const data = viaLocal(root, fileMap, pathname); + if (!data) { + return404(res, next); + return; + } + if (/\.[tj]sx?$/.test(pathname)) { + res.setHeader("Content-Type", "application/javascript"); + } + const transformOption = resolveTransformOption(data.transform); + if (transformOption) { + const sent = await sendTransform(req, res, data.filepath, transformOption); + if (!sent) { + return404(res, next); + return; + } + return; + } + sendStatic(req, res, data.filepath, data.stats); + }; +} + +// node_modules/throttle-debounce/esm/index.js +function throttle(delay, callback, options) { + var _ref = options || {}, _ref$noTrailing = _ref.noTrailing, noTrailing = _ref$noTrailing === void 0 ? false : _ref$noTrailing, _ref$noLeading = _ref.noLeading, noLeading = _ref$noLeading === void 0 ? false : _ref$noLeading, _ref$debounceMode = _ref.debounceMode, debounceMode = _ref$debounceMode === void 0 ? void 0 : _ref$debounceMode; + var timeoutID; + var cancelled = false; + var lastExec = 0; + function clearExistingTimeout() { + if (timeoutID) { + clearTimeout(timeoutID); + } + } + function cancel(options2) { + var _ref2 = options2 || {}, _ref2$upcomingOnly = _ref2.upcomingOnly, upcomingOnly = _ref2$upcomingOnly === void 0 ? false : _ref2$upcomingOnly; + clearExistingTimeout(); + cancelled = !upcomingOnly; + } + function wrapper() { + for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) { + arguments_[_key] = arguments[_key]; + } + var self = this; + var elapsed = Date.now() - lastExec; + if (cancelled) { + return; + } + function exec() { + lastExec = Date.now(); + callback.apply(self, arguments_); + } + function clear() { + timeoutID = void 0; + } + if (!noLeading && debounceMode && !timeoutID) { + exec(); + } + clearExistingTimeout(); + if (debounceMode === void 0 && elapsed > delay) { + if (noLeading) { + lastExec = Date.now(); + if (!noTrailing) { + timeoutID = setTimeout(debounceMode ? clear : exec, delay); + } + } else { + exec(); + } + } else if (noTrailing !== true) { + timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === void 0 ? delay - elapsed : delay); + } + } + wrapper.cancel = cancel; + return wrapper; +} +function debounce(delay, callback, options) { + var _ref = options || {}, _ref$atBegin = _ref.atBegin, atBegin = _ref$atBegin === void 0 ? false : _ref$atBegin; + return throttle(delay, callback, { + debounceMode: atBegin !== false + }); +} + +// src/serve.ts +import chokidar from "chokidar"; +import pc2 from "picocolors"; +var servePlugin = ({ + targets, + flatten, + watch +}) => { + let config; + let watcher; + const fileMap = /* @__PURE__ */ new Map(); + const collectFileMap = async () => { + try { + const copyTargets = await collectCopyTargets( + config.root, + targets, + flatten + ); + updateFileMapFromTargets(copyTargets, fileMap); + } catch (e) { + config.logger.error(formatConsole(pc2.red(e.toString()))); + } + }; + const collectFileMapDebounce = debounce(100, async () => { + await collectFileMap(); + }); + return { + name: "vite-plugin-static-copy:serve", + apply: "serve", + configResolved(_config) { + config = _config; + }, + async buildStart() { + await collectFileMap(); + }, + configureServer({ httpServer, middlewares, ws }) { + const reloadPage = () => { + ws.send({ type: "full-reload", path: "*" }); + }; + if (watch.copyToDest) { + copyAll(config.root, config.build.outDir, targets, flatten).then( + (copyCount) => { + outputCopyLog(config.logger, copyCount); + } + ); + } + watcher = chokidar.watch( + targets.flatMap((target) => target.src), + { + cwd: config.root, + ignoreInitial: true, + ...watch.options + } + ); + watcher.on("add", async (path2) => { + config.logger.info( + formatConsole(`${pc2.green("detected new file")} ${path2}`), + { + timestamp: true + } + ); + await collectFileMapDebounce(); + if (watch.copyToDest) { + const dest = await copyFile( + path2, + config.root, + config.build.outDir, + targets, + flatten + ); + config.logger.info( + formatConsole( + `${pc2.green("file added and copied")} ${path2} ${pc2.green( + "->" + )} ${dest.join(pc2.green(", "))}` + ), + { + timestamp: true + } + ); + if (watch.reloadPageOnChange) { + reloadPage(); + } + } + if (watch.reloadPageOnChange && !watch.copyToDest) { + reloadPage(); + } + }); + if (watch.copyToDest) { + watcher.on("change", async (path2) => { + const dest = await copyFile( + path2, + config.root, + config.build.outDir, + targets, + flatten + ); + if (watch.reloadPageOnChange) { + reloadPage(); + } + config.logger.info( + formatConsole( + `${pc2.green("file changed and copied")} ${path2} ${pc2.green( + "->" + )} ${dest.join(pc2.green(", "))}` + ), + { + timestamp: true + } + ); + }); + watcher.on("unlink", async (path2) => { + const dest = await removeFile( + path2, + config.root, + config.build.outDir, + targets, + flatten + ); + if (dest.length) { + config.logger.info( + formatConsole( + `${pc2.green("file deleted and removed")} ${path2} ${pc2.green( + "and" + )} ${dest.join(pc2.green(", "))}` + ), + { + timestamp: true + } + ); + } + }); + } + if (watch.reloadPageOnChange && !watch.copyToDest) { + watcher.on("change", (path2) => { + config.logger.info( + formatConsole(`${pc2.green("file changed")} ${path2}`), + { + timestamp: true + } + ); + reloadPage(); + }); + watcher.on("unlink", (path2) => { + config.logger.info( + formatConsole(`${pc2.green("file deleted")} ${path2}`), + { + timestamp: true + } + ); + reloadPage(); + }); + } + httpServer == null ? void 0 : httpServer.once("listening", () => { + setTimeout(() => { + outputCollectedLog(config.logger, fileMap); + }, 0); + }); + return () => { + middlewares.use(serveStaticCopyMiddleware(config.root, fileMap)); + const transformMiddlewareIndex = findMiddlewareIndex( + middlewares.stack, + "viteTransformMiddleware" + ); + const serveStaticCopyMiddlewareIndex = findMiddlewareIndex( + middlewares.stack, + "viteServeStaticCopyMiddleware" + ); + const serveStaticCopyMiddlewareItem = middlewares.stack.splice( + serveStaticCopyMiddlewareIndex, + 1 + )[0]; + if (serveStaticCopyMiddlewareItem === void 0) + throw new Error(); + middlewares.stack.splice( + transformMiddlewareIndex, + 0, + serveStaticCopyMiddlewareItem + ); + }; + }, + async closeBundle() { + await watcher.close(); + } + }; +}; +var findMiddlewareIndex = (stack, name) => stack.findIndex( + (middleware) => typeof middleware.handle === "function" && middleware.handle.name === name +); + +// src/build.ts +var buildPlugin = ({ + targets, + flatten +}) => { + let config; + let copyCount; + return { + name: "vite-plugin-static-copy:build", + apply: "build", + configResolved(_config) { + config = _config; + }, + async writeBundle() { + copyCount = await copyAll( + config.root, + config.build.outDir, + targets, + flatten + ); + }, + closeBundle() { + outputCopyLog(config.logger, copyCount); + } + }; +}; + +// src/index.ts +var viteStaticCopy = (options) => { + const resolvedOptions = resolveOptions(options); + return [servePlugin(resolvedOptions), buildPlugin(resolvedOptions)]; +}; +export { + viteStaticCopy +}; diff --git a/templates/_site/_account/_editPassword.twig b/templates/_site/_account/_editPassword.twig index ee69a0f8..366f6d18 100644 --- a/templates/_site/_account/_editPassword.twig +++ b/templates/_site/_account/_editPassword.twig @@ -10,6 +10,19 @@ {% include "_site/_snippet/_content/_defaultHeader" %} + {% if user is defined and user.hasErrors() %} + {# {{ d(user.errors()) }}#} +
+
+
+ {% for error in user.errors().password %} +
{{ error }}
+ {% endfor %} +
+
+
+ {% endif %} +
@@ -32,8 +45,16 @@
- + {% set passwordPolicySettings = craft.app.getPlugins().getPlugin('password-policy').getSettings() %} +
+ {% endif %} +
-
+ {{ csrfInput() }} {{ actionInput('users/set-password') }} {% set setPasswordConfirmation = craft.entries.section('setPasswordConfirmation').one() %} @@ -19,14 +32,23 @@ {{ hiddenInput('id', id) }} {% if errorMessage is defined %} - diff --git a/templates/_site/_searchResults.twig b/templates/_site/_searchResults.twig index 9e4afb81..5797fe2f 100644 --- a/templates/_site/_searchResults.twig +++ b/templates/_site/_searchResults.twig @@ -9,7 +9,7 @@ {% embed "_site/_snippet/_content/_defaultHeader" %} {% block headerText %} {% include '_site/_snippet/_nav/_breadcrumb' %} -

{{ 'Zoekresultaten'|t }}

+ {% include '_site/_snippet/_content/_pageTitle' %} {% if q|length %}
{{ 'Resultaten voor'|t }} "{{ q }}" @@ -19,12 +19,58 @@ {% endembed %}
- {% include '_site/_snippet/_global/_search' with {showInline: true} %} +
+
+ {% include '_site/_snippet/_global/_search' with {showInline: true, filledInValue: q ?? false} %} +
+
{% if q|length %} -
+ + {# TODO - - - Craft Search - - - Remove the Google Search if not used #} + {% set results = craft.entries.search('*' ~ q ~ '*').uri(':notempty:').orderBy('score') %} +
+
+
+ {% if results.collect()|length %} + {% paginate results.limit(12) as loadPageInfo, loadEntries %} + + +
+ + {% if loadPageInfo.nextUrl %} + {{ "Load more"|t }} + {% endif %} +
+ {% else %} + {% if entry.contentBuilder.collect()|length %} + {% include '_site/_snippet/_content/_contentBuilder' %} + {% else %} +
{{ "Oh no! We could not find any results for your search query."|t }}
+ {% endif %} + {% endif %} +
+
+
+ + {# TODO - - - Enable this for the Google Search - - - Remove the Craft Search above if not used #} + {# -
@@ -116,7 +162,7 @@
-
+
- #} {% else %}
diff --git a/templates/_site/_snippet/_content/_blocks/_image.twig b/templates/_site/_snippet/_content/_blocks/_image.twig index 570b171f..596a1d65 100644 --- a/templates/_site/_snippet/_content/_blocks/_image.twig +++ b/templates/_site/_snippet/_content/_blocks/_image.twig @@ -4,9 +4,9 @@ {% case 'left' %}justify-start{% case 'right' %}justify-end{% default %}justify-center {% endswitch %} "> {% for image in block.image %} -
{% set optimizedImage = image.optimizedContent %} {% if block.showLargerVersionInPopup %} diff --git a/templates/_site/_snippet/_content/_blocks/_table.twig b/templates/_site/_snippet/_content/_blocks/_table.twig new file mode 100644 index 00000000..b7757eea --- /dev/null +++ b/templates/_site/_snippet/_content/_blocks/_table.twig @@ -0,0 +1,30 @@ +{% if block.blockTitle|length %} +

{{ block.blockTitle }}

+{% endif %} +{% if block.table|length %} +
+
+
+ + + {% for col in block.table.columns %} + + {% endfor %} + + + + + {% for row in block.table.rows %} + + {% for cell in row %} + + {% endfor %} + + {% endfor %} + +
{{ col.heading }}
+ {{ cell }} +
+ + +{% endif %} \ No newline at end of file diff --git a/templates/_site/_snippet/_content/_defaultHeader.twig b/templates/_site/_snippet/_content/_defaultHeader.twig index 1ea1579c..281643c2 100644 --- a/templates/_site/_snippet/_content/_defaultHeader.twig +++ b/templates/_site/_snippet/_content/_defaultHeader.twig @@ -1,26 +1,55 @@ -
+
-
-
+
+ {% if entry.headerImage|length %} + {% set headerImage = entry.headerImage.one() %} + {% set optimizedImage = headerImage.optimizedContent %} +
+ +
+ {% if craft.imageOptimize.serverSupportsWebP() and headerImage.extension != 'svg' and headerImage.extension != 'gif' %} + + {% endif %} + {% if headerImage.extension == 'svg' or headerImage.extension == 'gif' %} + + {% else %} + + {% endif %} +
+ {#{% if headerImage.imageCopyright|length or headerImage.imageCaption|length %} +
+
+ {% if headerImage.imageCaption|length %} + {{ headerImage.imageCaption }} + {% endif %} + {% if headerImage.imageCopyright|length and headerImage.imageCaption|length %} + - + {% endif %} + {% if headerImage.imageCopyright|length %} + {{ headerImage.imageCopyright }} + {% endif %} +
+
+ {% endif %}#} +
+
+ {% endif %} +
{% block headerText %} {% include '_site/_snippet/_nav/_breadcrumb' %} {% include '_site/_snippet/_content/_pageTitle' %} {% include '_site/_snippet/_content/_intro' %} {% endblock %} -
-
- {% block extraContent %} - {% if entry.heroImage|length %} - {% set heroImage = entry.heroImage.one() %} - {% set optimizedHero = heroImage.optimizedHero %} - - {% if craft.imageOptimize.serverSupportsWebP() and heroImage.extension != 'svg' %} - - {% endif %} - - - {% endif %} - {% endblock %} + {% block extraContent %}{% endblock %}
diff --git a/templates/_site/_snippet/_content/_hero.twig b/templates/_site/_snippet/_content/_hero.twig index 1e5fccf2..847314a8 100644 --- a/templates/_site/_snippet/_content/_hero.twig +++ b/templates/_site/_snippet/_content/_hero.twig @@ -14,7 +14,7 @@ {% if hero.ctas|length %}
{% for cta in hero.ctas.all() %} -
{{ cta.linkIt.getLink() }}
+
{{ cta.linkit.getLink() }}
{% endfor %}
{% endif %} diff --git a/templates/_site/_snippet/_content/_socialShare.twig b/templates/_site/_snippet/_content/_socialShare.twig index 40fd8fb5..489230e9 100644 --- a/templates/_site/_snippet/_content/_socialShare.twig +++ b/templates/_site/_snippet/_content/_socialShare.twig @@ -4,21 +4,21 @@
  • -
  • -
  • +
    + {% include "_site/_snippet/_nav/_language" %} +
    {% include '_site/_snippet/_nav/_flyout' %}
    diff --git a/templates/_site/_snippet/_global/_footer.twig b/templates/_site/_snippet/_global/_footer.twig index 7f90a55c..5db80c35 100644 --- a/templates/_site/_snippet/_global/_footer.twig +++ b/templates/_site/_snippet/_global/_footer.twig @@ -29,6 +29,14 @@ {% endif %}
    {% endif %} + {% if socialMedia.facebook or socialMedia.instagram or socialMedia.linkedin or socialMedia.twitter or socialMedia.youtube %} +
    +
    {{ 'Volg ons: '|t }}
    +
      + {% include '_site/_snippet/_content/_socialMedia' %} +
    +
    + {% endif %}
    {% if not systemOffline %} diff --git a/templates/_site/_snippet/_global/_header.twig b/templates/_site/_snippet/_global/_header.twig index 0edaa872..8bb41e70 100644 --- a/templates/_site/_snippet/_global/_header.twig +++ b/templates/_site/_snippet/_global/_header.twig @@ -9,8 +9,12 @@
    diff --git a/templates/jsPlugins/ajaxsearch.twig b/templates/jsPlugins/ajaxsearch.twig index 234cd941..b09e55ea 100644 --- a/templates/jsPlugins/ajaxsearch.twig +++ b/templates/jsPlugins/ajaxsearch.twig @@ -87,29 +87,111 @@ + data-s-ajax-search-no-result-template="noresult__templatecb" + data-s-ajax-search-typed-text-template="typed-text__templatecb" /> + + + + + + + + +
    +
    +
    +

    Transfer selected id to hidden input

    +
    + + + +
    +