diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 2cfd768..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,57 +0,0 @@ -version: 2.1 - -orbs: - # Hold off on 8.2.x+ until the fix for https://github.com/CircleCI-Public/aws-ecr-orb/issues/256 - # is in a tagged version. - aws-ecr: circleci/aws-ecr@8.1.3 - aws-ecs: circleci/aws-ecs@3.2.0 - -executors: - outlandish: - machine: - image: ubuntu-2004:edge - -workflows: - deploy-staging: - jobs: - - aws-ecr/build-and-push-image: - executor: outlandish - context: - - ecs-deploys - filters: - branches: - only: - - develop - repo: 'staging-wpackagist' - tag: 'staging,staging-${CIRCLE_SHA1}' - extra-build-args: '--build-arg env=stg' - - aws-ecs/deploy-service-update: - context: - - ecs-deploys - requires: - - aws-ecr/build-and-push-image - family: 'ol-ecs-staging-wpackagist' - cluster: 'ol-ecs-staging-shared' - service-name: 'staging-wpackagist' - - deploy-production: - jobs: - - aws-ecr/build-and-push-image: - executor: outlandish - context: - - ecs-deploys - filters: - branches: - only: - - main - repo: 'production-wpackagist' - tag: 'production,production-${CIRCLE_SHA1}' - extra-build-args: '--build-arg env=prod' - - aws-ecs/deploy-service-update: - context: - - ecs-deploys - requires: - - aws-ecr/build-and-push-image - family: 'ol-ecs-production-wpackagist' - cluster: 'ol-ecs-production-shared' - service-name: 'production-wpackagist' diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b6938ad --- /dev/null +++ b/.dockerignore @@ -0,0 +1,57 @@ +# Git +.git +.gitignore + +# Docker +docker-compose.yml +Dockerfile +.dockerignore + +# CI/CD +.circleci/ +cloudbuild.yaml + +# Documentation +README.md +FUNDING.yml +LICENSE +packages/Readme.md +scratch-info.txt + +# Local development +.env.local +.env.*.local +.env.postgres.local +local_data +Makefile + +# IDE +.editorconfig +.idea +.vscode +.devcontainer/ +*.swp +*.swo +*~ + +# Cache and logs +var/cache/* +var/log/* +!var/cache/.gitkeep +!var/log/.gitkeep + +# Composer +composer.phar + +# Testing +phpunit.xml +.phpunit.result.cache +tests + +# Node modules (if any) +node_modules + +# OS files +.DS_Store +Thumbs.db + diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..96cad77 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +* @wpengine/wp-updater james.dominy@wpengine.com + +#jira:APIH is where issues related to this repository should be ticketed diff --git a/.gitignore b/.gitignore index 3ba67fb..f74fcd0 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ /.env.local.php /.env.*.local /config/secrets/prod/prod.decrypt.private.php +/config/reference.php /public/bundles/ /vendor/ ###< symfony/framework-bundle ### @@ -22,3 +23,7 @@ # Apache-specific user and not implode at runtime when they want to write cache files. /var/* !/var/cache/twig/.gitkeep + +/local_data/* +!/local_data/.gitkeep +.DS_Store diff --git a/Dockerfile b/Dockerfile index 7523059..4eb5226 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,25 @@ -FROM php:8.1-apache +FROM php:8.5-apache ARG env RUN test -n "$env" -# Install the AWS CLI - needed to load in secrets safely from S3. See https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/ -RUN apt-get update -qq && apt-get install -y awscli && \ - rm -rf /var/lib/apt/lists/* /var/cache/apk/* +ARG target=aws + +RUN if [ "$target" = "aws" ]; then \ + # Install the AWS CLI - needed to load in secrets safely from S3. \ + echo Building for target=aws && \ + apt-get update -qq && apt-get install -y awscli && \ + rm -rf /var/lib/apt/lists/* /var/cache/apk/*; \ + elif [ "$target" = "gcp" ]; then \ + # Install the gcloud CLI - needed to get secrets from Google Secret Manager \ + echo Building for target=gcp && \ + apt-get update -qq && \ + apt-get install -y curl gnupg apt-transport-https ca-certificates && \ + echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \ + curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg && \ + apt-get update -qq && apt-get install -y google-cloud-cli && \ + rm -rf /var/lib/apt/lists/* /var/cache/apk/*; \ + fi # Install svn client, a requirement for the current native exec approach; git for # Composer pulls; libpq-dev for Postgres; libicu-dev for intl; libonig-dev for mbstring. @@ -17,8 +31,6 @@ RUN apt-get update -qq && \ RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-install intl mbstring pdo_pgsql zip -RUN docker-php-ext-enable opcache - RUN pecl install redis && rm -rf /tmp/pear && docker-php-ext-enable redis # Get latest Composer @@ -41,4 +53,13 @@ COPY ./config/php/php.ini /usr/local/etc/php/ RUN mkdir /tmp/twig RUN chmod -R 777 /tmp/twig +RUN chown -R www-data:www-data /var/www/html +# USER www-data + RUN APP_ENV=${env} composer install --no-interaction --quiet --optimize-autoloader --no-dev + +# Make entrypoint scripts executable +RUN chmod +x /var/www/html/deploy/*.sh || true + +# Use web_entrypoint.sh directly (handles all platforms: AWS, GCP, Docker) +CMD ["/var/www/html/deploy/web_entrypoint.sh"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..50f825d --- /dev/null +++ b/Makefile @@ -0,0 +1,43 @@ +# Makefile for wpackagist + +DOCKER := $(shell [[ -x `which docker` ]] && which docker || which podman ) + +# Default environment variables +APP_ENV ?= prod +LABEL ?= stg + +.PHONY: help build-local build-aws build-gcp clean + +help: + @echo "Available targets:" + @echo " build-local - Build Docker image for local development" + @echo " build-aws - Build Docker image for AWS deployment" + @echo " build-gcp LABEL=[stg|prd] - Build Docker image for GCP for local testing; LABEL=stg is the default" + @echo " clean - Remove local Docker images" + +build-local: + $(DOCKER) build \ + --build-arg env=dev \ + --build-arg target=local \ + --label arch=$(shell uname -m) \ + -t wpackagist:local \ + . + +build-aws: + $(DOCKER) build \ + --build-arg env=prod \ + --build-arg target=aws \ + --label arch=$(shell uname -m) \ + -t wpackagist:aws \ + . + +build-gcp: + $(DOCKER) build \ + --build-arg env=$(APP_ENV) \ + --build-arg target=gcp \ + --label arch=$(shell uname -m) \ + -t wpackagist:gcp-$(LABEL) \ + . + +clean: + docker rmi -f wpackagist:local wpackagist:aws wpackagist:gcp || true diff --git a/composer.json b/composer.json index b9bfb2a..4005b30 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "Install and manage WordPress plugins with Composer", "config": { "platform": { - "php": "8.0.28" + "php": "8.5.2" }, "sort-packages": true, "allow-plugins": { @@ -12,7 +12,7 @@ }, "minimum-stability": "stable", "require": { - "php": "^8.0", + "php": "^8.5", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", @@ -21,27 +21,27 @@ "ext-pdo_sqlite": "*", "ext-redis": "*", "ext-simplexml": "*", - "babdev/pagerfanta-bundle": "^3.0", - "composer/composer": "^1.10.19", - "composer/package-versions-deprecated": "^1.11", - "doctrine/dbal": "^2.10.2", - "doctrine/doctrine-bundle": "^2.6", - "doctrine/doctrine-migrations-bundle": "^3.2", - "doctrine/orm": "^2.12", + "babdev/pagerfanta-bundle": "^4.0", + "composer/composer": "^2.0", + "doctrine/dbal": "^4.0", + "doctrine/doctrine-bundle": "^2.13", + "doctrine/doctrine-migrations-bundle": "^3.3", + "doctrine/orm": "^3.0", "guzzlehttp/guzzle-services": "^1.1.3", - "pagerfanta/doctrine-orm-adapter": "^3.7", + "pagerfanta/doctrine-orm-adapter": "^4.0", "pagerfanta/twig": "^3.0", "rarst/wporg-client": "~0.5", - "symfony/config": "^5.0", - "symfony/console": "^5.0", - "symfony/dotenv": "^5.0", - "symfony/filesystem": "^5.0", - "symfony/flex": "^1.6", - "symfony/form": "^5.0", - "symfony/monolog-bundle": "^3.6", - "symfony/security-csrf": "^5.0", - "symfony/twig-bundle": "^5.4", - "symfony/yaml": "^5.0", + "symfony/config": "^7.2", + "symfony/console": "^7.2", + "symfony/dotenv": "^7.2", + "symfony/filesystem": "^7.2", + "symfony/flex": "^2.0", + "symfony/form": "^7.2", + "symfony/monolog-bundle": "^3.10", + "symfony/security-csrf": "^7.2", + "symfony/twig-bundle": "^7.2", + "symfony/var-exporter": "^7.4", + "symfony/yaml": "^7.2", "twig/extra-bundle": "^3.4", "twig/twig": "^3.14" }, diff --git a/composer.lock b/composer.lock index 53ce881..5da4bc4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,56 +4,59 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3fe2c0335fb2c878fd851df3ffd163e7", + "content-hash": "308ce141c64415dbfbf1d684165c2f18", "packages": [ { "name": "babdev/pagerfanta-bundle", - "version": "v3.8.0", + "version": "v4.6.0", "source": { "type": "git", "url": "https://github.com/BabDev/PagerfantaBundle.git", - "reference": "39df12df63177fee40c17c6efff8d4110bea3c94" + "reference": "ea3eb6a3f9d838de73254683b1a57014877d2ff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BabDev/PagerfantaBundle/zipball/39df12df63177fee40c17c6efff8d4110bea3c94", - "reference": "39df12df63177fee40c17c6efff8d4110bea3c94", + "url": "https://api.github.com/repos/BabDev/PagerfantaBundle/zipball/ea3eb6a3f9d838de73254683b1a57014877d2ff3", + "reference": "ea3eb6a3f9d838de73254683b1a57014877d2ff3", "shasum": "" }, "require": { - "pagerfanta/core": "^3.1", - "php": "^7.4 || ^8.0", - "symfony/config": "^4.4 || ^5.4 || ^6.0", - "symfony/dependency-injection": "^4.4 || ^5.4 || ^6.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/http-foundation": "^4.4 || ^5.4 || ^6.0", - "symfony/http-kernel": "^4.4 || ^5.4 || ^6.0", - "symfony/polyfill-php80": "^1.15", - "symfony/property-access": "^4.4 || ^5.4 || ^6.0", - "symfony/routing": "^4.4 || ^5.4 || ^6.0" + "pagerfanta/core": "^3.7 || ^4.0", + "php": "^8.1", + "psr/container": "^1.0 || ^2.0", + "symfony/config": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/dependency-injection": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/http-foundation": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/http-kernel": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/property-access": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/routing": "^5.4 || ^6.4 || ^7.3 || ^8.0" }, "conflict": { - "pagerfanta/twig": "<3.1", - "twig/twig": "<1.35 || >=2.0,<2.5", + "jms/serializer": "<3.18", + "jms/serializer-bundle": "<4.2", + "pagerfanta/twig": "<3.7", + "symfony/serializer": "<5.4 || >=6.0,<6.4 || >=7.0,<7.3", + "symfony/translation": "<5.4 || >=6.0,<6.4 || >=7.0,<7.3", + "symfony/twig-bridge": "<5.4 || >=6.0,<6.4 || >=7.0,<7.3", + "symfony/twig-bundle": "<5.4 || >=6.0,<6.4 || >=7.0,<7.3", + "twig/twig": "<2.13", "white-october/pagerfanta-bundle": "*" }, "require-dev": { - "doctrine/annotations": "^1.8", - "jms/serializer": "^3.0", - "jms/serializer-bundle": "^3.0 || ^4.0", - "matthiasnoback/symfony-dependency-injection-test": "^4.3", - "pagerfanta/twig": "^3.1", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "1.10.15", - "phpstan/phpstan-phpunit": "1.3.13", - "phpstan/phpstan-symfony": "1.2.19", - "phpunit/phpunit": "9.6.8", - "symfony/phpunit-bridge": "^5.4 || ^6.0", - "symfony/serializer": "^4.4 || ^5.4 || ^6.0", - "symfony/translation": "^4.4 || ^5.4 || ^6.0", - "symfony/twig-bridge": "^4.4 || ^5.4 || ^6.0", - "symfony/twig-bundle": "^4.4 || ^5.4 || ^6.0", - "twig/twig": "^1.35 || ^2.5 || ^3.0" + "jms/serializer": "^3.18", + "jms/serializer-bundle": "^4.2 || ^5.0", + "matthiasnoback/symfony-dependency-injection-test": "^6.2", + "pagerfanta/twig": "^3.7 || ^4.0", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "2.1.32", + "phpstan/phpstan-phpunit": "2.0.8", + "phpstan/phpstan-symfony": "2.0.9", + "phpunit/phpunit": "10.5.58 || 11.5.44 || 12.4.4", + "symfony/serializer": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/translation": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/twig-bridge": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/twig-bundle": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "twig/twig": "^2.13 || ^3.0" }, "suggest": { "jms/serializer-bundle": "To use the Pagerfanta class with the JMS Serializer", @@ -79,7 +82,7 @@ ], "support": { "issues": "https://github.com/BabDev/PagerfantaBundle/issues", - "source": "https://github.com/BabDev/PagerfantaBundle/tree/v3.8.0" + "source": "https://github.com/BabDev/PagerfantaBundle/tree/v4.6.0" }, "funding": [ { @@ -87,20 +90,20 @@ "type": "github" } ], - "time": "2023-06-01T01:04:54+00:00" + "time": "2025-11-29T13:01:51+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.9", + "version": "1.5.10", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54" + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/1905981ee626e6f852448b7aaa978f8666c5bc54", - "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", "shasum": "" }, "require": { @@ -147,7 +150,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.9" + "source": "https://github.com/composer/ca-bundle/tree/1.5.10" }, "funding": [ { @@ -159,61 +162,44 @@ "type": "github" } ], - "time": "2025-11-06T11:46:17+00:00" + "time": "2025-12-08T15:06:51+00:00" }, { - "name": "composer/composer", - "version": "1.10.27", + "name": "composer/class-map-generator", + "version": "1.7.1", "source": { "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "f8f49191eec76f039b466aa1f161406fe43aff50" + "url": "https://github.com/composer/class-map-generator.git", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/f8f49191eec76f039b466aa1f161406fe43aff50", - "reference": "f8f49191eec76f039b466aa1f161406fe43aff50", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38" + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" }, - "bin": [ - "bin/composer" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\ClassMapGenerator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -221,28 +207,19 @@ "MIT" ], "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "homepage": "https://seld.be" } ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", + "description": "Utilities to scan PHP code and generate class maps.", "keywords": [ - "autoload", - "dependency", - "package" + "classmap" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/1.10.27" + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.7.1" }, "funding": [ { @@ -252,50 +229,80 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2023-09-29T08:50:23+00:00" + "time": "2025-12-29T13:15:25+00:00" }, { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", + "name": "composer/composer", + "version": "2.9.4", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + "url": "https://github.com/composer/composer.git", + "reference": "d4225153940b7c06f0e825195bdbdc312c67d917" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/composer/composer/zipball/d4225153940b7c06f0e825195bdbdc312c67d917", + "reference": "d4225153940b7c06f0e825195bdbdc312c67d917", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", + "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2.3 || ^3.3", + "composer/semver": "^3.3", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "ext-json": "*", + "justinrainbow/json-schema": "^6.5.1", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^3.3", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", + "symfony/polyfill-php84": "^1.30", + "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" + "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan-symfony": "^1.4.0", + "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0" }, - "type": "composer-plugin", + "suggest": { + "ext-curl": "Provides HTTP support (will fallback to PHP streams if missing)", + "ext-openssl": "Enables access to repositories and packages over HTTPS", + "ext-zip": "Allows direct extraction of ZIP archives (unzip/7z binaries will be used instead if available)", + "ext-zlib": "Enables gzip for HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", "extra": { - "class": "PackageVersions\\Installer", + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] + }, "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "2.9-dev" } }, "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "Composer\\": "src/Composer/" } }, "notification-url": "https://packagist.org/downloads/", @@ -304,18 +311,28 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "https://www.naderman.de" }, { "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/composer/issues", + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.9.4" }, "funding": [ { @@ -325,43 +342,41 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2022-01-17T14:14:24+00:00" + "time": "2026-01-22T13:08:50+00:00" }, { - "name": "composer/semver", - "version": "1.7.2", + "name": "composer/metadata-minifier", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Composer\\Semver\\": "src" + "Composer\\MetadataMinifier\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -369,33 +384,20 @@ "MIT" ], "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", + "description": "Small utility library that handles metadata minification and expansion.", "keywords": [ - "semantic", - "semver", - "validation", - "versioning" + "composer", + "compression" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/1.7.2" + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" }, "funding": [ { @@ -411,38 +413,47 @@ "type": "tidelift" } ], - "time": "2020-12-03T15:47:16+00:00" + "time": "2021-04-07T13:37:33+00:00" }, { - "name": "composer/spdx-licenses", - "version": "1.5.9", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Composer\\Spdx\\": "src" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -450,32 +461,22 @@ "MIT" ], "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" } ], - "description": "SPDX licenses list and validation library.", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "license", - "spdx", - "validator" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -491,34 +492,38 @@ "type": "tidelift" } ], - "time": "2025-05-12T21:07:07+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "composer/xdebug-handler", - "version": "1.4.6", + "name": "composer/semver", + "version": "3.4.4", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c" + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -527,19 +532,32 @@ ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "Restarts a process without Xdebug.", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "Xdebug", - "performance" + "semantic", + "semver", + "validation", + "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/1.4.6" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -549,123 +567,40 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2021-03-25T17:01:18+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { - "name": "doctrine/annotations", - "version": "1.14.4", + "name": "composer/spdx-licenses", + "version": "1.5.9", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", - "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "~1.4.10 || ^1.10.28", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7", - "vimeo/psalm": "^4.30 || ^5.14" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.4" - }, - "abandoned": true, - "time": "2024-09-05T10:15:52+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + "Composer\\Spdx\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -674,88 +609,76 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", + "description": "SPDX licenses list and validation library.", "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" + "license", + "spdx", + "validator" ], "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/composer", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "abandoned": true, - "time": "2022-05-20T20:07:39+00:00" + "time": "2025-05-12T21:07:07+00:00" }, { - "name": "doctrine/collections", - "version": "1.8.0", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2b44dd4cbca8b5744327de78bafef5945c7e7b5e", - "reference": "2b44dd4cbca8b5744327de78bafef5945c7e7b5e", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1.3 || ^8.0" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "phpstan/phpstan": "^1.4.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", - "vimeo/psalm": "^4.22" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -764,72 +687,66 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "url": "https://packagist.com", + "type": "custom" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "url": "https://github.com/composer", + "type": "github" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" } ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.8.0" - }, - "time": "2022-09-01T20:12:10+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "doctrine/common", - "version": "3.5.0", + "name": "doctrine/collections", + "version": "2.6.0", "source": { "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5" + "url": "https://github.com/doctrine/collections.git", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/d9ea4a54ca2586db781f0265d36bea731ac66ec5", - "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5", + "url": "https://api.github.com/repos/doctrine/collections/zipball/7713da39d8e237f28411d6a616a3dce5e20d5de2", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2", "shasum": "" }, "require": { - "doctrine/persistence": "^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0" + "doctrine/deprecations": "^1", + "php": "^8.1", + "symfony/polyfill-php84": "^1.30" }, "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "doctrine/collections": "^1", - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^6.1", - "vimeo/psalm": "^4.4" + "doctrine/coding-standard": "^14", + "ext-json": "*", + "phpstan/phpstan": "^2.1.30", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpunit/phpunit": "^10.5.58 || ^11.5.42 || ^12.4" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\": "src" + "Doctrine\\Common\\Collections\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -856,22 +773,19 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" } ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", "keywords": [ - "common", - "doctrine", + "array", + "collections", + "iterators", "php" ], "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.5.0" + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.6.0" }, "funding": [ { @@ -883,54 +797,52 @@ "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", "type": "tidelift" } ], - "time": "2025-01-01T22:12:03+00:00" + "time": "2026-01-15T10:01:58+00:00" }, { "name": "doctrine/dbal", - "version": "2.13.9", + "version": "4.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", "shasum": "" }, "require": { - "doctrine/cache": "^1.0|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.4.6", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.22.0" + "doctrine/coding-standard": "14.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "11.5.23", + "slevomat/coding-standard": "8.24.0", + "squizlabs/php_codesniffer": "4.0.0", + "symfony/cache": "^6.3.8|^7.0|^8.0", + "symfony/console": "^5.4|^6.3|^7.0|^8.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -973,14 +885,13 @@ "queryobject", "sasql", "sql", - "sqlanywhere", "sqlite", "sqlserver", "sqlsrv" ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.9" + "source": "https://github.com/doctrine/dbal/tree/4.4.1" }, "funding": [ { @@ -996,7 +907,7 @@ "type": "tidelift" } ], - "time": "2022-05-02T20:28:55+00:00" + "time": "2025-12-04T10:11:03+00:00" }, { "name": "doctrine/deprecations", @@ -1048,56 +959,63 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.7.2", + "version": "2.18.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "22d53b2c5ad03929628fb4a928b01135585b7179" + "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/22d53b2c5ad03929628fb4a928b01135585b7179", - "reference": "22d53b2c5ad03929628fb4a928b01135585b7179", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0ff098b29b8b3c68307c8987dcaed7fd829c6546", + "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546", "shasum": "" }, "require": { - "doctrine/annotations": "^1", - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^2.13.1 || ^3.3.2", - "doctrine/persistence": "^2.2 || ^3", + "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/deprecations": "^1.0", + "doctrine/persistence": "^3.1 || ^4", "doctrine/sql-formatter": "^1.0.1", - "php": "^7.1 || ^8.0", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "symfony/config": "^4.4.3 || ^5.4 || ^6.0", - "symfony/console": "^4.4 || ^5.4 || ^6.0", - "symfony/dependency-injection": "^4.4.18 || ^5.4 || ^6.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^4.4.22 || ^5.4 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0", - "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + "php": "^8.1", + "symfony/cache": "^6.4 || ^7.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/service-contracts": "^2.5 || ^3" }, "conflict": { - "doctrine/orm": "<2.11 || >=3.0", - "twig/twig": "<1.34 || >=2.0,<2.4" + "doctrine/annotations": ">=3.0", + "doctrine/cache": "< 1.11", + "doctrine/orm": "<2.17 || >=4.0", + "symfony/var-exporter": "< 6.4.1 || 7.0.0", + "twig/twig": "<2.13 || >=3.0 <3.0.4" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "doctrine/orm": "^2.11 || ^3.0", + "doctrine/annotations": "^1 || ^2", + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^14", + "doctrine/orm": "^2.17 || ^3.1", "friendsofphp/proxy-manager-lts": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3 || ^10.0", - "psalm/plugin-phpunit": "^0.16.1", - "psalm/plugin-symfony": "^3", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.53 || ^12.3.10", "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^6.1", - "symfony/property-info": "^4.4 || ^5.4 || ^6.0", - "symfony/proxy-manager-bridge": "^4.4 || ^5.4 || ^6.0", - "symfony/security-bundle": "^4.4 || ^5.4 || ^6.0", - "symfony/twig-bridge": "^4.4 || ^5.4 || ^6.0", - "symfony/validator": "^4.4 || ^5.4 || ^6.0", - "symfony/web-profiler-bundle": "^4.4 || ^5.4 || ^6.0", - "symfony/yaml": "^4.4 || ^5.4 || ^6.0", - "twig/twig": "^1.34 || ^2.12 || ^3.0", - "vimeo/psalm": "^4.7" + "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/messenger": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/stopwatch": "^6.4 || ^7.0", + "symfony/string": "^6.4 || ^7.0", + "symfony/twig-bridge": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "symfony/var-exporter": "^6.4.1 || ^7.0.1", + "symfony/web-profiler-bundle": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0", + "twig/twig": "^2.14.7 || ^3.0.4" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -1107,7 +1025,7 @@ "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" + "Doctrine\\Bundle\\DoctrineBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1142,7 +1060,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.7.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.18.2" }, "funding": [ { @@ -1158,7 +1076,7 @@ "type": "tidelift" } ], - "time": "2022-12-07T12:07:11+00:00" + "time": "2025-12-20T21:35:32+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1247,30 +1165,29 @@ }, { "name": "doctrine/event-manager", - "version": "1.2.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + "reference": "c07799fcf5ad362050960a0fd068dded40b1e312" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/c07799fcf5ad362050960a0fd068dded40b1e312", + "reference": "c07799fcf5ad362050960a0fd068dded40b1e312", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.24" + "doctrine/coding-standard": "^14", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/phpstan": "^2.1.32", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -1319,7 +1236,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + "source": "https://github.com/doctrine/event-manager/tree/2.1.0" }, "funding": [ { @@ -1335,7 +1252,7 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:51:15+00:00" + "time": "2026-01-17T22:40:21+00:00" }, { "name": "doctrine/inflector", @@ -1429,30 +1346,29 @@ }, { "name": "doctrine/instantiator", - "version": "1.5.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/23da848e1a2308728fe5fdddabf4be17ff9720c7", + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.4" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", + "doctrine/coding-standard": "^14", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -1479,7 +1395,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "source": "https://github.com/doctrine/instantiator/tree/2.1.0" }, "funding": [ { @@ -1495,32 +1411,31 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2026-01-05T06:47:08+00:00" }, { "name": "doctrine/lexer", - "version": "2.1.1", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.21" + "vimeo/psalm": "^5.21" }, "type": "library", "autoload": { @@ -1557,7 +1472,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.1" + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { @@ -1573,49 +1488,52 @@ "type": "tidelift" } ], - "time": "2024-02-05T11:35:39+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { "name": "doctrine/migrations", - "version": "3.4.3", + "version": "3.9.5", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "362f07ff732a2b4498be919561536800cec29500" + "reference": "1b823afbc40f932dae8272574faee53f2755eac5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/362f07ff732a2b4498be919561536800cec29500", - "reference": "362f07ff732a2b4498be919561536800cec29500", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b823afbc40f932dae8272574faee53f2755eac5", + "reference": "1b823afbc40f932dae8272574faee53f2755eac5", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/dbal": "^2.11 || ^3.0", + "doctrine/dbal": "^3.6 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", - "doctrine/event-manager": "^1.0", - "friendsofphp/proxy-manager-lts": "^1.0", - "php": "^7.2 || ^8.0", + "doctrine/event-manager": "^1.2 || ^2.0", + "php": "^8.1", "psr/log": "^1.1.3 || ^2 || ^3", - "symfony/console": "^3.4 || ^4.4.16 || ^5.0 || ^6.0", - "symfony/stopwatch": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.2 || ^7.0 || ^8.0" + }, + "conflict": { + "doctrine/orm": "<2.12 || >=4" }, "require-dev": { - "doctrine/coding-standard": "^9", - "doctrine/orm": "^2.6", - "doctrine/persistence": "^1.3 || ^2.0", + "doctrine/coding-standard": "^14", + "doctrine/orm": "^2.13 || ^3", + "doctrine/persistence": "^2 || ^3 || ^4", "doctrine/sql-formatter": "^1.0", - "ergebnis/composer-normalize": "^2.9", "ext-pdo_sqlite": "*", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpstan/phpstan-symfony": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.4", - "symfony/cache": "^3.4.26 || ^4.2.12 || ^5.0 || ^6.0", - "symfony/process": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "fig/log-test": "^1", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpstan/phpstan-symfony": "^2", + "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "suggest": { "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", @@ -1625,15 +1543,9 @@ "bin/doctrine-migrations" ], "type": "library", - "extra": { - "composer-normalize": { - "indent-size": 4, - "indent-style": "space" - } - }, "autoload": { "psr-4": { - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + "Doctrine\\Migrations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1663,7 +1575,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.4.3" + "source": "https://github.com/doctrine/migrations/tree/3.9.5" }, "funding": [ { @@ -1679,65 +1591,52 @@ "type": "tidelift" } ], - "time": "2023-09-07T12:23:11+00:00" + "time": "2025-11-20T11:15:36+00:00" }, { "name": "doctrine/orm", - "version": "2.20.9", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "87f1ba74e04c8694ca00099f3c64706ebac0b114" + "reference": "2148940290e4c44b9101095707e71fb590832fa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/87f1ba74e04c8694ca00099f3c64706ebac0b114", - "reference": "87f1ba74e04c8694ca00099f3c64706ebac0b114", + "url": "https://api.github.com/repos/doctrine/orm/zipball/2148940290e4c44b9101095707e71fb590832fa5", + "reference": "2148940290e4c44b9101095707e71fb590832fa5", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/cache": "^1.12.1 || ^2.1.1", - "doctrine/collections": "^1.5 || ^2.1", - "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2", "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^2 || ^3", - "doctrine/persistence": "^2.4 || ^3", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1 || ^4", "ext-ctype": "*", - "php": "^7.1 || ^8.0", + "php": "^8.1", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "doctrine/annotations": "<1.13 || >= 3.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.3.9 || ^7.0 || ^8.0" }, "require-dev": { - "doctrine/annotations": "^1.13 || ^2", - "doctrine/coding-standard": "^9.0.2 || ^14.0", - "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/extension-installer": "~1.1.0 || ^1.4", - "phpstan/phpstan": "~1.4.10 || 2.1.23", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "doctrine/coding-standard": "^14.0", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.1.23", + "phpstan/phpstan-deprecation-rules": "^2", + "phpunit/phpunit": "^10.5.0 || ^11.5", "psr/log": "^1 || ^2 || ^3", - "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0" + "symfony/cache": "^5.4 || ^6.2 || ^7.0 || ^8.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" }, - "bin": [ - "bin/doctrine" - ], "type": "library", "autoload": { "psr-4": { @@ -1778,40 +1677,37 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.20.9" + "source": "https://github.com/doctrine/orm/tree/3.6.1" }, - "time": "2025-11-29T14:03:56+00:00" + "time": "2026-01-09T05:28:15+00:00" }, { "name": "doctrine/persistence", - "version": "3.4.3", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "d59e6ef7caffe6a30f4b6f9e9079a75f52c64ae0" + "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/d59e6ef7caffe6a30f4b6f9e9079a75f52c64ae0", - "reference": "d59e6ef7caffe6a30f4b6f9e9079a75f52c64ae0", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", "shasum": "" }, "require": { "doctrine/event-manager": "^1 || ^2", - "php": "^7.2 || ^8.0", + "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, - "conflict": { - "doctrine/common": "<2.10" - }, "require-dev": { - "doctrine/coding-standard": "^12 || ^14", - "doctrine/common": "^3.0", - "phpstan/phpstan": "^1 || 2.1.30", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8.5.38 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.58 || ^12", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -1860,7 +1756,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.4.3" + "source": "https://github.com/doctrine/persistence/tree/4.1.1" }, "funding": [ { @@ -1876,30 +1772,30 @@ "type": "tidelift" } ], - "time": "2025-10-21T15:21:39+00:00" + "time": "2025-10-16T20:13:18+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.3.0", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "3447381095d32a171fe3a58323749f44dbb5ac7d" + "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/3447381095d32a171fe3a58323749f44dbb5ac7d", - "reference": "3447381095d32a171fe3a58323749f44dbb5ac7d", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.0", - "phpunit/phpunit": "^8.5 || ^9.6", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "^14", + "ergebnis/phpunit-slow-test-detector": "^2.20", + "phpstan/phpstan": "^2.1.31", + "phpunit/phpunit": "^10.5.58" }, "bin": [ "bin/sql-formatter" @@ -1929,91 +1825,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.3.0" - }, - "time": "2024-05-06T21:49:18+00:00" - }, - { - "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.19", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "c20299aa9f48a622052964a75c5a4cef017398b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/c20299aa9f48a622052964a75c5a4cef017398b2", - "reference": "c20299aa9f48a622052964a75c5a4cef017398b2", - "shasum": "" - }, - "require": { - "laminas/laminas-code": "~3.4.1|^4.0", - "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0|^8.0" - }, - "conflict": { - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "replace": { - "ocramius/proxy-manager": "^2.1" - }, - "require-dev": { - "ext-phar": "*", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/Ocramius/ProxyManager", - "name": "ocramius/proxy-manager" - } - }, - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - } - ], - "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", - "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.19" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2025-10-28T10:28:17+00:00" + "time": "2025-10-26T09:35:14+00:00" }, { "name": "guzzlehttp/command", @@ -2598,30 +2412,40 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.3.0", + "version": "6.6.4", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2eeb75d21cf73211335888e7f5e6fd7440723ec7", + "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-json": "*", + "marc-mabe/php-enum": "^4.4", + "php": "^7.2 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "^23.2", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" }, "bin": [ "bin/validate-json" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -2650,121 +2474,129 @@ } ], "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "homepage": "https://github.com/jsonrainbow/json-schema", "keywords": [ "json", "schema" ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.4" }, - "time": "2024-07-06T21:00:26+00:00" + "time": "2025-12-19T15:01:32+00:00" }, { - "name": "laminas/laminas-code", - "version": "4.7.1", + "name": "marc-mabe/php-enum", + "version": "v4.7.2", "source": { "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "91aabc066d5620428120800c0eafc0411e441a62" + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62", - "reference": "91aabc066d5620428120800c0eafc0411e441a62", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", "shasum": "" }, "require": { - "php": ">=7.4, <8.2" + "ext-reflection": "*", + "php": "^7.1 | ^8.0" }, "require-dev": { - "doctrine/annotations": "^1.13.2", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.3.0", - "laminas/laminas-stdlib": "^3.6.1", - "phpunit/phpunit": "^9.5.10", - "psalm/plugin-phpunit": "^0.17.0", - "vimeo/psalm": "^4.13.1" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, "autoload": { - "files": [ - "polyfill/ReflectionEnumPolyfill.php" - ], "psr-4": { - "Laminas\\Code\\": "src/" - } + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev", + "authors": [ + { + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" + } + ], + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", "keywords": [ - "code", - "laminas", - "laminasframework" + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" ], "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-code/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-code/issues", - "rss": "https://github.com/laminas/laminas-code/releases.atom", - "source": "https://github.com/laminas/laminas-code" + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2022-11-21T01:32:31+00:00" + "time": "2025-09-14T11:18:39+00:00" }, { "name": "monolog/monolog", - "version": "2.10.0", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "5cf826f2991858b54d5c3809bee745560a1042a7" + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5cf826f2991858b54d5c3809bee745560a1042a7", - "reference": "5cf826f2991858b54d5c3809bee745560a1042a7", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.38 || ^9.6.19", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2787,7 +2619,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -2815,7 +2647,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.10.0" + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, "funding": [ { @@ -2827,7 +2659,7 @@ "type": "tidelift" } ], - "time": "2024-11-12T12:43:37+00:00" + "time": "2026-01-02T08:56:05+00:00" }, { "name": "pagerfanta/core", @@ -2876,29 +2708,26 @@ }, { "name": "pagerfanta/doctrine-orm-adapter", - "version": "v3.8.0", + "version": "v4.8.0", "source": { "type": "git", "url": "https://github.com/Pagerfanta/doctrine-orm-adapter.git", - "reference": "d0865fbfc7f8dd6e4c16f76135f904c60c3af3b5" + "reference": "0d7374a1dc10a5ddf8878cb791f1b220cd072714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Pagerfanta/doctrine-orm-adapter/zipball/d0865fbfc7f8dd6e4c16f76135f904c60c3af3b5", - "reference": "d0865fbfc7f8dd6e4c16f76135f904c60c3af3b5", + "url": "https://api.github.com/repos/Pagerfanta/doctrine-orm-adapter/zipball/0d7374a1dc10a5ddf8878cb791f1b220cd072714", + "reference": "0d7374a1dc10a5ddf8878cb791f1b220cd072714", "shasum": "" }, "require": { - "doctrine/orm": "^2.8", - "pagerfanta/core": "^3.0", - "php": "^7.4 || ^8.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0" + "doctrine/orm": "^2.14 || ^3.0", + "pagerfanta/core": "^3.7 || ^4.0", + "php": "^8.1" }, "require-dev": { - "doctrine/annotations": "^1.11.1", - "doctrine/cache": "^1.11 || ^2.0", - "phpunit/phpunit": "^9.6 || ^10.0", - "symfony/cache": "^4.4 || ^5.4 || ^6.0" + "phpunit/phpunit": "^10.5", + "symfony/cache": "^5.4 || ^6.4 || ^7.3 || ^8.0" }, "type": "library", "autoload": { @@ -2920,9 +2749,9 @@ "pagerfanta" ], "support": { - "source": "https://github.com/Pagerfanta/doctrine-orm-adapter/tree/v3.8.0" + "source": "https://github.com/Pagerfanta/doctrine-orm-adapter/tree/v4.8.0" }, - "time": "2023-04-15T16:39:14+00:00" + "time": "2026-01-22T13:44:13+00:00" }, { "name": "pagerfanta/twig", @@ -3020,22 +2849,27 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -3062,9 +2896,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -3278,30 +3112,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3322,9 +3156,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "ralouphie/getallheaders", @@ -3412,6 +3246,79 @@ }, "time": "2022-06-20T08:42:06+00:00" }, + { + "name": "react/promise", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" + }, { "name": "seld/jsonlint", "version": "1.11.0", @@ -3470,38 +3377,94 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2024-07-11T14:55:45+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" } ], - "time": "2024-07-11T14:55:45+00:00" + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + }, + "time": "2022-08-31T10:31:18+00:00" }, { - "name": "seld/phar-utils", - "version": "1.2.1", + "name": "seld/signal-handler", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "2.x-dev" } }, "autoload": { "psr-4": { - "Seld\\PharUtils\\": "src/" + "Seld\\Signal\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3511,46 +3474,54 @@ "authors": [ { "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "PHAR file format utilities, for when PHP phars you up", + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", "keywords": [ - "phar" + "posix", + "sigint", + "signal", + "sigterm", + "unix" ], "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, - "time": "2022-08-31T10:31:18+00:00" + "time": "2023-09-03T09:24:00+00:00" }, { "name": "symfony/cache", - "version": "v6.0.19", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "81ca309f056e836480928b20280ec52ce8369bb3" + "reference": "67ca35eaa52dd9c1f07a42d459b5a2544dd29b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/81ca309f056e836480928b20280ec52ce8369bb3", - "reference": "81ca309f056e836480928b20280ec52ce8369bb3", + "url": "https://api.github.com/repos/symfony/cache/zipball/67ca35eaa52dd9c1f07a42d459b5a2544dd29b34", + "reference": "67ca35eaa52dd9c1f07a42d459b5a2544dd29b34", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "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": "^5.4|^6.0" + "symfony/cache-contracts": "^3.6", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "doctrine/dbal": "<3.6", + "ext-redis": "<6.1", + "ext-relay": "<0.12.1", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" }, "provide": { "psr/cache-implementation": "2.0|3.0", @@ -3559,21 +3530,25 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3.0", - "predis/predis": "^1.1", + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, + "classmap": [ + "Traits/ValueWrapper.php" + ], "exclude-from-classmap": [ "/Tests/" ] @@ -3599,7 +3574,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.0.19" + "source": "https://github.com/symfony/cache/tree/v7.4.4" }, "funding": [ { @@ -3610,34 +3585,35 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-20T17:44:14+00:00" + "time": "2026-01-23T12:59:19+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.0.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348" + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", - "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/cache": "^3.0" }, - "suggest": { - "symfony/cache-implementation": "" - }, "type": "library", "extra": { "thanks": { @@ -3645,7 +3621,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -3678,7 +3654,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" }, "funding": [ { @@ -3694,42 +3670,38 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2025-03-13T15:25:07+00:00" }, { "name": "symfony/config", - "version": "v5.4.46", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "977c88a02d7d3f16904a81907531b19666a08e78" + "reference": "4275b53b8ab0cf37f48bf273dc2285c8178efdfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/977c88a02d7d3f16904a81907531b19666a08e78", - "reference": "977c88a02d7d3f16904a81907531b19666a08e78", + "url": "https://api.github.com/repos/symfony/config/zipball/4275b53b8ab0cf37f48bf273dc2285c8178efdfb", + "reference": "4275b53b8ab0cf37f48bf273dc2285c8178efdfb", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1|^8.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<4.4" + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3757,7 +3729,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.46" + "source": "https://github.com/symfony/config/tree/v7.4.4" }, "funding": [ { @@ -3768,61 +3740,60 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-30T07:58:02+00:00" + "time": "2026-01-13T11:36:38+00:00" }, { "name": "symfony/console", - "version": "v5.4.47", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", - "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3856,7 +3827,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.47" + "source": "https://github.com/symfony/console/tree/v7.4.4" }, "funding": [ { @@ -3867,56 +3838,52 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T11:30:55+00:00" + "time": "2026-01-13T11:36:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.0.20", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "359806e1adebd1c43e18e5ea22acd14bef7fcf8c" + "reference": "dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/359806e1adebd1c43e18e5ea22acd14bef7fcf8c", - "reference": "359806e1adebd1c43e18e5ea22acd14bef7fcf8c", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb", + "reference": "dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php81": "^1.22", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.6", + "symfony/var-exporter": "^6.4.20|^7.2.5|^8.0" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<5.4", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "psr/container-implementation": "1.1|2.0", "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3944,7 +3911,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.0.20" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.4" }, "funding": [ { @@ -3955,29 +3922,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-30T15:41:07+00:00" + "time": "2026-01-23T12:59:19+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.0.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" }, "type": "library", "extra": { @@ -3986,7 +3957,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -4011,7 +3982,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -4027,79 +3998,72 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.4.48", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "43ed5e31c9188e4f4d3845d16986db4a86644eef" + "reference": "3408d9fb7bda6c8db9f3e4099863c9017bcbc62d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/43ed5e31c9188e4f4d3845d16986db4a86644eef", - "reference": "43ed5e31c9188e4f4d3845d16986db4a86644eef", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/3408d9fb7bda6c8db9f3e4099863c9017bcbc62d", + "reference": "3408d9fb7bda6c8db9f3e4099863c9017bcbc62d", "shasum": "" }, "require": { - "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^2|^3", - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1|^4", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/dbal": "<2.13.1", + "doctrine/collections": "<1.8", + "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.7.4", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<4.4", - "symfony/form": "<5.4.38|>=6,<6.4.6", - "symfony/http-kernel": "<5", - "symfony/messenger": "<4.4", - "symfony/property-info": "<5", - "symfony/proxy-manager-bridge": "<4.4.19", - "symfony/security-bundle": "<5", - "symfony/security-core": "<5.3", - "symfony/validator": "<5.4.25|>=6,<6.2.12|>=6.3,<6.3.1" + "doctrine/orm": "<2.15", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", + "symfony/security-core": "<6.4", + "symfony/validator": "<7.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "doctrine/collections": "^1.0|^2.0", + "doctrine/collections": "^1.8|^2.0", "doctrine/data-fixtures": "^1.1|^2", - "doctrine/dbal": "^2.13.1|^3|^4", - "doctrine/orm": "^2.7.4|^3", + "doctrine/dbal": "^3.6|^4", + "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/doctrine-messenger": "^5.1|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/form": "^5.4.38|^6.4.6", - "symfony/http-kernel": "^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.0|^6.0", - "symfony/property-info": "^5.0|^6.0", - "symfony/proxy-manager-bridge": "^4.4|^5.0|^6.0", - "symfony/security-core": "^5.3|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", - "symfony/validator": "^5.4.25|~6.2.12|^6.3.1", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/doctrine-messenger": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.2|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -4127,7 +4091,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.4.48" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.4" }, "funding": [ { @@ -4138,34 +4102,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-20T10:49:45+00:00" + "time": "2026-01-20T16:42:42+00:00" }, { "name": "symfony/dotenv", - "version": "v5.4.48", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "08013403089c8a126c968179179b817a552841ab" + "reference": "1658a4d34df028f3d93bcdd8e81f04423925a364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/08013403089c8a126c968179179b817a552841ab", - "reference": "08013403089c8a126c968179179b817a552841ab", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/1658a4d34df028f3d93bcdd8e81f04423925a364", + "reference": "1658a4d34df028f3d93bcdd8e81f04423925a364", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.2" + }, + "conflict": { + "symfony/console": "<6.4", + "symfony/process": "<6.4" }, "require-dev": { - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4198,7 +4169,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.4.48" + "source": "https://github.com/symfony/dotenv/tree/v7.4.0" }, "funding": [ { @@ -4209,36 +4180,46 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-27T09:33:00+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "symfony/error-handler", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c7df52182f43a68522756ac31a532dd5b1e6db67" + "reference": "7620b97ec0ab1d2d6c7fb737aa55da411bea776a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c7df52182f43a68522756ac31a532dd5b1e6db67", - "reference": "c7df52182f43a68522756ac31a532dd5b1e6db67", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/7620b97ec0ab1d2d6c7fb737aa55da411bea776a", + "reference": "7620b97ec0ab1d2d6c7fb737aa55da411bea776a", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.4", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^7.4|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/console": "^7.4|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -4269,7 +4250,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.0.19" + "source": "https://github.com/symfony/error-handler/tree/v8.0.4" }, "funding": [ { @@ -4280,33 +4261,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-23T11:07:10+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a" + "reference": "99301401da182b6cfaa4700dbe9987bb75474b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", - "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99301401da182b6cfaa4700dbe9987bb75474b47", + "reference": "99301401da182b6cfaa4700dbe9987bb75474b47", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=8.4", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/security-http": "<7.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -4314,17 +4300,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4352,7 +4335,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.19" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.4" }, "funding": [ { @@ -4363,34 +4346,35 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-05T11:45:55+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.0.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "thanks": { @@ -4398,7 +4382,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -4431,7 +4415,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -4447,30 +4431,29 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:55:41+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.45", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", - "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4498,7 +4481,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.45" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -4509,31 +4492,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-22T13:05:35+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", - "version": "v5.4.45", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "63741784cd7b9967975eec610b256eed3ede022b" + "reference": "42e48eb02e07d5f3771d194d67da117eb824c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", - "reference": "63741784cd7b9967975eec610b256eed3ede022b", + "url": "https://api.github.com/repos/symfony/finder/zipball/42e48eb02e07d5f3771d194d67da117eb824c8c1", + "reference": "42e48eb02e07d5f3771d194d67da117eb824c8c1", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.4" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4561,7 +4549,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.45" + "source": "https://github.com/symfony/finder/tree/v8.0.4" }, "funding": [ { @@ -4572,40 +4560,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-28T13:32:08+00:00" + "time": "2026-01-12T12:37:40+00:00" }, { "name": "symfony/flex", - "version": "v1.22.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "5cc985971b1a700cb74bedd9e01cfa93eb4747f7" + "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/5cc985971b1a700cb74bedd9e01cfa93eb4747f7", - "reference": "5cc985971b1a700cb74bedd9e01cfa93eb4747f7", + "url": "https://api.github.com/repos/symfony/flex/zipball/9cd384775973eabbf6e8b05784dda279fc67c28d", + "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": ">=7.1" + "composer-plugin-api": "^2.1", + "php": ">=8.1" }, "conflict": { - "composer/semver": "<1.7.2" + "composer/semver": "<1.7.2", + "symfony/dotenv": "<5.4" }, "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "symfony/dotenv": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" + "composer/composer": "^2.1", + "symfony/dotenv": "^6.4|^7.4|^8.0", + "symfony/filesystem": "^6.4|^7.4|^8.0", + "symfony/phpunit-bridge": "^6.4|^7.4|^8.0", + "symfony/process": "^6.4|^7.4|^8.0" }, "type": "composer-plugin", "extra": { @@ -4629,7 +4622,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.22.0" + "source": "https://github.com/symfony/flex/tree/v2.10.0" }, "funding": [ { @@ -4640,70 +4633,71 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-03T07:50:24+00:00" + "time": "2025-11-16T09:38:19+00:00" }, { "name": "symfony/form", - "version": "v5.4.45", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "c1974a723cdee8a273cb49ce13fada5c1667706a" + "reference": "264fc873f01376216f0b884ecc81b34b830e25a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/c1974a723cdee8a273cb49ce13fada5c1667706a", - "reference": "c1974a723cdee8a273cb49ce13fada5c1667706a", + "url": "https://api.github.com/repos/symfony/form/zipball/264fc873f01376216f0b884ecc81b34b830e25a8", + "reference": "264fc873f01376216f0b884ecc81b34b830e25a8", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/options-resolver": "^5.1|^6.0", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/options-resolver": "^7.3|^8.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.23", - "symfony/property-access": "^5.0.8|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<4.4", - "symfony/dependency-injection": "<4.4", - "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", - "symfony/error-handler": "<4.4.5", - "symfony/framework-bundle": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", - "symfony/translation-contracts": "<1.1.7", - "symfony/twig-bridge": "<5.4.21|>=6,<6.2.7" + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/error-handler": "<6.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<7.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4" }, "require-dev": { "doctrine/collections": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/intl": "^4.4|^5.0|^6.0", - "symfony/security-csrf": "^4.4|^5.0|^6.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", - "symfony/uid": "^5.1|^6.0", - "symfony/validator": "^4.4.17|^5.1.9|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/security-csrf": "For protecting forms against CSRF attacks.", - "symfony/twig-bridge": "For templating with Twig.", - "symfony/validator": "For form validation." + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4.3|^7.0.3|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4.12|^7.1.5|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4731,7 +4725,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v5.4.45" + "source": "https://github.com/symfony/form/tree/v7.4.4" }, "funding": [ { @@ -4742,119 +4736,126 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-08T07:27:17+00:00" + "time": "2026-01-23T10:51:15+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.4.45", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "3d70f14176422d4d8ee400b6acae4e21f7c25ca2" + "reference": "71fffd9f6cf8df1e2ee311176c85a10eddfdb08c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3d70f14176422d4d8ee400b6acae4e21f7c25ca2", - "reference": "3d70f14176422d4d8ee400b6acae4e21f7c25ca2", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/71fffd9f6cf8df1e2ee311176c85a10eddfdb08c", + "reference": "71fffd9f6cf8df1e2ee311176c85a10eddfdb08c", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=7.2.5", - "symfony/cache": "^5.2|^6.0", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^5.4.44|^6.0.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4.1|^5.0.1|^6.0", - "symfony/event-dispatcher": "^5.1|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^5.4.24|^6.2.11", - "symfony/http-kernel": "^5.4|^6.0", + "php": ">=8.2", + "symfony/cache": "^6.4.12|^7.0|^8.0", + "symfony/config": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^7.4.4|^8.0.4", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^7.3|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^7.1|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", - "symfony/routing": "^5.3|^6.0" + "symfony/polyfill-php85": "^1.32", + "symfony/routing": "^7.4|^8.0" }, "conflict": { - "doctrine/annotations": "<1.13.1", - "doctrine/cache": "<1.11", "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<5.3", - "symfony/console": "<5.2.5|>=7.0", - "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/form": "<5.2", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<5.2", - "symfony/messenger": "<5.4", - "symfony/mime": "<4.4", - "symfony/property-access": "<5.3", - "symfony/property-info": "<4.4", - "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", - "symfony/security-csrf": "<5.3", - "symfony/serializer": "<5.2", - "symfony/service-contracts": ">=3.0", - "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.3", - "symfony/twig-bridge": "<4.4", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<5.3.11", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<5.2" + "symfony/asset": "<6.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/form": "<7.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<7.4", + "symfony/mime": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<7.2", + "symfony/serializer": "<7.2.5", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<7.3", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/webhook": "<7.2", + "symfony/workflow": "<7.4" }, "require-dev": { - "doctrine/annotations": "^1.13.1|^2", - "doctrine/cache": "^1.11|^2.0", "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.3|^6.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4.9|^6.0.9", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", - "symfony/dotenv": "^5.1|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/form": "^5.2|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/mailer": "^5.2|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/notifier": "^5.4|^6.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/dotenv": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/json-streamer": "^7.3|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/notifier": "^6.4|^7.0|^8.0", + "symfony/object-mapper": "^7.3|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/property-info": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0", - "symfony/security-bundle": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/string": "^5.0|^6.0", - "symfony/translation": "^5.3|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/validator": "^5.3.11|^6.0", - "symfony/web-link": "^4.4|^5.0|^6.0", - "symfony/workflow": "^5.2|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^2.10|^3.0.4" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/scheduler": "^6.4.4|^7.0.4|^8.0", + "symfony/security-bundle": "^6.4|^7.0|^8.0", + "symfony/semaphore": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.2.5|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^7.3|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.3|^8.0", + "twig/twig": "^3.12" }, "type": "symfony-bundle", "autoload": { @@ -4882,7 +4883,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.4.45" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.4" }, "funding": [ { @@ -4893,44 +4894,48 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-22T13:05:35+00:00" + "time": "2026-01-12T12:19:02+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.50", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609" + "reference": "e33ba71e674a1bb16eb251688bd27c2ff67e0dc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1a0706e8b8041046052ea2695eb8aeee04f97609", - "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e33ba71e674a1bb16eb251688bd27c2ff67e0dc1", + "reference": "e33ba71e674a1bb16eb251688bd27c2ff67e0dc1", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.1" }, - "require-dev": { - "predis/predis": "^1.0|^2.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "conflict": { + "doctrine/dbal": "<4.3" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "require-dev": { + "doctrine/dbal": "^4.3", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4958,7 +4963,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.50" + "source": "https://github.com/symfony/http-foundation/tree/v8.0.4" }, "funding": [ { @@ -4978,72 +4983,78 @@ "type": "tidelift" } ], - "time": "2025-11-03T12:58:48+00:00" + "time": "2026-01-09T12:15:10+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.0.20", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6dc70833fd0ef5e861e17c7854c12d7d86679349" + "reference": "48b067768859f7b68acf41dfb857a5a4be00acdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6dc70833fd0ef5e861e17c7854c12d7d86679349", - "reference": "6dc70833fd0ef5e861e17c7854c12d7d86679349", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/48b067768859f7b68acf41dfb857a5a4be00acdd", + "reference": "48b067768859f7b68acf41dfb857a5a4be00acdd", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/error-handler": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", - "symfony/twig-bridge": "<5.4", - "symfony/validator": "<5.4", - "twig/twig": "<2.13" + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -5071,7 +5082,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.0.20" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.4" }, "funding": [ { @@ -5082,51 +5093,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-02-01T08:22:55+00:00" + "time": "2026-01-24T22:13:01+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.0.19", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "8932b9108765203156fa07e819d45f58e927d3c5" + "reference": "9c34e8170b09f062a9a38880a3cb58ee35cb7fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8932b9108765203156fa07e819d45f58e927d3c5", - "reference": "8932b9108765203156fa07e819d45f58e927d3c5", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/9c34e8170b09f062a9a38880a3cb58ee35cb7fd4", + "reference": "9c34e8170b09f062a9a38880a3cb58ee35cb7fd4", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2", - "php": ">=8.0.2", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "monolog/monolog": "^3", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/security-core": "<6.0" + "symfony/console": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/mailer": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", - "symfony/security-core": "^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", - "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -5154,7 +5165,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.0.19" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.4.4" }, "funding": [ { @@ -5165,53 +5176,52 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-07T11:35:36+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v3.10.0", + "version": "v3.11.1", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" + "reference": "0e675a6e08f791ef960dc9c7e392787111a3f0c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", - "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/0e675a6e08f791ef960dc9c7e392787111a3f0c1", + "reference": "0e675a6e08f791ef960dc9c7e392787111a3f0c1", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0", "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", - "php": ">=7.2.5", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", - "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" + "php": ">=8.1", + "symfony/config": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/monolog-bridge": "^6.4 || ^7.0", + "symfony/polyfill-php84": "^1.30" }, "require-dev": { - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/phpunit-bridge": "^6.3 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + "symfony/console": "^6.4 || ^7.0", + "symfony/phpunit-bridge": "^7.3.3", + "symfony/yaml": "^6.4 || ^7.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Bundle\\MonologBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Bundle\\MonologBundle\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5235,7 +5245,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" + "source": "https://github.com/symfony/monolog-bundle/tree/v3.11.1" }, "funding": [ { @@ -5246,30 +5256,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-11-06T17:08:13+00:00" + "time": "2025-12-08T07:58:26+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.0.19", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3" + "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/6a180d1c45e0d9797470ca9eb46215692de00fa3", - "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d2b592535ffa6600c265a3893a7f7fd2bad82dd7", + "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.4", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -5302,7 +5316,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.0.19" + "source": "https://github.com/symfony/options-resolver/tree/v8.0.0" }, "funding": [ { @@ -5313,36 +5327,37 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2025-11-12T15:55:31+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "2ae49765c5328307e82c0ee2898a39c071ef5bc8" + "reference": "ca6af4e20357d58d50c818d676cf2e2dd5e53b02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/2ae49765c5328307e82c0ee2898a39c071ef5bc8", - "reference": "2ae49765c5328307e82c0ee2898a39c071ef5bc8", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/ca6af4e20357d58d50c818d676cf2e2dd5e53b02", + "reference": "ca6af4e20357d58d50c818d676cf2e2dd5e53b02", "shasum": "" }, "require": { - "php": ">=8.0.2" - }, - "conflict": { - "symfony/security-core": "<5.4" + "php": ">=8.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/security-core": "^5.4|^6.0" + "symfony/console": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -5374,7 +5389,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.0.19" + "source": "https://github.com/symfony/password-hasher/tree/v8.0.4" }, "funding": [ { @@ -5385,12 +5400,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-01T23:07:29+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5745,15 +5764,93 @@ "shasum": "" }, "require": { - "ext-iconv": "*", + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { "php": ">=7.2" }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, "type": "library", "extra": { "thanks": { @@ -5766,8 +5863,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5783,17 +5883,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -5813,37 +5912,52 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.31.0", + "name": "symfony/polyfill-php80", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", - "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { "php": ">=7.2" }, - "type": "metapackage", + "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -5853,7 +5967,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -5862,7 +5976,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -5873,25 +5987,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { - "name": "symfony/polyfill-php73", + "name": "symfony/polyfill-php81", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { @@ -5909,7 +6027,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, "classmap": [ "Resources/stubs" @@ -5929,7 +6047,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -5938,7 +6056,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -5961,17 +6079,17 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php80", + "name": "symfony/polyfill-php84", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { @@ -5989,7 +6107,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, "classmap": [ "Resources/stubs" @@ -6000,10 +6118,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -6013,7 +6127,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -6022,7 +6136,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -6042,20 +6156,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { - "name": "symfony/polyfill-php81", + "name": "symfony/polyfill-php85", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", "shasum": "" }, "require": { @@ -6073,7 +6187,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, "classmap": [ "Resources/stubs" @@ -6093,7 +6207,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -6102,7 +6216,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" }, "funding": [ { @@ -6122,25 +6236,24 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/process", - "version": "v5.4.47", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" + "reference": "10df72602d88c0a3fa685b822976a052611dd607" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", - "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", + "url": "https://api.github.com/repos/symfony/process/zipball/10df72602d88c0a3fa685b822976a052611dd607", + "reference": "10df72602d88c0a3fa685b822976a052611dd607", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -6168,7 +6281,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.47" + "source": "https://github.com/symfony/process/tree/v8.0.4" }, "funding": [ { @@ -6179,36 +6292,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T11:36:42+00:00" + "time": "2026-01-23T11:07:10+00:00" }, { "name": "symfony/property-access", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "cae9aadf6e3a08315af666d4fede905fbb5b5393" + "reference": "a35a5ec85b605d0d1a9fd802cb44d87682c746fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/cae9aadf6e3a08315af666d4fede905fbb5b5393", - "reference": "cae9aadf6e3a08315af666d4fede905fbb5b5393", + "url": "https://api.github.com/repos/symfony/property-access/zipball/a35a5ec85b605d0d1a9fd802cb44d87682c746fd", + "reference": "a35a5ec85b605d0d1a9fd802cb44d87682c746fd", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/property-info": "^5.4|^6.0" + "php": ">=8.4", + "symfony/property-info": "^7.4.4|^8.0.4" }, "require-dev": { - "symfony/cache": "^5.4|^6.0" - }, - "suggest": { - "psr/cache-implementation": "To cache access methods." + "symfony/cache": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6243,11 +6358,11 @@ "injection", "object", "property", - "property path", + "property-path", "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.0.19" + "source": "https://github.com/symfony/property-access/tree/v8.0.4" }, "funding": [ { @@ -6258,49 +6373,46 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-05T09:27:50+00:00" }, { "name": "symfony/property-info", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "e6dfb2223b21768d3b2ae033a5e1f9d205184d45" + "reference": "16548f971534d36bebe9c92049f02064ac51dea0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/e6dfb2223b21768d3b2ae033a5e1f9d205184d45", - "reference": "e6dfb2223b21768d3b2ae033a5e1f9d205184d45", + "url": "https://api.github.com/repos/symfony/property-info/zipball/16548f971534d36bebe9c92049f02064ac51dea0", + "reference": "16548f971534d36bebe9c92049f02064ac51dea0", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/string": "^5.4|^6.0" + "php": ">=8.4", + "symfony/string": "^7.4|^8.0", + "symfony/type-info": "^7.4.4|^8.0.4" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<5.4" + "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" - }, - "suggest": { - "phpdocumentor/reflection-docblock": "To use the PHPDoc", - "psr/cache-implementation": "To cache results", - "symfony/doctrine-bridge": "To use Doctrine metadata", - "symfony/serializer": "To use Serializer metadata" + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6336,7 +6448,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.0.19" + "source": "https://github.com/symfony/property-info/tree/v8.0.4" }, "funding": [ { @@ -6347,50 +6459,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-15T17:21:41+00:00" + "time": "2026-01-23T11:07:10+00:00" }, { "name": "symfony/routing", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e56ca9b41c1ec447193474cd86ad7c0b547755ac" + "reference": "4a2bc08d1c35307239329f434d45c2bfe8241fa9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e56ca9b41c1ec447193474cd86ad7c0b547755ac", - "reference": "e56ca9b41c1ec447193474cd86ad7c0b547755ac", + "url": "https://api.github.com/repos/symfony/routing/zipball/4a2bc08d1c35307239329f434d45c2bfe8241fa9", + "reference": "4a2bc08d1c35307239329f434d45c2bfe8241fa9", "shasum": "" }, "require": { - "php": ">=8.0.2" - }, - "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" + "php": ">=8.4", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6424,7 +6528,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.0.19" + "source": "https://github.com/symfony/routing/tree/v8.0.4" }, "funding": [ { @@ -6435,59 +6539,50 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-12T12:37:40+00:00" }, { "name": "symfony/security-core", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "6085f2b5791bd2ffc4257be0e7d4f4787705afc8" + "reference": "c62565de41a136535ffa79a4db0373a7173b4d02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/6085f2b5791bd2ffc4257be0e7d4f4787705afc8", - "reference": "6085f2b5791bd2ffc4257be0e7d4f4787705afc8", + "url": "https://api.github.com/repos/symfony/security-core/zipball/c62565de41a136535ffa79a4db0373a7173b4d02", + "reference": "c62565de41a136535ffa79a4db0373a7173b4d02", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^1.1|^2|^3", - "symfony/password-hasher": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.6|^2|^3" - }, - "conflict": { - "symfony/event-dispatcher": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/ldap": "<5.4", - "symfony/security-guard": "<5.4", - "symfony/validator": "<5.4" + "php": ">=8.4", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/ldap": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0" - }, - "suggest": { - "psr/container-implementation": "To instantiate the Security class", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/ldap": "For using LDAP integration", - "symfony/validator": "For using the user password constraint" + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/ldap": "^7.4|^8.0", + "symfony/string": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6515,7 +6610,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.0.19" + "source": "https://github.com/symfony/security-core/tree/v8.0.4" }, "funding": [ { @@ -6526,41 +6621,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-24T12:56:03+00:00" + "time": "2026-01-23T11:07:10+00:00" }, { "name": "symfony/security-csrf", - "version": "v5.4.45", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "28dcafc3220f12264bb2aabe2389a2163458c1f4" + "reference": "06a2a2f90f355b8b4ec23685fa6ceff8d5dc41cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/28dcafc3220f12264bb2aabe2389a2163458c1f4", - "reference": "28dcafc3220f12264bb2aabe2389a2163458c1f4", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/06a2a2f90f355b8b4ec23685fa6ceff8d5dc41cc", + "reference": "06a2a2f90f355b8b4ec23685fa6ceff8d5dc41cc", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/security-core": "^4.4|^5.0|^6.0" + "php": ">=8.2", + "symfony/security-core": "^6.4|^7.0|^8.0" }, "conflict": { - "symfony/http-foundation": "<5.3" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-foundation": "^5.3|^6.0" - }, - "suggest": { - "symfony/http-foundation": "For using the class SessionTokenStorage." + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6588,7 +6684,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v5.4.45" + "source": "https://github.com/symfony/security-csrf/tree/v7.4.4" }, "funding": [ { @@ -6599,38 +6695,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2026-01-14T10:11:16+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.4", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", - "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "thanks": { @@ -6638,13 +6735,16 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6671,7 +6771,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -6682,30 +6782,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.0.19", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "011e781839dd1d2eb8119f65ac516a530f60226d" + "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/011e781839dd1d2eb8119f65ac516a530f60226d", - "reference": "011e781839dd1d2eb8119f65ac516a530f60226d", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/67df1914c6ccd2d7b52f70d40cf2aea02159d942", + "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/service-contracts": "^1|^2|^3" + "php": ">=8.4", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -6733,7 +6837,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.0.19" + "source": "https://github.com/symfony/stopwatch/tree/v8.0.0" }, "funding": [ { @@ -6744,42 +6848,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2025-08-04T07:36:47+00:00" }, { "name": "symfony/string", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + "reference": "758b372d6882506821ed666032e43020c4f57194" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", - "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "url": "https://api.github.com/repos/symfony/string/zipball/758b372d6882506821ed666032e43020c4f57194", + "reference": "758b372d6882506821ed666032e43020c4f57194", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6818,7 +6927,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.19" + "source": "https://github.com/symfony/string/tree/v8.0.4" }, "funding": [ { @@ -6829,32 +6938,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2026-01-12T12:37:40+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.0.2", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282", - "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { - "php": ">=8.0.2" - }, - "suggest": { - "symfony/translation-implementation": "" + "php": ">=8.1" }, "type": "library", "extra": { @@ -6863,13 +6973,16 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.6-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6896,7 +7009,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.0.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -6907,89 +7020,75 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-06-27T17:10:44+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/twig-bridge", - "version": "v5.4.48", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "853a0c9aa40123a9feeb335c865b659d94e49e5d" + "reference": "4a9b41bdbb74c419cb9c6352629dfd2ce7edb0f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/853a0c9aa40123a9feeb335c865b659d94e49e5d", - "reference": "853a0c9aa40123a9feeb335c865b659d94e49e5d", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/4a9b41bdbb74c419cb9c6352629dfd2ce7edb0f3", + "reference": "4a9b41bdbb74c419cb9c6352629dfd2ce7edb0f3", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1|^2|^3", - "twig/twig": "^2.13|^3.0.4" + "php": ">=8.4", + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^3.21" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<5.3", - "symfony/form": "<5.4.21|>=6,<6.2.7", - "symfony/http-foundation": "<5.3", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.2", - "symfony/workflow": "<5.2" + "symfony/form": "<7.4.4|>8.0,<8.0.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^4.4|^5.0|^6.0", - "symfony/console": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/form": "^5.4.21|^6.2.7", - "symfony/http-foundation": "^5.3|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/intl": "^4.4|^5.0|^6.0", - "symfony/mime": "^5.2|^6.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/asset": "^7.4|^8.0", + "symfony/asset-mapper": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/form": "^7.4.4|^8.0.4", + "symfony/html-sanitizer": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/polyfill-intl-icu": "^1.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0|^6.0", - "symfony/security-csrf": "^4.4|^5.0|^6.0", - "symfony/security-http": "^4.4|^5.0|^6.0", - "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^5.2|^6.0", - "symfony/web-link": "^4.4|^5.0|^6.0", - "symfony/workflow": "^5.2|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" + "symfony/security-core": "^7.4|^8.0", + "symfony/security-csrf": "^7.4|^8.0", + "symfony/security-http": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^7.4|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0", + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -7017,7 +7116,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.4.48" + "source": "https://github.com/symfony/twig-bridge/tree/v8.0.4" }, "funding": [ { @@ -7028,58 +7127,58 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-22T08:19:51+00:00" + "time": "2026-01-07T12:23:22+00:00" }, { "name": "symfony/twig-bundle", - "version": "v5.4.45", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "e1ca56e1dc7791eb19f0aff71d3d94e6a91cc8f9" + "reference": "e8829e02ff96a391ed0703bac9e7ff0537480b6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/e1ca56e1dc7791eb19f0aff71d3d94e6a91cc8f9", - "reference": "e1ca56e1dc7791eb19f0aff71d3d94e6a91cc8f9", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/e8829e02ff96a391ed0703bac9e7ff0537480b6b", + "reference": "e8829e02ff96a391ed0703bac9e7ff0537480b6b", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.0|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/twig-bridge": "^5.3|^6.0", - "twig/twig": "^2.13|^3.0.4" + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/twig-bridge": "^7.3|^8.0", + "twig/twig": "^3.12" }, "conflict": { - "symfony/dependency-injection": "<5.3", - "symfony/framework-bundle": "<5.0", - "symfony/service-contracts": ">=3.0", - "symfony/translation": "<5.0" + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "doctrine/cache": "^1.0|^2.0", - "symfony/asset": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/form": "^4.4|^5.0|^6.0", - "symfony/framework-bundle": "^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^5.0|^6.0", - "symfony/web-link": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -7107,7 +7206,89 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.4.45" + "source": "https://github.com/symfony/twig-bundle/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-06T12:34:24+00:00" + }, + { + "name": "symfony/type-info", + "version": "v8.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "106a2d3bbf0d4576b2f70e6ca866fa420956ed0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/106a2d3bbf0d4576b2f70e6ca866fa420956ed0d", + "reference": "106a2d3bbf0d4576b2f70e6ca866fa420956ed0d", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v8.0.4" }, "funding": [ { @@ -7118,46 +7299,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2026-01-09T12:15:10+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.0.19", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "eb980457fa6899840fe1687e8627a03a7d8a3d52" + "reference": "326e0406fc315eca57ef5740fa4a280b7a068c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/eb980457fa6899840fe1687e8627a03a7d8a3d52", - "reference": "eb980457fa6899840fe1687e8627a03a7d8a3d52", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/326e0406fc315eca57ef5740fa4a280b7a068c82", + "reference": "326e0406fc315eca57ef5740fa4a280b7a068c82", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<5.4" + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -7195,7 +7375,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.0.19" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.4" }, "funding": [ { @@ -7206,32 +7386,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-20T17:44:14+00:00" + "time": "2026-01-01T23:07:29+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.0.19", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "df56f53818c2d5d9f683f4ad2e365ba73a3b69d2" + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df56f53818c2d5d9f683f4ad2e365ba73a3b69d2", - "reference": "df56f53818c2d5d9f683f4ad2e365ba73a3b69d2", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7264,10 +7451,12 @@ "export", "hydrate", "instantiate", + "lazy-loading", + "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.0.19" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" }, "funding": [ { @@ -7278,40 +7467,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-13T08:34:10+00:00" + "time": "2025-09-11T10:15:23+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.45", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "a454d47278cc16a5db371fe73ae66a78a633371e" + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e", - "reference": "a454d47278cc16a5db371fe73ae66a78a633371e", + "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.3" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.3|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/console": "^6.4|^7.0|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7342,7 +7532,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.45" + "source": "https://github.com/symfony/yaml/tree/v7.4.1" }, "funding": [ { @@ -7353,35 +7543,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2025-12-04T18:11:45+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.19.0", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa" + "reference": "7a27e784dc56eddfef5e9295829b290ce06f1682" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9746573ca4bc1cd03a767a183faadaf84e0c31fa", - "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/7a27e784dc56eddfef5e9295829b290ce06f1682", + "reference": "7a27e784dc56eddfef5e9295829b290ce06f1682", "shasum": "" }, "require": { - "php": ">=8.0.2", - "symfony/framework-bundle": "^5.4|^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.4|^7.0", + "php": ">=8.1.0", + "symfony/framework-bundle": "^5.4|^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0|^8.0", "twig/twig": "^3.2|^4.0" }, "require-dev": { - "league/commonmark": "^1.0|^2.0", + "league/commonmark": "^2.7", "symfony/phpunit-bridge": "^6.4|^7.0", "twig/cache-extra": "^3.0", "twig/cssinliner-extra": "^3.0", @@ -7420,7 +7614,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.19.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.23.0" }, "funding": [ { @@ -7432,28 +7626,27 @@ "type": "tidelift" } ], - "time": "2024-09-26T19:22:23+00:00" + "time": "2025-12-18T20:46:15+00:00" }, { "name": "twig/twig", - "version": "v3.19.0", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e" + "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e", - "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php81": "^1.29" + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "phpstan/phpstan": "^2.0", @@ -7500,7 +7693,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.19.0" + "source": "https://github.com/twigphp/Twig/tree/v3.23.0" }, "funding": [ { @@ -7512,7 +7705,7 @@ "type": "tidelift" } ], - "time": "2025-01-29T07:06:14+00:00" + "time": "2026-01-23T21:00:41+00:00" } ], "packages-dev": [ @@ -7522,12 +7715,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "6e9ea9dcd100b6dcc0b1cdfc139df3695ad73e38" + "reference": "41f66a85ed999edf9e171452b75f642321aa7fcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/6e9ea9dcd100b6dcc0b1cdfc139df3695ad73e38", - "reference": "6e9ea9dcd100b6dcc0b1cdfc139df3695ad73e38", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/41f66a85ed999edf9e171452b75f642321aa7fcc", + "reference": "41f66a85ed999edf9e171452b75f642321aa7fcc", "shasum": "" }, "conflict": { @@ -7539,14 +7732,19 @@ "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2", "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", + "aimeos/ai-cms-grapesjs": ">=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.9|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.10.8|>=2025.04.1,<2025.10.2", "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", + "aimeos/aimeos-laravel": "==2021.10", "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", "airesvsg/acf-to-rest-api": "<=3.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<1.5.2.0-beta1", + "alextselegidis/easyappointments": "<=1.5.2", + "alexusmai/laravel-file-manager": "<=3.3.1", + "algolia/algoliasearch-magento-2": "<=3.16.1|>=3.17.0.0-beta1,<=3.17.1", "alt-design/alt-redirect": "<1.6.4", + "altcha-org/altcha": "<1.3.1", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "ameos/ameos_tarteaucitron": "<1.2.23", @@ -7570,22 +7768,22 @@ "athlon1600/php-proxy-app": "<=3", "athlon1600/youtube-downloader": "<=4", "austintoddj/canvas": "<=3.4.2", - "auth0/auth0-php": ">=3.3,<=8.16", - "auth0/login": "<=7.18", - "auth0/symfony": "<=5.4.1", - "auth0/wordpress": "<=5.3", + "auth0/auth0-php": ">=3.3,<8.18", + "auth0/login": "<7.20", + "auth0/symfony": "<=5.5", + "auth0/wordpress": "<=5.4", "automad/automad": "<2.0.0.0-alpha5", "automattic/jetpack": "<9.8", "awesome-support/awesome-support": "<=6.0.7", - "aws/aws-sdk-php": "<3.288.1", - "azuracast/azuracast": "<0.18.3", + "aws/aws-sdk-php": "<3.368", + "azuracast/azuracast": "<=0.23.1", "b13/seo_basics": "<0.8.2", "backdrop/backdrop": "<=1.32", "backpack/crud": "<3.4.9", "backpack/filemanager": "<2.0.2|>=3,<3.0.9", "bacula-web/bacula-web": "<9.7.1", "badaso/core": "<=2.9.11", - "bagisto/bagisto": "<=2.3.7", + "bagisto/bagisto": "<2.3.10", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "barryvdh/laravel-translation-manager": "<0.6.8", @@ -7617,7 +7815,8 @@ "bvbmedia/multishop": "<2.0.39", "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cadmium-org/cadmium-cms": "<=0.4.9", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10|>=5.2.10,<5.2.12|==5.3", "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", "cardgate/magento2": "<2.0.33", "cardgate/woocommerce": "<=3.1.15", @@ -7646,7 +7845,7 @@ "codingms/modules": "<4.3.11|>=5,<5.7.4|>=6,<6.4.2|>=7,<7.5.5", "commerceteam/commerce": ">=0.9.6,<0.9.9", "components/jquery": ">=1.0.3,<3.5", - "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", + "composer/composer": "<1.10.27|>=2,<2.2.26|>=2.3,<2.9.3", "concrete5/concrete5": "<9.4.3", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", @@ -7656,11 +7855,13 @@ "contao/core-bundle": "<4.13.57|>=5,<5.3.42|>=5.4,<5.6.5", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", "contao/managed-edition": "<=1.5", + "coreshop/core-shop": "<4.1.9", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", "couleurcitron/tarteaucitron-wp": "<0.3", - "craftcms/cms": "<=4.16.5|>=5,<=5.8.6", - "croogo/croogo": "<4", + "cpsit/typo3-mailqueue": "<0.4.3|>=0.5,<0.5.1", + "craftcms/cms": "<=4.16.16|>=5,<=5.8.20", + "croogo/croogo": "<=4.0.7", "cuyz/valinor": "<0.12", "czim/file-handling": "<1.5|>=2,<2.3", "czproject/git-php": "<4.0.3", @@ -7707,7 +7908,7 @@ "drupal/commerce_alphabank_redirect": "<1.0.3", "drupal/commerce_eurobank_redirect": "<2.1.1", "drupal/config_split": "<1.10|>=2,<2.0.2", - "drupal/core": ">=6,<6.38|>=7,<7.102|>=8,<10.4.9|>=10.5,<10.5.6|>=11,<11.1.9|>=11.2,<11.2.8", + "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.4.9|>=10.5,<10.5.6|>=11,<11.1.9|>=11.2,<11.2.8", "drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", "drupal/currency": "<3.5", "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", @@ -7771,12 +7972,13 @@ "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", "ezyang/htmlpurifier": "<=4.2", "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", - "facturascripts/facturascripts": "<=2022.08", + "facturascripts/facturascripts": "<=2025.4|==2025.11|==2025.41|==2025.43", "fastly/magento2": "<1.2.26", "feehi/cms": "<=2.1.1", "feehi/feehicms": "<=2.1.1", "fenom/fenom": "<=2.12.1", "filament/actions": ">=3.2,<3.2.123", + "filament/filament": ">=4,<4.3.1", "filament/infolists": ">=3,<3.2.115", "filament/tables": ">=3,<3.2.115", "filegator/filegator": "<7.8", @@ -7795,6 +7997,7 @@ "floriangaerber/magnesium": "<0.3.1", "fluidtypo3/vhs": "<5.1.1", "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/pretty-mail": "<=1.1.2", "fof/upload": "<1.2.3", "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", "fooman/tcpdf": "<6.2.22", @@ -7820,7 +8023,7 @@ "geshi/geshi": "<=1.0.9.1", "getformwork/formwork": "<2.2", "getgrav/grav": "<1.11.0.0-beta1", - "getkirby/cms": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1|>=5,<5.1.4", + "getkirby/cms": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1|>=5,<=5.2.1", "getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", @@ -7858,7 +8061,7 @@ "ibexa/http-cache": ">=4.6,<4.6.14", "ibexa/post-install": "<1.0.16|>=4.6,<4.6.14", "ibexa/solr": ">=4.5,<4.5.4", - "ibexa/user": ">=4,<4.4.3|>=5,<5.0.3", + "ibexa/user": ">=4,<4.4.3|>=5,<5.0.4", "icecoder/icecoder": "<=8.1", "idno/known": "<=1.3.1", "ilicmiljan/secure-props": ">=1.2,<1.2.2", @@ -7910,7 +8113,7 @@ "kelvinmo/simplexrd": "<3.1.1", "kevinpapst/kimai2": "<1.16.7", "khodakhah/nodcms": "<=3", - "kimai/kimai": "<=2.20.1", + "kimai/kimai": "<2.46", "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", "klaviyo/magento2-extension": ">=1,<3", "knplabs/knp-snappy": "<=1.4.2", @@ -7929,10 +8132,10 @@ "laravel/framework": "<10.48.29|>=11,<11.44.1|>=12,<12.1.1", "laravel/laravel": ">=5.4,<5.4.22", "laravel/pulse": "<1.3.1", - "laravel/reverb": "<1.4", + "laravel/reverb": "<1.7", "laravel/socialite": ">=1,<2.0.10", "latte/latte": "<2.10.8", - "lavalite/cms": "<=9|==10.1", + "lavalite/cms": "<=10.1", "lavitto/typo3-form-to-database": "<2.2.5|>=3,<3.2.2|>=4,<4.2.3|>=5,<5.0.2", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<2.7", @@ -7941,11 +8144,12 @@ "leantime/leantime": "<3.3", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "libreform/libreform": ">=2,<=2.0.8", - "librenms/librenms": "<2017.08.18", + "librenms/librenms": "<25.12", "liftkit/database": "<2.13.2", "lightsaml/lightsaml": "<1.3.5", "limesurvey/limesurvey": "<6.5.12", "livehelperchat/livehelperchat": "<=3.91", + "livewire-filemanager/filemanager": "<=1.0.4", "livewire/livewire": "<2.12.7|>=3.0.0.0-beta1,<3.6.4", "livewire/volt": "<1.7", "lms/routes": "<2.1.1", @@ -7971,8 +8175,9 @@ "marshmallow/nova-tiptap": "<5.7", "matomo/matomo": "<1.11", "matyhtf/framework": "<3.0.6", - "mautic/core": "<5.2.8|>=6.0.0.0-alpha,<6.0.5", + "mautic/core": "<5.2.9|>=6,<6.0.7", "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mautic/grapes-js-builder-bundle": ">=4,<4.4.18|>=5,<5.2.9|>=6,<6.0.7", "maximebf/debugbar": "<1.19", "mdanter/ecc": "<2", "mediawiki/abuse-filter": "<1.39.9|>=1.40,<1.41.3|>=1.42,<1.42.2", @@ -7994,6 +8199,7 @@ "microsoft/microsoft-graph-core": "<2.0.2", "microweber/microweber": "<=2.0.19", "mikehaertl/php-shellcommand": "<1.6.1", + "mineadmin/mineadmin": "<=3.0.9", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "mobiledetect/mobiledetectlib": "<2.8.32", @@ -8002,7 +8208,7 @@ "mongodb/mongodb": ">=1,<1.9.2", "mongodb/mongodb-extension": "<1.21.2", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.4.11|>=4.5.0.0-beta,<4.5.7|>=5.0.0.0-beta,<5.0.3", + "moodle/moodle": "<4.4.12|>=4.5.0.0-beta,<4.5.8|>=5.0.0.0-beta,<5.0.4|>=5.1.0.0-beta,<5.1.1", "moonshine/moonshine": "<=3.12.5", "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", @@ -8030,6 +8236,7 @@ "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "neuron-core/neuron-ai": "<=2.8.11", "nilsteampassnet/teampass": "<3.1.3.1-dev", "nitsan/ns-backup": "<13.0.1", "nonfiction/nterchange": "<4.1.1", @@ -8046,10 +8253,10 @@ "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", "october/october": "<3.7.5", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<3.7.5", + "october/system": "<=3.7.12|>=4,<=4.0.11", "oliverklee/phpunit": "<3.5.15", "omeka/omeka-s": "<4.0.3", - "onelogin/php-saml": "<2.10.4", + "onelogin/php-saml": "<2.21.1|>=3,<3.8.1|>=4,<4.3.1", "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", "open-web-analytics/open-web-analytics": "<1.8.1", "opencart/opencart": ">=0", @@ -8073,6 +8280,7 @@ "pagekit/pagekit": "<=1.0.18", "paragonie/ecc": "<2.0.1", "paragonie/random_compat": "<2", + "paragonie/sodium_compat": "<1.24|>=2,<2.5", "passbolt/passbolt_api": "<4.6.2", "paypal/adaptivepayments-sdk-php": "<=3.9.2", "paypal/invoice-sdk-php": "<=3.9", @@ -8085,6 +8293,7 @@ "pear/pear": "<=1.10.1", "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", + "ph7software/ph7builder": "<=17.9.1", "phanan/koel": "<5.1.4", "phenx/php-svg-lib": "<0.5.2", "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", @@ -8095,7 +8304,7 @@ "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<5.2.2", - "phpmyfaq/phpmyfaq": "<=4.0.13", + "phpmyfaq/phpmyfaq": "<=4.0.16", "phpoffice/common": "<0.2.9", "phpoffice/math": "<=0.2", "phpoffice/phpexcel": "<=1.8.2", @@ -8109,14 +8318,15 @@ "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<1.7.6", + "pimcore/admin-ui-classic-bundle": "<=1.7.15|>=2.0.0.0-RC1-dev,<=2.2.2", "pimcore/customer-management-framework-bundle": "<4.2.1", "pimcore/data-hub": "<1.2.4", "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<11.5.4", + "pimcore/pimcore": "<=11.5.13|>=12.0.0.0-RC1-dev,<12.3.1", + "pimcore/web2print-tools-bundle": "<=5.2.1|>=6.0.0.0-RC1-dev,<=6.1", "piwik/piwik": "<1.11", "pixelfed/pixelfed": "<0.12.5", "plotly/plotly.js": "<2.25.2", @@ -8140,7 +8350,7 @@ "processwire/processwire": "<=3.0.246", "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<=1.11.10", + "pterodactyl/panel": "<1.12", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", "ptrofimov/beanstalk_console": "<1.7.14", "pubnub/pubnub": "<6.1", @@ -8158,13 +8368,13 @@ "rap2hpoutre/laravel-log-viewer": "<0.13", "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<5.20.1", + "redaxo/source": "<=5.20.1", "remdex/livehelperchat": "<4.29", "renolit/reint-downloadmanager": "<4.0.2|>=5,<5.0.1", "reportico-web/reportico": "<=8.1", "rhukster/dom-sanitizer": "<1.0.7", "rmccue/requests": ">=1.6,<1.8", - "robrichards/xmlseclibs": ">=1,<3.0.4", + "robrichards/xmlseclibs": "<=3.1.3", "roots/soil": "<4.1", "roundcube/roundcubemail": "<1.5.10|>=1.6,<1.6.11", "rudloff/alltube": "<3.0.3", @@ -8180,11 +8390,11 @@ "setasign/fpdi": "<2.6.4", "sfroemken/url_redirect": "<=1.2.1", "sheng/yiicms": "<1.2.1", - "shopware/core": "<6.6.10.9-dev|>=6.7,<6.7.4.1-dev", + "shopware/core": "<6.6.10.9-dev|>=6.7,<6.7.6.1-dev", "shopware/platform": "<6.6.10.7-dev|>=6.7,<6.7.3.1-dev", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.7.17|>=6.7,<6.7.2.1-dev", - "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", + "shopware/shopware": "<=5.7.17|>=6.4.6,<6.6.10.10-dev|>=6.7,<6.7.6.1-dev", + "shopware/storefront": "<6.6.10.10-dev|>=6.7,<6.7.5.1-dev", "shopxo/shopxo": "<=6.4", "showdoc/showdoc": "<2.10.4", "shuchkin/simplexlsx": ">=1.0.12,<1.1.13", @@ -8228,7 +8438,7 @@ "snipe/snipe-it": "<=8.3.4", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", - "solspace/craft-freeform": ">=5,<5.10.16", + "solspace/craft-freeform": "<=5.14.6", "soosyze/soosyze": "<=2", "spatie/browsershot": "<5.0.5", "spatie/image-optimizer": "<1.7.3", @@ -8317,7 +8527,7 @@ "thelia/thelia": ">=2.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "thinkcmf/thinkcmf": "<6.0.8", - "thorsten/phpmyfaq": "<=4.0.13", + "thorsten/phpmyfaq": "<=4.0.16|>=4.1.0.0-alpha,<=4.1.0.0-beta2", "tikiwiki/tiki-manager": "<=17.1", "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", "tinymce/tinymce": "<7.2", @@ -8336,10 +8546,10 @@ "twbs/bootstrap": "<3.4.1|>=4,<4.3.1", "twig/twig": "<3.11.2|>=3.12,<3.14.1|>=3.16,<3.19", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", "typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", "typo3/cms-beuser": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", - "typo3/cms-core": "<=8.7.56|>=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-core": "<=8.7.56|>=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", "typo3/cms-dashboard": ">=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-extensionmanager": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", @@ -8351,7 +8561,8 @@ "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8|==13.4.2", "typo3/cms-lowlevel": ">=11,<=11.5.41", "typo3/cms-recordlist": ">=11,<11.5.48", - "typo3/cms-recycler": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-recycler": ">=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", + "typo3/cms-redirects": ">=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", "typo3/cms-scheduler": ">=11,<=11.5.41", "typo3/cms-setup": ">=9,<=9.5.50|>=10,<=10.4.49|>=11,<=11.5.43|>=12,<=12.4.30|>=13,<=13.4.11", @@ -8433,8 +8644,9 @@ "yiisoft/yii2-redis": "<2.0.20", "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", "yoast-seo-for-typo3/yoast_seo": "<7.2.3", - "yourls/yourls": "<=1.8.2", + "yourls/yourls": "<=1.10.2", "yuan1994/tpadmin": "<=1.3.12", + "yungifez/skuul": "<=2.6.5", "z-push/z-push-dev": "<2.7.6", "zencart/zencart": "<=1.5.7.0-beta", "zendesk/zendesk_api_client_php": "<2.2.11", @@ -8510,7 +8722,7 @@ "type": "tidelift" } ], - "time": "2025-12-02T01:33:57+00:00" + "time": "2026-01-26T18:09:51+00:00" } ], "aliases": [], @@ -8521,7 +8733,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.0", + "php": "^8.5", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", @@ -8531,9 +8743,9 @@ "ext-redis": "*", "ext-simplexml": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { - "php": "8.0.28" + "php": "8.5.2" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/config/apache/symfony.conf b/config/apache/symfony.conf index 02da1ac..1ea1a88 100644 --- a/config/apache/symfony.conf +++ b/config/apache/symfony.conf @@ -1,4 +1,4 @@ - + DocumentRoot /var/www/html/web # Just use 'localhost' instead of exposing user supplied value UseCanonicalName on diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index b43361d..e448716 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -13,7 +13,7 @@ doctrine: auto_mapping: true mappings: Outlandish\Wpackagist\Entity: - type: annotation + type: attribute dir: '%kernel.project_dir%/src/Entity' is_bundle: false prefix: Outlandish\Wpackagist\Entity diff --git a/config/routes.yaml b/config/routes.yaml index 6f2583f..898adda 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,3 +1,8 @@ +health: + path: /health + controller: Outlandish\Wpackagist\Controller\MainController::health + methods: GET + home: path: / controller: Outlandish\Wpackagist\Controller\MainController::home diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml index e92efc5..2d2ab38 100644 --- a/config/routes/annotations.yaml +++ b/config/routes/annotations.yaml @@ -1,7 +1,7 @@ controllers: resource: ../../src/Controller/ - type: annotation + type: attribute kernel: resource: ../../src/Kernel.php - type: annotation + type: attribute diff --git a/config/routes/dev/framework.yaml b/config/routes/dev/framework.yaml deleted file mode 100644 index bcbbf13..0000000 --- a/config/routes/dev/framework.yaml +++ /dev/null @@ -1,3 +0,0 @@ -_errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' - prefix: /_error diff --git a/config/services.yaml b/config/services.yaml index 5c64cf3..b51c479 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -15,11 +15,6 @@ services: # fetching services directly from the container via $container->get() won't work. # The best practice is to be explicit about your dependencies anyway. - request_metadata: - class: Doctrine\ORM\Mapping\ClassMetadata - arguments: - $entityName: Outlandish\Wpackagist\Entity\Request - Doctrine\ORM\Configuration: alias: 'doctrine.orm.default_configuration' @@ -35,8 +30,7 @@ services: public: true Outlandish\Wpackagist\Entity\RequestRepository: - arguments: - $class: '@request_metadata' + autowire: true # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name @@ -59,6 +53,10 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + Outlandish\Wpackagist\Twig\AssetExtension: + arguments: + $projectDir: '%kernel.project_dir%' + Outlandish\Wpackagist\EventListener\ExceptionListener: tags: - { name: kernel.event_listener, event: kernel.exception } diff --git a/deploy/common-setup.sh b/deploy/common-setup.sh new file mode 100644 index 0000000..daafed6 --- /dev/null +++ b/deploy/common-setup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# This script detects (by presence of expected environment variables) whether it is running in AWS, GCP, or in a docker environment + +# Parts of this script are taken from https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/ +# and is used to set up app secrets in ECS without exposing them as widely as using ECS env vars directly would. + +if [ -n "$ECS_CONTAINER_METADATA_URI_V4" ]; then + echo "\$ECS_CONTAINER_METADATA_URI_V4 detected ($ECS_CONTAINER_METADATA_URI_V4). Running in AWS environment" + # Check that the environment variable has been set correctly + if [ -z "$SECRETS_URI" ]; then + echo >&2 'error: missing AWS SECRETS_URI environment variable' + exit 1 + fi + # Load the S3 secrets file contents into the environment variables + export $(aws s3 cp ${SECRETS_URI} - | grep -v '^#' | xargs) +elif [ -n "$GOOGLE_CLOUD_PROJECT" ]; then + echo "\$GOOGLE_CLOUD_PROJECT detected ($GOOGLE_CLOUD_PROJECT). Running in GCP environment" + if [ -z "$SECRET_NAME" ]; then + echo >&2 'error: missing SECRET_NAME environment variable' + echo >&2 'Set SECRET_NAME to the name of the secret in Google Secret Manager' + exit 1 + fi + + echo "Loading secrets from Google Secret Manager..." + # Load secrets from Google Secret Manager + # The secret should be stored as key=value pairs, one per line + export $(gcloud secrets versions access latest --secret="${SECRET_NAME}" --project="${GOOGLE_CLOUD_PROJECT}" | grep -v '^#' | xargs) + export COMPOSER_ALLOW_SUPERUSER=1 +else + echo "Running in docker environment" +fi + +echo "Dumping env..." +composer dump-env "${APP_ENV}" + +# Wait for PostgreSQL to be available +echo "Waiting for PostgreSQL to be available..." +until php bin/console dbal:run-sql "SELECT 1" > /dev/null 2>&1; do + echo "PostgreSQL is unavailable - sleeping" + sleep 2 +done +echo "PostgreSQL is up - continuing" + +/var/www/html/deploy/migrate-db.sh diff --git a/deploy/task_entrypoint.sh b/deploy/task_entrypoint.sh index b3dfc3c..86b57a9 100755 --- a/deploy/task_entrypoint.sh +++ b/deploy/task_entrypoint.sh @@ -1,23 +1,43 @@ #!/bin/bash -# This script is taken from https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/ -# and is used to set up app secrets in ECS without exposing them as widely as using ECS env vars directly would. +# Source common setup (platform detection, secrets loading, migrations) +source /var/www/html/deploy/common-setup.sh -# Check that the environment variable has been set correctly -if [ -z "$SECRETS_URI" ]; then - echo >&2 'error: missing SECRETS_URI environment variable' - exit 1 -fi +# Distributed lock using database table with timestamp +LOCK_NAME="wpackagist-cron-job" +LOCK_TIMEOUT=172800 # 2 days timeout for stale locks +LOCK_ACQUIRED=0 + +# Function to release lock on exit +release_lock() { + if [ $LOCK_ACQUIRED -eq 1 ]; then + echo "Releasing distributed lock..." + php /var/www/html/bin/console dbal:run-sql "DELETE FROM cron_lock WHERE lock_name = '$LOCK_NAME'" > /dev/null 2>&1 + fi +} + +# Set up trap to release lock on script exit (success or failure) +trap release_lock EXIT INT TERM -# Load the S3 secrets file contents into the environment variables -export $(aws s3 cp ${SECRETS_URI} - | grep -v '^#' | xargs) +# Try to acquire the lock (non-blocking) +echo "Attempting to acquire distributed lock..." -echo "Dumping env..." -composer dump-env "${APP_ENV}" +# Create lock table if it doesn't exist +php /var/www/html/bin/console dbal:run-sql "CREATE TABLE IF NOT EXISTS cron_lock (lock_name VARCHAR(255) PRIMARY KEY, locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255))" > /dev/null 2>&1 -echo "Running DB migrations..." -bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration --env=$APP_ENV +# Clear stale locks +php /var/www/html/bin/console dbal:run-sql "DELETE FROM cron_lock WHERE locked_at < NOW() - INTERVAL '$LOCK_TIMEOUT seconds'" > /dev/null 2>&1 -echo "Starting task..." -# Call the normal CLI entry-point script, passing on script name and any other arguments -docker-php-entrypoint "$@" +# Try to insert lock record +if php /var/www/html/bin/console dbal:run-sql "INSERT INTO cron_lock (lock_name, locked_at, locked_by) VALUES ('$LOCK_NAME', NOW(), '$(hostname)')" &> /dev/null; then + LOCK_ACQUIRED=1 + echo "Lock acquired successfully. Starting task..." + + # Call the normal CLI entry-point script, passing on script name and any other arguments + docker-php-entrypoint /var/www/html/run-cron.sh "$@" + + echo "Task completed." +else + echo "Could not acquire lock. Another instance is already running. Exiting." + exit 0 +fi diff --git a/deploy/web_entrypoint.sh b/deploy/web_entrypoint.sh index 1f1e777..d249c52 100755 --- a/deploy/web_entrypoint.sh +++ b/deploy/web_entrypoint.sh @@ -1,29 +1,25 @@ #!/bin/bash -# This script is taken from https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/ -# and is used to set up app secrets in ECS without exposing them as widely as using ECS env vars directly would. - -# Check that the environment variable has been set correctly -if [ -z "$SECRETS_URI" ]; then - echo >&2 'error: missing SECRETS_URI environment variable' - exit 1 -fi - -# Load the S3 secrets file contents into the environment variables -export $(aws s3 cp ${SECRETS_URI} - | grep -v '^#' | xargs) - -echo "Dumping env..." -composer dump-env "${APP_ENV}" +# Source common setup (platform detection, secrets loading, migrations) +source /var/www/html/deploy/common-setup.sh # Includes Doctrine proxies – https://stackoverflow.com/a/36685804/2803757 echo "Clearing & warming cache..." bin/console cache:clear --no-debug --env=$APP_ENV -echo "Running DB migrations..." -bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration --env=$APP_ENV - chmod -R 777 /tmp/twig +# Set PORT to 8080 if not already set (for local dev; Cloud Run sets this) +export PORT=${PORT:-8080} +echo "Configuring Apache to listen on port $PORT..." + +# Update Apache's ports.conf to listen on the correct port +# Handle different Listen directive formats and make it idempotent by replacing any port number +sed -i -E "s/^Listen ([^:]*:)?[0-9]+$/Listen \1$PORT/g" /etc/apache2/ports.conf + +# Replace __PORT__ or any existing port in the VirtualHost config with actual PORT value +sed -i -E "s///g" /etc/apache2/sites-available/symfony.conf + echo "Starting Apache..." # Call the normal web server entry-point script apache2-foreground "$@" diff --git a/docker-compose.yml b/docker-compose.yml index fdb4dc5..12e4247 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,14 +2,13 @@ version: "3.7" -volumes: - local_data: {} - services: db: - image: postgres:12.8-alpine + image: postgres:17-alpine volumes: - - ./local_data:/var/lib/postgresql/ + - type: bind + source: ./local_data + target: /var/lib/postgresql/data ports: - "5432:5432" env_file: @@ -21,8 +20,9 @@ services: context: . args: env: dev + target: aws entrypoint: docker-php-entrypoint - command: /var/www/html/run-cron.sh + command: /var/www/html/deploy/task_entrypoint.sh volumes: - .:/var/www/html env_file: @@ -35,8 +35,9 @@ services: context: . args: env: dev + target: aws ports: - - "30100:80" + - "30100:8080" volumes: - .:/var/www/html env_file: diff --git a/run-cron.sh b/run-cron.sh index 945a531..2af2cb3 100755 --- a/run-cron.sh +++ b/run-cron.sh @@ -1,9 +1,9 @@ #!/bin/bash echo "Starting refresh..." -APP_ENV=${APP_ENV} php bin/console refresh +APP_ENV=${APP_ENV:-prod} php bin/console refresh echo "Starting update..." -APP_ENV=${APP_ENV} php bin/console update +APP_ENV=${APP_ENV:-prod} php bin/console update echo "Starting build..." -APP_ENV=${APP_ENV} php bin/console build +APP_ENV=${APP_ENV:-prod} php bin/console build echo "Done!" diff --git a/src/Command/BuildCommand.php b/src/Command/BuildCommand.php index fdde508..2a6ef1a 100644 --- a/src/Command/BuildCommand.php +++ b/src/Command/BuildCommand.php @@ -29,7 +29,7 @@ public function __construct( Builder $builder, EntityManagerInterface $entityManager, Storage\PackageStore $storage, - $name = null + ?string $name = null ) { $this->builder = $builder; diff --git a/src/Command/RefreshCommand.php b/src/Command/RefreshCommand.php index e67c2bd..1ca4d59 100644 --- a/src/Command/RefreshCommand.php +++ b/src/Command/RefreshCommand.php @@ -19,7 +19,7 @@ class RefreshCommand extends Command /** @var EntityManagerInterface */ private $entityManager; - public function __construct(EntityManagerInterface $entityManager, $name = null) + public function __construct(EntityManagerInterface $entityManager, ?string $name = null) { $this->connection = $entityManager->getConnection(); $this->entityManager = $entityManager; @@ -38,12 +38,20 @@ protected function configure() InputOption::VALUE_REQUIRED, 'Path to svn executable', 'svn' + ) + ->addOption( + 'limit', + null, + InputOption::VALUE_REQUIRED, + 'Limit the number of packages to process (for testing)', + 0 ); } protected function execute(InputInterface $input, OutputInterface $output): int { $svn = $input->getOption('svn'); + $limit = (int) $input->getOption('limit'); $types = [ 'plugin' => Plugin::class, @@ -71,20 +79,31 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->connection->beginTransaction(); $newCount = 0; + $processedCount = 0; foreach ($xml->list->entry as $entry) { + if ($limit > 0 && $processedCount >= $limit) { + $output->writeln("Reached limit of $limit packages, stopping."); + break; + } + $date = date('Y-m-d H:i:s', strtotime((string) $entry->commit->date)); - $params = [ - ':class_name' => $class_name, - ':name' => (string) $entry->name, - ':date' => $date, - ':group' => Package::makeComposerProviderGroup($date) - ]; - - $updateStmt->execute($params); - if ($updateStmt->rowCount() == 0) { - $insertStmt->execute($params); + $group = Package::makeComposerProviderGroup($date); + + $updateStmt->bindValue('date', $date); + $updateStmt->bindValue('group', $group); + $updateStmt->bindValue('class_name', $class_name); + $updateStmt->bindValue('name', (string) $entry->name); + + $affectedRows = $updateStmt->executeStatement(); + if ($affectedRows == 0) { + $insertStmt->bindValue('class_name', $class_name); + $insertStmt->bindValue('name', (string) $entry->name); + $insertStmt->bindValue('date', $date); + $insertStmt->bindValue('group', $group); + $insertStmt->executeStatement(); $newCount++; } + $processedCount++; } $this->connection->commit(); diff --git a/src/Command/UpdateCommand.php b/src/Command/UpdateCommand.php index fcc3349..f7a1730 100644 --- a/src/Command/UpdateCommand.php +++ b/src/Command/UpdateCommand.php @@ -14,7 +14,7 @@ class UpdateCommand extends Command /** @var Update */ protected $updateService; - public function __construct(Update $updateService, $name = null) + public function __construct(Update $updateService, ?string $name = null) { $this->updateService = $updateService; diff --git a/src/Controller/MainController.php b/src/Controller/MainController.php index 2846fd9..244610d 100644 --- a/src/Controller/MainController.php +++ b/src/Controller/MainController.php @@ -26,7 +26,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Routing\Attribute\Route; use Outlandish\Wpackagist\Storage; class MainController extends AbstractController @@ -50,9 +50,7 @@ public function __construct( $this->storage = $storage; } - /** - * @Route("packages.json", name="json_index") - */ + #[Route('/packages.json', name: 'json_index')] public function packageIndexJson(): Response { $response = new Response($this->storage->loadRoot()); @@ -61,12 +59,7 @@ public function packageIndexJson(): Response return $response; } - /** - * @Route("p/{provider}${hash}.json", name="json_provider", requirements={"hash"="[0-9a-f]{64}"}) - * @param string $provider - * @param string $hash - * @return Response - */ + #[Route('/p/{provider}${hash}.json', name: 'json_provider', requirements: ['hash' => '[0-9a-f]{64}'])] public function providerJson(string $provider, string $hash): Response { $data = $this->storage->loadProvider($provider, $hash); @@ -81,13 +74,7 @@ public function providerJson(string $provider, string $hash): Response return $response; } - /** - * @Route("p/{dir}/{package}${hash}.json", name="json_package", requirements={"hash"="[0-9a-f]{64}"}) - * @param string $dir Directory: wpackagist-plugin or wpackagist-theme. - * @param string $package - * @param string $hash - * @return Response - */ + #[Route('/p/{dir}/{package}${hash}.json', name: 'json_package', requirements: ['hash' => '[0-9a-f]{64}'])] public function packageJson(string $package, string $hash, string $dir): Response { $dir = str_replace('.', '', $dir); @@ -108,6 +95,11 @@ public function packageJson(string $package, string $hash, string $dir): Respons return $response; } + public function health(): Response + { + return new Response('OK', 200); + } + public function home(Request $request): Response { return $this->render('index.twig', [ @@ -193,7 +185,7 @@ public function update( $storage->prepare(true); // first run the update command - $name = $request->get('name'); + $name = $request->request->get('name'); if (is_array($name)) { $name = reset($name); @@ -211,7 +203,18 @@ public function update( return new Response('Not Found',404); } - $requestCount = $this->requestRepository->getRequestCountByIp($request->getClientIp(), 0); + // Get the real client IP from proxy headers (e.g. Cloudflare -> Cloud Platform LB -> App) + $clientIp = $request->headers->get('CF-Connecting-IP') + ?? $request->headers->get('X-Forwarded-For') + ?? $request->headers->get('X-Real-IP') + ?? $request->getClientIp(); + + // X-Forwarded-For can contain multiple IPs (client, proxy1, proxy2), take the first + if (str_contains($clientIp, ',')) { + $clientIp = trim(explode(',', $clientIp)[0]); + } + + $requestCount = $this->requestRepository->getRequestCountByIp($clientIp, 0); if ($requestCount > 5) { return new Response('Too many requests. Try again in an hour.', 403); } diff --git a/src/Entity/Package.php b/src/Entity/Package.php index 32be742..76903cc 100644 --- a/src/Entity/Package.php +++ b/src/Entity/Package.php @@ -6,28 +6,26 @@ use DateTime; use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass=PackageRepository::class) - * @ORM\Table( - * name="packages", - * uniqueConstraints={ - * @ORM\UniqueConstraint(name="package_type_and_name_unique", columns={"class_name", "name"}), - * }, - * indexes={ - * @ORM\Index(name="package_class_and_last_committed_idx", columns={"class_name", "last_committed"}), - * @ORM\Index(name="package_last_committed_idx", columns={"last_committed"}), - * @ORM\Index(name="package_last_fetched_idx", columns={"last_fetched"}), - * @ORM\Index(name="package_provider_group_idx", columns={"provider_group"}), - * @ORM\Index(name="package_is_active_idx", columns={"is_active"}), - * } - * ) - * @ORM\InheritanceType("SINGLE_TABLE") - * @ORM\DiscriminatorColumn(name="class_name", type="string") - * @ORM\DiscriminatorMap({ - * "Outlandish\Wpackagist\Entity\Plugin" = "Plugin", - * "Outlandish\Wpackagist\Entity\Theme" = "Theme", - * }) - */ +#[ORM\Entity(repositoryClass: PackageRepository::class)] +#[ORM\Table( + name: 'packages', + uniqueConstraints: [ + new ORM\UniqueConstraint(name: 'package_type_and_name_unique', columns: ['class_name', 'name']), + ], + indexes: [ + new ORM\Index(name: 'package_class_and_last_committed_idx', columns: ['class_name', 'last_committed']), + new ORM\Index(name: 'package_last_committed_idx', columns: ['last_committed']), + new ORM\Index(name: 'package_last_fetched_idx', columns: ['last_fetched']), + new ORM\Index(name: 'package_provider_group_idx', columns: ['provider_group']), + new ORM\Index(name: 'package_is_active_idx', columns: ['is_active']), + ] +)] +#[ORM\InheritanceType('SINGLE_TABLE')] +#[ORM\DiscriminatorColumn(name: 'class_name', type: 'string')] +#[ORM\DiscriminatorMap([ + 'Outlandish\Wpackagist\Entity\Plugin' => 'Plugin', + 'Outlandish\Wpackagist\Entity\Theme' => 'Theme', +])] abstract class Package { const VENDOR_NAME = ''; @@ -37,55 +35,31 @@ abstract class Package const PROVIDER_GROUP_OLD_CUTOFF = '2011-01-01'; - /** - * @ORM\Id - * @ORM\Column(type="integer") - * @ORM\GeneratedValue(strategy="IDENTITY") - * @var int - */ - protected $id; + #[ORM\Id] + #[ORM\Column(type: 'integer')] + #[ORM\GeneratedValue(strategy: 'IDENTITY')] + protected int $id; - /** - * @ORM\Column(type="string") - * @var string WordPress package name - */ - protected $name; + #[ORM\Column(type: 'string')] + protected string $name; - /** - * @ORM\Column(type="string", options={"default": "old"}, nullable=false) - * @var string WordPress package name - */ - protected $providerGroup; + #[ORM\Column(type: 'string', options: ['default' => 'old'], nullable: false)] + protected string $providerGroup; - /** - * @ORM\Column(type="datetime") - * @var DateTime - */ - protected $lastCommitted; + #[ORM\Column(type: 'datetime')] + protected DateTime $lastCommitted; - /** - * @ORM\Column(type="datetime", nullable=true) - * @var DateTime|null - */ - protected $lastFetched = null; + #[ORM\Column(type: 'datetime', nullable: true)] + protected ?DateTime $lastFetched = null; - /** - * @ORM\Column(type="json", nullable=true) - * @var array|null - */ - protected $versions = null; + #[ORM\Column(type: 'json', nullable: true)] + protected ?array $versions = null; - /** - * @ORM\Column(type="boolean") - * @var bool - */ - protected $isActive; + #[ORM\Column(type: 'boolean')] + protected bool $isActive; - /** - * @ORM\Column(type="string", nullable=true) - * @var string|null WordPress package name - */ - protected $displayName = null; + #[ORM\Column(type: 'string', nullable: true)] + protected ?string $displayName = null; /** * @return string URL, e.g. 'https://downloads.wordpress.org/plugin/plugin.1.0.zip'. diff --git a/src/Entity/PackageData.php b/src/Entity/PackageData.php index 2eb05ed..8b4407b 100644 --- a/src/Entity/PackageData.php +++ b/src/Entity/PackageData.php @@ -4,44 +4,27 @@ use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity() - * @ORM\Table(indexes={@ORM\Index(name="package_data_is_latest_idx", columns={"is_latest"})}) - */ +#[ORM\Entity()] +#[ORM\Table(indexes: [new ORM\Index(name: 'package_data_is_latest_idx', columns: ['is_latest'])])] class PackageData { - /** - * @ORM\Id() - * @ORM\Column(type="string", length=10) - * @var string - */ - protected $type; + #[ORM\Id()] + #[ORM\Column(type: 'string', length: 10)] + protected string $type; - /** - * @ORM\Id() - * @ORM\Column(type="string", length=200) - * @var string - */ - protected $name; + #[ORM\Id()] + #[ORM\Column(type: 'string', length: 200)] + protected string $name; - /** - * @ORM\Id() - * @ORM\Column(type="string", length=64) - * @var string - */ - protected $hash; + #[ORM\Id()] + #[ORM\Column(type: 'string', length: 64)] + protected string $hash; - /** - * @ORM\Column(type="text", length=65535, nullable=true) - * @var string - */ - protected $value; + #[ORM\Column(type: 'text', length: 65535, nullable: true)] + protected ?string $value = null; - /** - * @ORM\Column(type="boolean", options={"default": 0}, nullable=false) - * @var boolean - */ - protected $isLatest = false; + #[ORM\Column(type: 'boolean', options: ['default' => 0], nullable: false)] + protected bool $isLatest = false; /** * @return string diff --git a/src/Entity/Plugin.php b/src/Entity/Plugin.php index 4bc5818..a0219a9 100644 --- a/src/Entity/Plugin.php +++ b/src/Entity/Plugin.php @@ -4,9 +4,7 @@ use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity() - */ +#[ORM\Entity()] class Plugin extends Package { const VENDOR_NAME = 'wpackagist-plugin'; diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 6c6a342..563c41b 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -5,37 +5,23 @@ use DateTime; use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass=RequestRepository::class) - * @ORM\Table(name="requests") - */ +#[ORM\Entity(repositoryClass: RequestRepository::class)] +#[ORM\Table(name: 'requests')] class Request { - /** - * @ORM\Id - * @ORM\Column(type="integer") - * @ORM\GeneratedValue(strategy="IDENTITY") - * @var int - */ - protected $id; - - /** - * @ORM\Column(type="string", length=15, unique=true) - * @var string - */ - protected $ipAddress; - - /** - * @ORM\Column(type="datetime") - * @var DateTime - */ - protected $lastRequest; - - /** - * @ORM\Column(type="integer") - * @var int - */ - protected $requestCount = 0; + #[ORM\Id] + #[ORM\Column(type: 'integer')] + #[ORM\GeneratedValue(strategy: 'IDENTITY')] + protected int $id; + + #[ORM\Column(type: 'string', length: 45, unique: true)] + protected string $ipAddress; + + #[ORM\Column(type: 'datetime')] + protected DateTime $lastRequest; + + #[ORM\Column(type: 'integer')] + protected int $requestCount = 0; public function addRequest(): void { diff --git a/src/Entity/RequestRepository.php b/src/Entity/RequestRepository.php index 5667967..67ed1b4 100644 --- a/src/Entity/RequestRepository.php +++ b/src/Entity/RequestRepository.php @@ -20,10 +20,11 @@ class RequestRepository extends EntityRepository /** @var LoggerInterface */ protected $logger; - public function __construct(EntityManagerInterface $em, Mapping\ClassMetadata $class, LoggerInterface $logger) + public function __construct(EntityManagerInterface $em, LoggerInterface $logger) { $this->logger = $logger; + $class = $em->getClassMetadata(Request::class); parent::__construct($em, $class); } diff --git a/src/Entity/Theme.php b/src/Entity/Theme.php index 1c8310a..fbc6bf9 100644 --- a/src/Entity/Theme.php +++ b/src/Entity/Theme.php @@ -4,9 +4,7 @@ use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity() - */ +#[ORM\Entity()] class Theme extends Package { const VENDOR_NAME = 'wpackagist-theme'; diff --git a/src/Migrations/Version20260218160339.php b/src/Migrations/Version20260218160339.php new file mode 100644 index 0000000..2611bfb --- /dev/null +++ b/src/Migrations/Version20260218160339.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE requests ALTER COLUMN ip_address TYPE VARCHAR(45)'); + } + + public function down(Schema $schema): void + { + // Revert to original length (only safe if no IPv6 addresses stored) + $this->addSql('ALTER TABLE requests ALTER COLUMN ip_address TYPE VARCHAR(15)'); + } +} diff --git a/src/Persistence/RetrySafeEntityManager.php b/src/Persistence/RetrySafeEntityManager.php index 3a1a57d..99e273e 100644 --- a/src/Persistence/RetrySafeEntityManager.php +++ b/src/Persistence/RetrySafeEntityManager.php @@ -114,14 +114,14 @@ public function persist($object): void * * {@inheritDoc} */ - public function flush($entity = null): void + public function flush(): void { try { - $this->entityManager->flush($entity); + $this->entityManager->flush(); } catch (EntityManagerClosed $closedException) { $this->logger->warning('EM closed. RetrySafeEntityManager::flush() trying with a new instance'); $this->resetManager(); - $this->entityManager->flush($entity); + $this->entityManager->flush(); } } @@ -134,13 +134,13 @@ public function resetManager(): void * We need to override the base `EntityManager` call with the equivalent so that repositories * contain the retry-safe EM (i.e. `$this` in our current context) and not the default one. */ - public function getRepository($className) + public function getRepository(string $className): ORM\EntityRepository { return $this->ormConfig->getRepositoryFactory()->getRepository($this, $className); } private function buildEntityManager(): EntityManagerInterface { - return EntityManager::create($this->connection, $this->ormConfig); + return new EntityManager($this->connection, $this->ormConfig); } } diff --git a/src/Service/Builder.php b/src/Service/Builder.php index e81fe42..1cdf832 100644 --- a/src/Service/Builder.php +++ b/src/Service/Builder.php @@ -77,12 +77,16 @@ public function updateRoot(): void ksort($includes); - $content = json_encode([ + $content = [ 'packages' => [], 'providers-url' => '/' . $providerFormat, 'provider-includes' => $includes, 'available-package-patterns' => ['wpackagist-plugin/*', 'wpackagist-theme/*'], - ]); + ]; + if (false !== getenv('COMPOSER_MESSAGE')) { + $content['info'] = getenv('COMPOSER_MESSAGE'); + } + $content = json_encode($content); $this->storage->saveRoot($content); } diff --git a/src/Service/MetaNavService.php b/src/Service/MetaNavService.php new file mode 100644 index 0000000..b9e16e2 --- /dev/null +++ b/src/Service/MetaNavService.php @@ -0,0 +1,62 @@ +cache = $cache; + } + + /** + * Get meta navigation data from WP Engine API (cached). + * + * @return array|null + */ + public function getData(): ?array + { + try { + return $this->cache->get(self::CACHE_KEY, function (ItemInterface $item) { + $item->expiresAfter(self::CACHE_TTL); + + $context = stream_context_create([ + 'http' => [ + 'header' => "Accept: application/json\r\nUser-Agent: WPackagist\r\n", + 'timeout' => 5, + ], + ]); + + $response = @file_get_contents(self::API_URL, false, $context); + + if ($response === false) { + return null; + } + + return json_decode($response, true); + }); + } catch (\Exception $e) { + // Return null to gracefully degrade + return null; + } + } + + /** + * Get the current domain for highlighting active nav item. + * + * @return string + */ + public function getCurrentDomain(): string + { + return 'wpackagist.org'; + } +} diff --git a/src/Storage/Database.php b/src/Storage/Database.php index b86d5a5..15b36cc 100644 --- a/src/Storage/Database.php +++ b/src/Storage/Database.php @@ -67,7 +67,7 @@ public function loadRoot(): ?string return $this->loadEntity(self::TYPE_ROOT, '', ''); } - public function loadLatestEntities($type, $names = null): array + public function loadLatestEntities(string $type, ?array $names = null): array { // we're not interested in the models, only the keyed values, so don't use the repository $qb = new QueryBuilder($this->entityManager); @@ -88,7 +88,7 @@ public function loadLatestEntities($type, $names = null): array return $values; } - public function loadAllPackages($packageNames): array + public function loadAllPackages(?array $packageNames): array { return $this->loadLatestEntities(self::TYPE_PACKAGE, $packageNames); } diff --git a/src/Twig/AssetExtension.php b/src/Twig/AssetExtension.php new file mode 100644 index 0000000..68a22e0 --- /dev/null +++ b/src/Twig/AssetExtension.php @@ -0,0 +1,38 @@ +webDir = $projectDir . '/web'; + } + + public function getFunctions(): array + { + return [ + new TwigFunction('asset_version', [$this, 'assetVersion']), + ]; + } + + /** + * Returns an asset path with a cache-busting query string based on file modification time. + */ + public function assetVersion(string $path): string + { + $filePath = $this->webDir . $path; + + if (file_exists($filePath)) { + $mtime = filemtime($filePath); + return $path . '?v=' . $mtime; + } + + return $path; + } +} diff --git a/src/Twig/MetaNavExtension.php b/src/Twig/MetaNavExtension.php new file mode 100644 index 0000000..9545bba --- /dev/null +++ b/src/Twig/MetaNavExtension.php @@ -0,0 +1,25 @@ +metaNavService = $metaNavService; + } + + public function getGlobals(): array + { + return [ + 'metanav_data' => $this->metaNavService->getData(), + 'current_domain' => $this->metaNavService->getCurrentDomain(), + ]; + } +} diff --git a/symfony.lock b/symfony.lock index d58dea9..55534e1 100644 --- a/symfony.lock +++ b/symfony.lock @@ -8,9 +8,6 @@ "composer/composer": { "version": "2.0.3" }, - "composer/package-versions-deprecated": { - "version": "1.11.99.5" - }, "composer/semver": { "version": "3.2.2" }, @@ -20,27 +17,9 @@ "composer/xdebug-handler": { "version": "1.4.4" }, - "doctrine/annotations": { - "version": "1.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "1.0", - "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" - }, - "files": [ - "config/routes/annotations.yaml" - ] - }, - "doctrine/cache": { - "version": "2.1.1" - }, "doctrine/collections": { "version": "1.6.4" }, - "doctrine/common": { - "version": "2.13.0" - }, "doctrine/dbal": { "version": "2.12.0" }, @@ -100,9 +79,6 @@ "doctrine/sql-formatter": { "version": "1.0.1" }, - "friendsofphp/proxy-manager-lts": { - "version": "v1.0.0" - }, "guzzlehttp/command": { "version": "1.0.0" }, @@ -121,9 +97,6 @@ "justinrainbow/json-schema": { "version": "5.2.11" }, - "laminas/laminas-code": { - "version": "3.5.1" - }, "monolog/monolog": { "version": "2.2.0" }, @@ -288,9 +261,6 @@ "symfony/polyfill-mbstring": { "version": "v1.20.0" }, - "symfony/polyfill-php72": { - "version": "v1.20.0" - }, "symfony/polyfill-php73": { "version": "v1.17.0" }, diff --git a/web/assets/css/foundation.css b/web/assets/css/foundation.css deleted file mode 100644 index a3f707c..0000000 --- a/web/assets/css/foundation.css +++ /dev/null @@ -1,3365 +0,0 @@ -meta.foundation-version { - font-family: "/5.5.0/"; } - -meta.foundation-mq-small { - font-family: "/only screen/"; - width: 0; } - -meta.foundation-mq-small-only { - font-family: "/only screen and (max-width: 40em)/"; - width: 0; } - -meta.foundation-mq-medium { - font-family: "/only screen and (min-width:40.063em)/"; - width: 40.063em; } - -meta.foundation-mq-medium-only { - font-family: "/only screen and (min-width:40.063em) and (max-width:64em)/"; - width: 40.063em; } - -meta.foundation-mq-large { - font-family: "/only screen and (min-width:64.063em)/"; - width: 64.063em; } - -meta.foundation-mq-large-only { - font-family: "/only screen and (min-width:64.063em) and (max-width:90em)/"; - width: 64.063em; } - -meta.foundation-mq-xlarge { - font-family: "/only screen and (min-width:90.063em)/"; - width: 90.063em; } - -meta.foundation-mq-xlarge-only { - font-family: "/only screen and (min-width:90.063em) and (max-width:120em)/"; - width: 90.063em; } - -meta.foundation-mq-xxlarge { - font-family: "/only screen and (min-width:120.063em)/"; - width: 120.063em; } - -meta.foundation-data-attribute-namespace { - font-family: false; } - -html, body { - height: 100%; } - -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - -html, -body { - font-size: 100%; } - -body { - background: #fff; - color: #222222; - padding: 0; - margin: 0; - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - font-weight: normal; - font-style: normal; - line-height: 1.5; - position: relative; - cursor: auto; } - -a:hover { - cursor: pointer; } - -img { - max-width: 100%; - height: auto; } - -img { - -ms-interpolation-mode: bicubic; } - -#map_canvas img, -#map_canvas embed, -#map_canvas object, -.map_canvas img, -.map_canvas embed, -.map_canvas object { - max-width: none !important; } - -.left { - float: left !important; } - -.right { - float: right !important; } - -.clearfix:before, .clearfix:after { - content: " "; - display: table; } -.clearfix:after { - clear: both; } - -.hide { - display: none !important; - visibility: hidden; } - -.invisible { - visibility: hidden; } - -.antialiased { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } - -img { - display: inline-block; - vertical-align: middle; } - -textarea { - height: auto; - min-height: 50px; } - -select { - width: 100%; } - -.row { - width: 100%; - margin-left: auto; - margin-right: auto; - margin-top: 0; - margin-bottom: 0; - max-width: 62.5em; } - .row:before, .row:after { - content: " "; - display: table; } - .row:after { - clear: both; } - .row.collapse > .column, - .row.collapse > .columns { - padding-left: 0; - padding-right: 0; } - .row.collapse .row { - margin-left: 0; - margin-right: 0; } - .row .row { - width: auto; - margin-left: -0.9375em; - margin-right: -0.9375em; - margin-top: 0; - margin-bottom: 0; - max-width: none; } - .row .row:before, .row .row:after { - content: " "; - display: table; } - .row .row:after { - clear: both; } - .row .row.collapse { - width: auto; - margin: 0; - max-width: none; } - .row .row.collapse:before, .row .row.collapse:after { - content: " "; - display: table; } - .row .row.collapse:after { - clear: both; } - -.column, -.columns { - padding-left: 0.9375em; - padding-right: 0.9375em; - width: 100%; - float: left; } - -[class*="column"] + [class*="column"]:last-child { - float: right; } - -[class*="column"] + [class*="column"].end { - float: left; } - -@media only screen { - .small-push-0 { - position: relative; - left: 0%; - right: auto; } - - .small-pull-0 { - position: relative; - right: 0%; - left: auto; } - - .small-push-1 { - position: relative; - left: 8.33333%; - right: auto; } - - .small-pull-1 { - position: relative; - right: 8.33333%; - left: auto; } - - .small-push-2 { - position: relative; - left: 16.66667%; - right: auto; } - - .small-pull-2 { - position: relative; - right: 16.66667%; - left: auto; } - - .small-push-3 { - position: relative; - left: 25%; - right: auto; } - - .small-pull-3 { - position: relative; - right: 25%; - left: auto; } - - .small-push-4 { - position: relative; - left: 33.33333%; - right: auto; } - - .small-pull-4 { - position: relative; - right: 33.33333%; - left: auto; } - - .small-push-5 { - position: relative; - left: 41.66667%; - right: auto; } - - .small-pull-5 { - position: relative; - right: 41.66667%; - left: auto; } - - .small-push-6 { - position: relative; - left: 50%; - right: auto; } - - .small-pull-6 { - position: relative; - right: 50%; - left: auto; } - - .small-push-7 { - position: relative; - left: 58.33333%; - right: auto; } - - .small-pull-7 { - position: relative; - right: 58.33333%; - left: auto; } - - .small-push-8 { - position: relative; - left: 66.66667%; - right: auto; } - - .small-pull-8 { - position: relative; - right: 66.66667%; - left: auto; } - - .small-push-9 { - position: relative; - left: 75%; - right: auto; } - - .small-pull-9 { - position: relative; - right: 75%; - left: auto; } - - .small-push-10 { - position: relative; - left: 83.33333%; - right: auto; } - - .small-pull-10 { - position: relative; - right: 83.33333%; - left: auto; } - - .small-push-11 { - position: relative; - left: 91.66667%; - right: auto; } - - .small-pull-11 { - position: relative; - right: 91.66667%; - left: auto; } - - .column, - .columns { - position: relative; - padding-left: 0.9375em; - padding-right: 0.9375em; - float: left; } - - .small-1 { - width: 8.33333%; } - - .small-2 { - width: 16.66667%; } - - .small-3 { - width: 25%; } - - .small-4 { - width: 33.33333%; } - - .small-5 { - width: 41.66667%; } - - .small-6 { - width: 50%; } - - .small-7 { - width: 58.33333%; } - - .small-8 { - width: 66.66667%; } - - .small-9 { - width: 75%; } - - .small-10 { - width: 83.33333%; } - - .small-11 { - width: 91.66667%; } - - .small-12 { - width: 100%; } - - .small-offset-0 { - margin-left: 0% !important; } - - .small-offset-1 { - margin-left: 8.33333% !important; } - - .small-offset-2 { - margin-left: 16.66667% !important; } - - .small-offset-3 { - margin-left: 25% !important; } - - .small-offset-4 { - margin-left: 33.33333% !important; } - - .small-offset-5 { - margin-left: 41.66667% !important; } - - .small-offset-6 { - margin-left: 50% !important; } - - .small-offset-7 { - margin-left: 58.33333% !important; } - - .small-offset-8 { - margin-left: 66.66667% !important; } - - .small-offset-9 { - margin-left: 75% !important; } - - .small-offset-10 { - margin-left: 83.33333% !important; } - - .small-offset-11 { - margin-left: 91.66667% !important; } - - .small-reset-order { - margin-left: 0; - margin-right: 0; - left: auto; - right: auto; - float: left; } - - .column.small-centered, - .columns.small-centered { - margin-left: auto; - margin-right: auto; - float: none; } - - .column.small-uncentered, - .columns.small-uncentered { - margin-left: 0; - margin-right: 0; - float: left; } - - .column.small-centered:last-child, - .columns.small-centered:last-child { - float: none; } - - .column.small-uncentered:last-child, - .columns.small-uncentered:last-child { - float: left; } - - .column.small-uncentered.opposite, - .columns.small-uncentered.opposite { - float: right; } - - .row.small-collapse > .column, - .row.small-collapse > .columns { - padding-left: 0; - padding-right: 0; } - .row.small-collapse .row { - margin-left: 0; - margin-right: 0; } - .row.small-uncollapse > .column, - .row.small-uncollapse > .columns { - padding-left: 0.9375em; - padding-right: 0.9375em; - float: left; } } -@media only screen and (min-width: 40.063em) { - .medium-push-0 { - position: relative; - left: 0%; - right: auto; } - - .medium-pull-0 { - position: relative; - right: 0%; - left: auto; } - - .medium-push-1 { - position: relative; - left: 8.33333%; - right: auto; } - - .medium-pull-1 { - position: relative; - right: 8.33333%; - left: auto; } - - .medium-push-2 { - position: relative; - left: 16.66667%; - right: auto; } - - .medium-pull-2 { - position: relative; - right: 16.66667%; - left: auto; } - - .medium-push-3 { - position: relative; - left: 25%; - right: auto; } - - .medium-pull-3 { - position: relative; - right: 25%; - left: auto; } - - .medium-push-4 { - position: relative; - left: 33.33333%; - right: auto; } - - .medium-pull-4 { - position: relative; - right: 33.33333%; - left: auto; } - - .medium-push-5 { - position: relative; - left: 41.66667%; - right: auto; } - - .medium-pull-5 { - position: relative; - right: 41.66667%; - left: auto; } - - .medium-push-6 { - position: relative; - left: 50%; - right: auto; } - - .medium-pull-6 { - position: relative; - right: 50%; - left: auto; } - - .medium-push-7 { - position: relative; - left: 58.33333%; - right: auto; } - - .medium-pull-7 { - position: relative; - right: 58.33333%; - left: auto; } - - .medium-push-8 { - position: relative; - left: 66.66667%; - right: auto; } - - .medium-pull-8 { - position: relative; - right: 66.66667%; - left: auto; } - - .medium-push-9 { - position: relative; - left: 75%; - right: auto; } - - .medium-pull-9 { - position: relative; - right: 75%; - left: auto; } - - .medium-push-10 { - position: relative; - left: 83.33333%; - right: auto; } - - .medium-pull-10 { - position: relative; - right: 83.33333%; - left: auto; } - - .medium-push-11 { - position: relative; - left: 91.66667%; - right: auto; } - - .medium-pull-11 { - position: relative; - right: 91.66667%; - left: auto; } - - .column, - .columns { - position: relative; - padding-left: 0.9375em; - padding-right: 0.9375em; - float: left; } - - .medium-1 { - width: 8.33333%; } - - .medium-2 { - width: 16.66667%; } - - .medium-3 { - width: 25%; } - - .medium-4 { - width: 33.33333%; } - - .medium-5 { - width: 41.66667%; } - - .medium-6 { - width: 50%; } - - .medium-7 { - width: 58.33333%; } - - .medium-8 { - width: 66.66667%; } - - .medium-9 { - width: 75%; } - - .medium-10 { - width: 83.33333%; } - - .medium-11 { - width: 91.66667%; } - - .medium-12 { - width: 100%; } - - .medium-offset-0 { - margin-left: 0% !important; } - - .medium-offset-1 { - margin-left: 8.33333% !important; } - - .medium-offset-2 { - margin-left: 16.66667% !important; } - - .medium-offset-3 { - margin-left: 25% !important; } - - .medium-offset-4 { - margin-left: 33.33333% !important; } - - .medium-offset-5 { - margin-left: 41.66667% !important; } - - .medium-offset-6 { - margin-left: 50% !important; } - - .medium-offset-7 { - margin-left: 58.33333% !important; } - - .medium-offset-8 { - margin-left: 66.66667% !important; } - - .medium-offset-9 { - margin-left: 75% !important; } - - .medium-offset-10 { - margin-left: 83.33333% !important; } - - .medium-offset-11 { - margin-left: 91.66667% !important; } - - .medium-reset-order { - margin-left: 0; - margin-right: 0; - left: auto; - right: auto; - float: left; } - - .column.medium-centered, - .columns.medium-centered { - margin-left: auto; - margin-right: auto; - float: none; } - - .column.medium-uncentered, - .columns.medium-uncentered { - margin-left: 0; - margin-right: 0; - float: left; } - - .column.medium-centered:last-child, - .columns.medium-centered:last-child { - float: none; } - - .column.medium-uncentered:last-child, - .columns.medium-uncentered:last-child { - float: left; } - - .column.medium-uncentered.opposite, - .columns.medium-uncentered.opposite { - float: right; } - - .row.medium-collapse > .column, - .row.medium-collapse > .columns { - padding-left: 0; - padding-right: 0; } - .row.medium-collapse .row { - margin-left: 0; - margin-right: 0; } - .row.medium-uncollapse > .column, - .row.medium-uncollapse > .columns { - padding-left: 0.9375em; - padding-right: 0.9375em; - float: left; } - - .push-0 { - position: relative; - left: 0%; - right: auto; } - - .pull-0 { - position: relative; - right: 0%; - left: auto; } - - .push-1 { - position: relative; - left: 8.33333%; - right: auto; } - - .pull-1 { - position: relative; - right: 8.33333%; - left: auto; } - - .push-2 { - position: relative; - left: 16.66667%; - right: auto; } - - .pull-2 { - position: relative; - right: 16.66667%; - left: auto; } - - .push-3 { - position: relative; - left: 25%; - right: auto; } - - .pull-3 { - position: relative; - right: 25%; - left: auto; } - - .push-4 { - position: relative; - left: 33.33333%; - right: auto; } - - .pull-4 { - position: relative; - right: 33.33333%; - left: auto; } - - .push-5 { - position: relative; - left: 41.66667%; - right: auto; } - - .pull-5 { - position: relative; - right: 41.66667%; - left: auto; } - - .push-6 { - position: relative; - left: 50%; - right: auto; } - - .pull-6 { - position: relative; - right: 50%; - left: auto; } - - .push-7 { - position: relative; - left: 58.33333%; - right: auto; } - - .pull-7 { - position: relative; - right: 58.33333%; - left: auto; } - - .push-8 { - position: relative; - left: 66.66667%; - right: auto; } - - .pull-8 { - position: relative; - right: 66.66667%; - left: auto; } - - .push-9 { - position: relative; - left: 75%; - right: auto; } - - .pull-9 { - position: relative; - right: 75%; - left: auto; } - - .push-10 { - position: relative; - left: 83.33333%; - right: auto; } - - .pull-10 { - position: relative; - right: 83.33333%; - left: auto; } - - .push-11 { - position: relative; - left: 91.66667%; - right: auto; } - - .pull-11 { - position: relative; - right: 91.66667%; - left: auto; } } -@media only screen and (min-width: 64.063em) { - .large-push-0 { - position: relative; - left: 0%; - right: auto; } - - .large-pull-0 { - position: relative; - right: 0%; - left: auto; } - - .large-push-1 { - position: relative; - left: 8.33333%; - right: auto; } - - .large-pull-1 { - position: relative; - right: 8.33333%; - left: auto; } - - .large-push-2 { - position: relative; - left: 16.66667%; - right: auto; } - - .large-pull-2 { - position: relative; - right: 16.66667%; - left: auto; } - - .large-push-3 { - position: relative; - left: 25%; - right: auto; } - - .large-pull-3 { - position: relative; - right: 25%; - left: auto; } - - .large-push-4 { - position: relative; - left: 33.33333%; - right: auto; } - - .large-pull-4 { - position: relative; - right: 33.33333%; - left: auto; } - - .large-push-5 { - position: relative; - left: 41.66667%; - right: auto; } - - .large-pull-5 { - position: relative; - right: 41.66667%; - left: auto; } - - .large-push-6 { - position: relative; - left: 50%; - right: auto; } - - .large-pull-6 { - position: relative; - right: 50%; - left: auto; } - - .large-push-7 { - position: relative; - left: 58.33333%; - right: auto; } - - .large-pull-7 { - position: relative; - right: 58.33333%; - left: auto; } - - .large-push-8 { - position: relative; - left: 66.66667%; - right: auto; } - - .large-pull-8 { - position: relative; - right: 66.66667%; - left: auto; } - - .large-push-9 { - position: relative; - left: 75%; - right: auto; } - - .large-pull-9 { - position: relative; - right: 75%; - left: auto; } - - .large-push-10 { - position: relative; - left: 83.33333%; - right: auto; } - - .large-pull-10 { - position: relative; - right: 83.33333%; - left: auto; } - - .large-push-11 { - position: relative; - left: 91.66667%; - right: auto; } - - .large-pull-11 { - position: relative; - right: 91.66667%; - left: auto; } - - .column, - .columns { - position: relative; - padding-left: 0.9375em; - padding-right: 0.9375em; - float: left; } - - .large-1 { - width: 8.33333%; } - - .large-2 { - width: 16.66667%; } - - .large-3 { - width: 25%; } - - .large-4 { - width: 33.33333%; } - - .large-5 { - width: 41.66667%; } - - .large-6 { - width: 50%; } - - .large-7 { - width: 58.33333%; } - - .large-8 { - width: 66.66667%; } - - .large-9 { - width: 75%; } - - .large-10 { - width: 83.33333%; } - - .large-11 { - width: 91.66667%; } - - .large-12 { - width: 100%; } - - .large-offset-0 { - margin-left: 0% !important; } - - .large-offset-1 { - margin-left: 8.33333% !important; } - - .large-offset-2 { - margin-left: 16.66667% !important; } - - .large-offset-3 { - margin-left: 25% !important; } - - .large-offset-4 { - margin-left: 33.33333% !important; } - - .large-offset-5 { - margin-left: 41.66667% !important; } - - .large-offset-6 { - margin-left: 50% !important; } - - .large-offset-7 { - margin-left: 58.33333% !important; } - - .large-offset-8 { - margin-left: 66.66667% !important; } - - .large-offset-9 { - margin-left: 75% !important; } - - .large-offset-10 { - margin-left: 83.33333% !important; } - - .large-offset-11 { - margin-left: 91.66667% !important; } - - .large-reset-order { - margin-left: 0; - margin-right: 0; - left: auto; - right: auto; - float: left; } - - .column.large-centered, - .columns.large-centered { - margin-left: auto; - margin-right: auto; - float: none; } - - .column.large-uncentered, - .columns.large-uncentered { - margin-left: 0; - margin-right: 0; - float: left; } - - .column.large-centered:last-child, - .columns.large-centered:last-child { - float: none; } - - .column.large-uncentered:last-child, - .columns.large-uncentered:last-child { - float: left; } - - .column.large-uncentered.opposite, - .columns.large-uncentered.opposite { - float: right; } - - .row.large-collapse > .column, - .row.large-collapse > .columns { - padding-left: 0; - padding-right: 0; } - .row.large-collapse .row { - margin-left: 0; - margin-right: 0; } - .row.large-uncollapse > .column, - .row.large-uncollapse > .columns { - padding-left: 0.9375em; - padding-right: 0.9375em; - float: left; } - - .push-0 { - position: relative; - left: 0%; - right: auto; } - - .pull-0 { - position: relative; - right: 0%; - left: auto; } - - .push-1 { - position: relative; - left: 8.33333%; - right: auto; } - - .pull-1 { - position: relative; - right: 8.33333%; - left: auto; } - - .push-2 { - position: relative; - left: 16.66667%; - right: auto; } - - .pull-2 { - position: relative; - right: 16.66667%; - left: auto; } - - .push-3 { - position: relative; - left: 25%; - right: auto; } - - .pull-3 { - position: relative; - right: 25%; - left: auto; } - - .push-4 { - position: relative; - left: 33.33333%; - right: auto; } - - .pull-4 { - position: relative; - right: 33.33333%; - left: auto; } - - .push-5 { - position: relative; - left: 41.66667%; - right: auto; } - - .pull-5 { - position: relative; - right: 41.66667%; - left: auto; } - - .push-6 { - position: relative; - left: 50%; - right: auto; } - - .pull-6 { - position: relative; - right: 50%; - left: auto; } - - .push-7 { - position: relative; - left: 58.33333%; - right: auto; } - - .pull-7 { - position: relative; - right: 58.33333%; - left: auto; } - - .push-8 { - position: relative; - left: 66.66667%; - right: auto; } - - .pull-8 { - position: relative; - right: 66.66667%; - left: auto; } - - .push-9 { - position: relative; - left: 75%; - right: auto; } - - .pull-9 { - position: relative; - right: 75%; - left: auto; } - - .push-10 { - position: relative; - left: 83.33333%; - right: auto; } - - .pull-10 { - position: relative; - right: 83.33333%; - left: auto; } - - .push-11 { - position: relative; - left: 91.66667%; - right: auto; } - - .pull-11 { - position: relative; - right: 91.66667%; - left: auto; } } -.alert-box { - border-style: solid; - border-width: 1px; - display: block; - font-weight: normal; - margin-bottom: 1.25rem; - position: relative; - padding: 0.875rem 1.5rem 0.875rem 0.875rem; - font-size: 0.8125rem; - transition: opacity 300ms ease-out; - background-color: #2ba6cb; - border-color: #258faf; - color: #FFFFFF; } - .alert-box .close { - font-size: 1.375rem; - padding: 9px 6px 4px; - line-height: 0; - position: absolute; - top: 50%; - margin-top: -0.6875rem; - right: 0.25rem; - color: #333333; - opacity: 0.3; - background: inherit; } - .alert-box .close:hover, .alert-box .close:focus { - opacity: 0.5; } - .alert-box.radius { - border-radius: 3px; } - .alert-box.round { - border-radius: 1000px; } - .alert-box.success { - background-color: #5da423; - border-color: #508d1e; - color: #FFFFFF; } - .alert-box.alert { - background-color: #c60f13; - border-color: #aa0d10; - color: #FFFFFF; } - .alert-box.secondary { - background-color: #e9e9e9; - border-color: #c8c8c8; - color: #4f4f4f; } - .alert-box.warning { - background-color: #f08a24; - border-color: #de770f; - color: #FFFFFF; } - .alert-box.info { - background-color: #a0d3e8; - border-color: #74bfdd; - color: #4f4f4f; } - .alert-box.alert-close { - opacity: 0; } - -.inline-list { - margin: 0 auto 1.0625rem auto; - margin-left: -1.375rem; - margin-right: 0; - padding: 0; - list-style: none; - overflow: hidden; } - .inline-list > li { - list-style: none; - float: left; - margin-left: 1.375rem; - display: block; } - .inline-list > li > * { - display: block; } - -button, .button { - border-style: solid; - border-width: 0; - cursor: pointer; - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - font-weight: normal; - line-height: normal; - margin: 0 0 1.25rem; - position: relative; - text-decoration: none; - text-align: center; - -webkit-appearance: none; - border-radius: 0; - display: inline-block; - padding-top: 1rem; - padding-right: 2rem; - padding-bottom: 1.0625rem; - padding-left: 2rem; - font-size: 1rem; - background-color: #2ba6cb; - border-color: #2285a2; - color: #FFFFFF; - transition: background-color 300ms ease-out; } - button:hover, button:focus, .button:hover, .button:focus { - background-color: #2285a2; } - button:hover, button:focus, .button:hover, .button:focus { - color: #FFFFFF; } - button.secondary, .button.secondary { - background-color: #e9e9e9; - border-color: #bababa; - color: #333333; } - button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus { - background-color: #bababa; } - button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus { - color: #333333; } - button.success, .button.success { - background-color: #5da423; - border-color: #4a831c; - color: #FFFFFF; } - button.success:hover, button.success:focus, .button.success:hover, .button.success:focus { - background-color: #4a831c; } - button.success:hover, button.success:focus, .button.success:hover, .button.success:focus { - color: #FFFFFF; } - button.alert, .button.alert { - background-color: #c60f13; - border-color: #9e0c0f; - color: #FFFFFF; } - button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus { - background-color: #9e0c0f; } - button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus { - color: #FFFFFF; } - button.warning, .button.warning { - background-color: #f08a24; - border-color: #cf6e0e; - color: #FFFFFF; } - button.warning:hover, button.warning:focus, .button.warning:hover, .button.warning:focus { - background-color: #cf6e0e; } - button.warning:hover, button.warning:focus, .button.warning:hover, .button.warning:focus { - color: #FFFFFF; } - button.info, .button.info { - background-color: #a0d3e8; - border-color: #61b6d9; - color: #333333; } - button.info:hover, button.info:focus, .button.info:hover, .button.info:focus { - background-color: #61b6d9; } - button.info:hover, button.info:focus, .button.info:hover, .button.info:focus { - color: #FFFFFF; } - button.large, .button.large { - padding-top: 1.125rem; - padding-right: 2.25rem; - padding-bottom: 1.1875rem; - padding-left: 2.25rem; - font-size: 1.25rem; } - button.small, .button.small { - padding-top: 0.875rem; - padding-right: 1.75rem; - padding-bottom: 0.9375rem; - padding-left: 1.75rem; - font-size: 0.8125rem; } - button.tiny, .button.tiny { - padding-top: 0.625rem; - padding-right: 1.25rem; - padding-bottom: 0.6875rem; - padding-left: 1.25rem; - font-size: 0.6875rem; } - button.expand, .button.expand { - padding-right: 0; - padding-left: 0; - width: 100%; } - button.left-align, .button.left-align { - text-align: left; - text-indent: 0.75rem; } - button.right-align, .button.right-align { - text-align: right; - padding-right: 0.75rem; } - button.radius, .button.radius { - border-radius: 3px; } - button.round, .button.round { - border-radius: 1000px; } - button.disabled, button[disabled], .button.disabled, .button[disabled] { - background-color: #2ba6cb; - border-color: #2285a2; - color: #FFFFFF; - cursor: default; - opacity: 0.7; - box-shadow: none; } - button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { - background-color: #2285a2; } - button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { - color: #FFFFFF; } - button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus { - background-color: #2ba6cb; } - button.disabled.secondary, button[disabled].secondary, .button.disabled.secondary, .button[disabled].secondary { - background-color: #e9e9e9; - border-color: #bababa; - color: #333333; - cursor: default; - opacity: 0.7; - box-shadow: none; } - button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { - background-color: #bababa; } - button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { - color: #333333; } - button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus { - background-color: #e9e9e9; } - button.disabled.success, button[disabled].success, .button.disabled.success, .button[disabled].success { - background-color: #5da423; - border-color: #4a831c; - color: #FFFFFF; - cursor: default; - opacity: 0.7; - box-shadow: none; } - button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { - background-color: #4a831c; } - button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { - color: #FFFFFF; } - button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus { - background-color: #5da423; } - button.disabled.alert, button[disabled].alert, .button.disabled.alert, .button[disabled].alert { - background-color: #c60f13; - border-color: #9e0c0f; - color: #FFFFFF; - cursor: default; - opacity: 0.7; - box-shadow: none; } - button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { - background-color: #9e0c0f; } - button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { - color: #FFFFFF; } - button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus { - background-color: #c60f13; } - button.disabled.warning, button[disabled].warning, .button.disabled.warning, .button[disabled].warning { - background-color: #f08a24; - border-color: #cf6e0e; - color: #FFFFFF; - cursor: default; - opacity: 0.7; - box-shadow: none; } - button.disabled.warning:hover, button.disabled.warning:focus, button[disabled].warning:hover, button[disabled].warning:focus, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning:hover, .button[disabled].warning:focus { - background-color: #cf6e0e; } - button.disabled.warning:hover, button.disabled.warning:focus, button[disabled].warning:hover, button[disabled].warning:focus, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning:hover, .button[disabled].warning:focus { - color: #FFFFFF; } - button.disabled.warning:hover, button.disabled.warning:focus, button[disabled].warning:hover, button[disabled].warning:focus, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning:hover, .button[disabled].warning:focus { - background-color: #f08a24; } - button.disabled.info, button[disabled].info, .button.disabled.info, .button[disabled].info { - background-color: #a0d3e8; - border-color: #61b6d9; - color: #333333; - cursor: default; - opacity: 0.7; - box-shadow: none; } - button.disabled.info:hover, button.disabled.info:focus, button[disabled].info:hover, button[disabled].info:focus, .button.disabled.info:hover, .button.disabled.info:focus, .button[disabled].info:hover, .button[disabled].info:focus { - background-color: #61b6d9; } - button.disabled.info:hover, button.disabled.info:focus, button[disabled].info:hover, button[disabled].info:focus, .button.disabled.info:hover, .button.disabled.info:focus, .button[disabled].info:hover, .button[disabled].info:focus { - color: #FFFFFF; } - button.disabled.info:hover, button.disabled.info:focus, button[disabled].info:hover, button[disabled].info:focus, .button.disabled.info:hover, .button.disabled.info:focus, .button[disabled].info:hover, .button[disabled].info:focus { - background-color: #a0d3e8; } - -button::-moz-focus-inner { - border: 0; - padding: 0; } - -@media only screen and (min-width: 40.063em) { - button, .button { - display: inline-block; } } -.button-group { - list-style: none; - margin: 0; - left: 0; } - .button-group:before, .button-group:after { - content: " "; - display: table; } - .button-group:after { - clear: both; } - .button-group > li { - margin: 0 -2px; - display: inline-block; } - .button-group > li > button, .button-group > li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group > li:first-child button, .button-group > li:first-child .button { - border-left: 0; } - .button-group.stack > li { - margin: 0 -2px; - display: inline-block; - display: block; - margin: 0; - float: none; } - .button-group.stack > li > button, .button-group.stack > li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.stack > li:first-child button, .button-group.stack > li:first-child .button { - border-left: 0; } - .button-group.stack > li > button, .button-group.stack > li .button { - border-top: 1px solid; - border-color: rgba(255, 255, 255, 0.5); - border-left-width: 0; - margin: 0; - display: block; } - .button-group.stack > li:first-child button, .button-group.stack > li:first-child .button { - border-top: 0; } - .button-group.stack-for-small > li { - margin: 0 -2px; - display: inline-block; } - .button-group.stack-for-small > li > button, .button-group.stack-for-small > li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.stack-for-small > li:first-child button, .button-group.stack-for-small > li:first-child .button { - border-left: 0; } - @media only screen and (max-width: 40em) { - .button-group.stack-for-small > li { - margin: 0 -2px; - display: inline-block; - display: block; - margin: 0; } - .button-group.stack-for-small > li > button, .button-group.stack-for-small > li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.stack-for-small > li:first-child button, .button-group.stack-for-small > li:first-child .button { - border-left: 0; } - .button-group.stack-for-small > li > button, .button-group.stack-for-small > li .button { - border-top: 1px solid; - border-color: rgba(255, 255, 255, 0.5); - border-left-width: 0; - margin: 0; - display: block; } - .button-group.stack-for-small > li:first-child button, .button-group.stack-for-small > li:first-child .button { - border-top: 0; } } - .button-group.radius > * { - margin: 0 -2px; - display: inline-block; } - .button-group.radius > * > button, .button-group.radius > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.radius > *:first-child button, .button-group.radius > *:first-child .button { - border-left: 0; } - .button-group.radius > *, .button-group.radius > * > a, .button-group.radius > * > button, .button-group.radius > * > .button { - border-radius: 0; } - .button-group.radius > *:first-child, .button-group.radius > *:first-child > a, .button-group.radius > *:first-child > button, .button-group.radius > *:first-child > .button { - -webkit-border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } - .button-group.radius > *:last-child, .button-group.radius > *:last-child > a, .button-group.radius > *:last-child > button, .button-group.radius > *:last-child > .button { - -webkit-border-bottom-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .button-group.radius.stack > * { - margin: 0 -2px; - display: inline-block; - display: block; - margin: 0; } - .button-group.radius.stack > * > button, .button-group.radius.stack > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.radius.stack > *:first-child button, .button-group.radius.stack > *:first-child .button { - border-left: 0; } - .button-group.radius.stack > * > button, .button-group.radius.stack > * .button { - border-top: 1px solid; - border-color: rgba(255, 255, 255, 0.5); - border-left-width: 0; - margin: 0; - display: block; } - .button-group.radius.stack > *:first-child button, .button-group.radius.stack > *:first-child .button { - border-top: 0; } - .button-group.radius.stack > *, .button-group.radius.stack > * > a, .button-group.radius.stack > * > button, .button-group.radius.stack > * > .button { - border-radius: 0; } - .button-group.radius.stack > *:first-child, .button-group.radius.stack > *:first-child > a, .button-group.radius.stack > *:first-child > button, .button-group.radius.stack > *:first-child > .button { - -webkit-top-left-radius: 3px; - -webkit-top-right-radius: 3px; - border-top-left-radius: 3px; - border-top-right-radius: 3px; } - .button-group.radius.stack > *:last-child, .button-group.radius.stack > *:last-child > a, .button-group.radius.stack > *:last-child > button, .button-group.radius.stack > *:last-child > .button { - -webkit-bottom-left-radius: 3px; - -webkit-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; } - @media only screen and (min-width: 40.063em) { - .button-group.radius.stack-for-small > * { - margin: 0 -2px; - display: inline-block; } - .button-group.radius.stack-for-small > * > button, .button-group.radius.stack-for-small > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.radius.stack-for-small > *:first-child button, .button-group.radius.stack-for-small > *:first-child .button { - border-left: 0; } - .button-group.radius.stack-for-small > *, .button-group.radius.stack-for-small > * > a, .button-group.radius.stack-for-small > * > button, .button-group.radius.stack-for-small > * > .button { - border-radius: 0; } - .button-group.radius.stack-for-small > *:first-child, .button-group.radius.stack-for-small > *:first-child > a, .button-group.radius.stack-for-small > *:first-child > button, .button-group.radius.stack-for-small > *:first-child > .button { - -webkit-border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } - .button-group.radius.stack-for-small > *:last-child, .button-group.radius.stack-for-small > *:last-child > a, .button-group.radius.stack-for-small > *:last-child > button, .button-group.radius.stack-for-small > *:last-child > .button { - -webkit-border-bottom-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } } - @media only screen and (max-width: 40em) { - .button-group.radius.stack-for-small > * { - margin: 0 -2px; - display: inline-block; - display: block; - margin: 0; } - .button-group.radius.stack-for-small > * > button, .button-group.radius.stack-for-small > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.radius.stack-for-small > *:first-child button, .button-group.radius.stack-for-small > *:first-child .button { - border-left: 0; } - .button-group.radius.stack-for-small > * > button, .button-group.radius.stack-for-small > * .button { - border-top: 1px solid; - border-color: rgba(255, 255, 255, 0.5); - border-left-width: 0; - margin: 0; - display: block; } - .button-group.radius.stack-for-small > *:first-child button, .button-group.radius.stack-for-small > *:first-child .button { - border-top: 0; } - .button-group.radius.stack-for-small > *, .button-group.radius.stack-for-small > * > a, .button-group.radius.stack-for-small > * > button, .button-group.radius.stack-for-small > * > .button { - border-radius: 0; } - .button-group.radius.stack-for-small > *:first-child, .button-group.radius.stack-for-small > *:first-child > a, .button-group.radius.stack-for-small > *:first-child > button, .button-group.radius.stack-for-small > *:first-child > .button { - -webkit-top-left-radius: 3px; - -webkit-top-right-radius: 3px; - border-top-left-radius: 3px; - border-top-right-radius: 3px; } - .button-group.radius.stack-for-small > *:last-child, .button-group.radius.stack-for-small > *:last-child > a, .button-group.radius.stack-for-small > *:last-child > button, .button-group.radius.stack-for-small > *:last-child > .button { - -webkit-bottom-left-radius: 3px; - -webkit-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; } } - .button-group.round > * { - margin: 0 -2px; - display: inline-block; } - .button-group.round > * > button, .button-group.round > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.round > *:first-child button, .button-group.round > *:first-child .button { - border-left: 0; } - .button-group.round > *, .button-group.round > * > a, .button-group.round > * > button, .button-group.round > * > .button { - border-radius: 0; } - .button-group.round > *:first-child, .button-group.round > *:first-child > a, .button-group.round > *:first-child > button, .button-group.round > *:first-child > .button { - -webkit-border-bottom-left-radius: 1000px; - -webkit-border-top-left-radius: 1000px; - border-bottom-left-radius: 1000px; - border-top-left-radius: 1000px; } - .button-group.round > *:last-child, .button-group.round > *:last-child > a, .button-group.round > *:last-child > button, .button-group.round > *:last-child > .button { - -webkit-border-bottom-right-radius: 1000px; - -webkit-border-top-right-radius: 1000px; - border-bottom-right-radius: 1000px; - border-top-right-radius: 1000px; } - .button-group.round.stack > * { - margin: 0 -2px; - display: inline-block; - display: block; - margin: 0; } - .button-group.round.stack > * > button, .button-group.round.stack > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.round.stack > *:first-child button, .button-group.round.stack > *:first-child .button { - border-left: 0; } - .button-group.round.stack > * > button, .button-group.round.stack > * .button { - border-top: 1px solid; - border-color: rgba(255, 255, 255, 0.5); - border-left-width: 0; - margin: 0; - display: block; } - .button-group.round.stack > *:first-child button, .button-group.round.stack > *:first-child .button { - border-top: 0; } - .button-group.round.stack > *, .button-group.round.stack > * > a, .button-group.round.stack > * > button, .button-group.round.stack > * > .button { - border-radius: 0; } - .button-group.round.stack > *:first-child, .button-group.round.stack > *:first-child > a, .button-group.round.stack > *:first-child > button, .button-group.round.stack > *:first-child > .button { - -webkit-top-left-radius: 1rem; - -webkit-top-right-radius: 1rem; - border-top-left-radius: 1rem; - border-top-right-radius: 1rem; } - .button-group.round.stack > *:last-child, .button-group.round.stack > *:last-child > a, .button-group.round.stack > *:last-child > button, .button-group.round.stack > *:last-child > .button { - -webkit-bottom-left-radius: 1rem; - -webkit-bottom-right-radius: 1rem; - border-bottom-left-radius: 1rem; - border-bottom-right-radius: 1rem; } - @media only screen and (min-width: 40.063em) { - .button-group.round.stack-for-small > * { - margin: 0 -2px; - display: inline-block; } - .button-group.round.stack-for-small > * > button, .button-group.round.stack-for-small > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.round.stack-for-small > *:first-child button, .button-group.round.stack-for-small > *:first-child .button { - border-left: 0; } - .button-group.round.stack-for-small > *, .button-group.round.stack-for-small > * > a, .button-group.round.stack-for-small > * > button, .button-group.round.stack-for-small > * > .button { - border-radius: 0; } - .button-group.round.stack-for-small > *:first-child, .button-group.round.stack-for-small > *:first-child > a, .button-group.round.stack-for-small > *:first-child > button, .button-group.round.stack-for-small > *:first-child > .button { - -webkit-border-bottom-left-radius: 1000px; - -webkit-border-top-left-radius: 1000px; - border-bottom-left-radius: 1000px; - border-top-left-radius: 1000px; } - .button-group.round.stack-for-small > *:last-child, .button-group.round.stack-for-small > *:last-child > a, .button-group.round.stack-for-small > *:last-child > button, .button-group.round.stack-for-small > *:last-child > .button { - -webkit-border-bottom-right-radius: 1000px; - -webkit-border-top-right-radius: 1000px; - border-bottom-right-radius: 1000px; - border-top-right-radius: 1000px; } } - @media only screen and (max-width: 40em) { - .button-group.round.stack-for-small > * { - margin: 0 -2px; - display: inline-block; - display: block; - margin: 0; } - .button-group.round.stack-for-small > * > button, .button-group.round.stack-for-small > * .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.round.stack-for-small > *:first-child button, .button-group.round.stack-for-small > *:first-child .button { - border-left: 0; } - .button-group.round.stack-for-small > * > button, .button-group.round.stack-for-small > * .button { - border-top: 1px solid; - border-color: rgba(255, 255, 255, 0.5); - border-left-width: 0; - margin: 0; - display: block; } - .button-group.round.stack-for-small > *:first-child button, .button-group.round.stack-for-small > *:first-child .button { - border-top: 0; } - .button-group.round.stack-for-small > *, .button-group.round.stack-for-small > * > a, .button-group.round.stack-for-small > * > button, .button-group.round.stack-for-small > * > .button { - border-radius: 0; } - .button-group.round.stack-for-small > *:first-child, .button-group.round.stack-for-small > *:first-child > a, .button-group.round.stack-for-small > *:first-child > button, .button-group.round.stack-for-small > *:first-child > .button { - -webkit-top-left-radius: 1rem; - -webkit-top-right-radius: 1rem; - border-top-left-radius: 1rem; - border-top-right-radius: 1rem; } - .button-group.round.stack-for-small > *:last-child, .button-group.round.stack-for-small > *:last-child > a, .button-group.round.stack-for-small > *:last-child > button, .button-group.round.stack-for-small > *:last-child > .button { - -webkit-bottom-left-radius: 1rem; - -webkit-bottom-right-radius: 1rem; - border-bottom-left-radius: 1rem; - border-bottom-right-radius: 1rem; } } - .button-group.even-2 li { - margin: 0 -2px; - display: inline-block; - width: 50%; } - .button-group.even-2 li > button, .button-group.even-2 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-2 li:first-child button, .button-group.even-2 li:first-child .button { - border-left: 0; } - .button-group.even-2 li button, .button-group.even-2 li .button { - width: 100%; } - .button-group.even-3 li { - margin: 0 -2px; - display: inline-block; - width: 33.33333%; } - .button-group.even-3 li > button, .button-group.even-3 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-3 li:first-child button, .button-group.even-3 li:first-child .button { - border-left: 0; } - .button-group.even-3 li button, .button-group.even-3 li .button { - width: 100%; } - .button-group.even-4 li { - margin: 0 -2px; - display: inline-block; - width: 25%; } - .button-group.even-4 li > button, .button-group.even-4 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-4 li:first-child button, .button-group.even-4 li:first-child .button { - border-left: 0; } - .button-group.even-4 li button, .button-group.even-4 li .button { - width: 100%; } - .button-group.even-5 li { - margin: 0 -2px; - display: inline-block; - width: 20%; } - .button-group.even-5 li > button, .button-group.even-5 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-5 li:first-child button, .button-group.even-5 li:first-child .button { - border-left: 0; } - .button-group.even-5 li button, .button-group.even-5 li .button { - width: 100%; } - .button-group.even-6 li { - margin: 0 -2px; - display: inline-block; - width: 16.66667%; } - .button-group.even-6 li > button, .button-group.even-6 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-6 li:first-child button, .button-group.even-6 li:first-child .button { - border-left: 0; } - .button-group.even-6 li button, .button-group.even-6 li .button { - width: 100%; } - .button-group.even-7 li { - margin: 0 -2px; - display: inline-block; - width: 14.28571%; } - .button-group.even-7 li > button, .button-group.even-7 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-7 li:first-child button, .button-group.even-7 li:first-child .button { - border-left: 0; } - .button-group.even-7 li button, .button-group.even-7 li .button { - width: 100%; } - .button-group.even-8 li { - margin: 0 -2px; - display: inline-block; - width: 12.5%; } - .button-group.even-8 li > button, .button-group.even-8 li .button { - border-left: 1px solid; - border-color: rgba(255, 255, 255, 0.5); } - .button-group.even-8 li:first-child button, .button-group.even-8 li:first-child .button { - border-left: 0; } - .button-group.even-8 li button, .button-group.even-8 li .button { - width: 100%; } - -.button-bar:before, .button-bar:after { - content: " "; - display: table; } -.button-bar:after { - clear: both; } -.button-bar .button-group { - float: left; - margin-right: 0.625rem; } - .button-bar .button-group div { - overflow: hidden; } - -/* Panels */ -.panel { - border-style: solid; - border-width: 1px; - border-color: #d8d8d8; - margin-bottom: 1.25rem; - padding: 1.25rem; - background: #f2f2f2; - color: #333333; } - .panel > :first-child { - margin-top: 0; } - .panel > :last-child { - margin-bottom: 0; } - .panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6, .panel p, .panel li, .panel dl { - color: #333333; } - .panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6 { - line-height: 1; - margin-bottom: 0.625rem; } - .panel h1.subheader, .panel h2.subheader, .panel h3.subheader, .panel h4.subheader, .panel h5.subheader, .panel h6.subheader { - line-height: 1.4; } - .panel.callout { - border-style: solid; - border-width: 1px; - border-color: #c5e8f3; - margin-bottom: 1.25rem; - padding: 1.25rem; - background: #f2fafc; - color: #333333; } - .panel.callout > :first-child { - margin-top: 0; } - .panel.callout > :last-child { - margin-bottom: 0; } - .panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6, .panel.callout p, .panel.callout li, .panel.callout dl { - color: #333333; } - .panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6 { - line-height: 1; - margin-bottom: 0.625rem; } - .panel.callout h1.subheader, .panel.callout h2.subheader, .panel.callout h3.subheader, .panel.callout h4.subheader, .panel.callout h5.subheader, .panel.callout h6.subheader { - line-height: 1.4; } - .panel.callout a:not(.button) { - color: #2ba6cb; } - .panel.callout a:not(.button):hover, .panel.callout a:not(.button):focus { - color: #258faf; } - .panel.radius { - border-radius: 3px; } - -.pagination { - display: block; - min-height: 1.5rem; - margin-left: -0.3125rem; } - -.pagination__item { - font-size: 0.875rem; - font-weight: normal; - margin-left: 0.3125rem; - display: block; - padding: 0.0625rem 0.625rem 0.0625rem; - color: #999999; - background: none; - border-radius: 3px; - line-height: inherit; - transition: background-color 300ms ease-out; -} - -.pagination__item--disabled { - border-radius: 3px; - background: none; - cursor: default; -} - -.pagination__item:hover, -.pagination__item:focus { - background: #e6e6e6; } -.pagination__item--disabled:hover, -.pagination__item--disabled:focus, -.pagination__item--separator:hover, -.pagination__item--separator:focus { - background: transparent; -} -.pagination__item--current-page { - background: #2ba6cb; - color: #FFFFFF; - font-weight: bold; - cursor: default; } -.pagination__item--current-page:hover, .pagination__item--current-page:focus { - background: #2ba6cb; -} - .pagination__item { - float: left; - display: block; } - -.text-left { - text-align: left !important; } - -.text-right { - text-align: right !important; } - -.text-center { - text-align: center !important; } - -.text-justify { - text-align: justify !important; } - -@media only screen and (max-width: 40em) { - .small-only-text-left { - text-align: left !important; } - - .small-only-text-right { - text-align: right !important; } - - .small-only-text-center { - text-align: center !important; } - - .small-only-text-justify { - text-align: justify !important; } } -@media only screen { - .small-text-left { - text-align: left !important; } - - .small-text-right { - text-align: right !important; } - - .small-text-center { - text-align: center !important; } - - .small-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 40.063em) and (max-width: 64em) { - .medium-only-text-left { - text-align: left !important; } - - .medium-only-text-right { - text-align: right !important; } - - .medium-only-text-center { - text-align: center !important; } - - .medium-only-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 40.063em) { - .medium-text-left { - text-align: left !important; } - - .medium-text-right { - text-align: right !important; } - - .medium-text-center { - text-align: center !important; } - - .medium-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 64.063em) and (max-width: 90em) { - .large-only-text-left { - text-align: left !important; } - - .large-only-text-right { - text-align: right !important; } - - .large-only-text-center { - text-align: center !important; } - - .large-only-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 64.063em) { - .large-text-left { - text-align: left !important; } - - .large-text-right { - text-align: right !important; } - - .large-text-center { - text-align: center !important; } - - .large-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 90.063em) and (max-width: 120em) { - .xlarge-only-text-left { - text-align: left !important; } - - .xlarge-only-text-right { - text-align: right !important; } - - .xlarge-only-text-center { - text-align: center !important; } - - .xlarge-only-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 90.063em) { - .xlarge-text-left { - text-align: left !important; } - - .xlarge-text-right { - text-align: right !important; } - - .xlarge-text-center { - text-align: center !important; } - - .xlarge-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 120.063em) and (max-width: 99999999em) { - .xxlarge-only-text-left { - text-align: left !important; } - - .xxlarge-only-text-right { - text-align: right !important; } - - .xxlarge-only-text-center { - text-align: center !important; } - - .xxlarge-only-text-justify { - text-align: justify !important; } } -@media only screen and (min-width: 120.063em) { - .xxlarge-text-left { - text-align: left !important; } - - .xxlarge-text-right { - text-align: right !important; } - - .xxlarge-text-center { - text-align: center !important; } - - .xxlarge-text-justify { - text-align: justify !important; } } -/* Typography resets */ -div, -dl, -dt, -dd, -ul, -ol, -li, -h1, -h2, -h3, -h4, -h5, -h6, -pre, -form, -p, -blockquote, -th, -td { - margin: 0; - padding: 0; } - -/* Default Link Styles */ -a { - color: #2ba6cb; - text-decoration: none; - line-height: inherit; } - a:hover, a:focus { - color: #258faf; } - a img { - border: none; } - -/* Default paragraph styles */ -p { - font-family: inherit; - font-weight: normal; - font-size: 1rem; - line-height: 1.6; - margin-bottom: 1.25rem; - text-rendering: optimizeLegibility; } - p.lead { - font-size: 1.21875rem; - line-height: 1.6; } - p aside { - font-size: 0.875rem; - line-height: 1.35; - font-style: italic; } - -/* Default header styles */ -h1, h2, h3, h4, h5, h6 { - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - font-weight: normal; - font-style: normal; - color: #222222; - text-rendering: optimizeLegibility; - margin-top: 0.2rem; - margin-bottom: 0.5rem; - line-height: 1.4; } - h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { - font-size: 60%; - color: #6f6f6f; - line-height: 0; } - -h1 { - font-size: 2.125rem; } - -h2 { - font-size: 1.6875rem; } - -h3 { - font-size: 1.375rem; } - -h4 { - font-size: 1.125rem; } - -h5 { - font-size: 1.125rem; } - -h6 { - font-size: 1rem; } - -.subheader { - line-height: 1.4; - color: #6f6f6f; - font-weight: normal; - margin-top: 0.2rem; - margin-bottom: 0.5rem; } - -hr { - border: solid #DDDDDD; - border-width: 1px 0 0; - clear: both; - margin: 1.25rem 0 1.1875rem; - height: 0; } - -/* Helpful Typography Defaults */ -em, -i { - font-style: italic; - line-height: inherit; } - -strong, -b { - font-weight: bold; - line-height: inherit; } - -small { - font-size: 60%; - line-height: inherit; } - -code { - font-family: Consolas, "Liberation Mono", Courier, monospace; - font-weight: normal; - color: #333333; - background-color: #f8f8f8; - border-width: 1px; - border-style: solid; - border-color: #e0e0e0; - padding: 0.125rem 0.3125rem 0.0625rem; } - -/* Lists, page number nav */ -nav, -ul, -ol, -dl { - font-size: 1rem; - line-height: 1.6; - margin-bottom: 1.25rem; - list-style-position: outside; - font-family: inherit; } - -ul { - margin-left: 1.1rem; } - ul.no-bullet { - margin-left: 0; } - ul.no-bullet li ul, - ul.no-bullet li ol { - margin-left: 1.25rem; - margin-bottom: 0; - list-style: none; } - -/* Unordered Lists */ -ul li ul, -ul li ol { - margin-left: 1.25rem; - margin-bottom: 0; } -ul.square li ul, ul.circle li ul, ul.disc li ul { - list-style: inherit; } -ul.square { - list-style-type: square; - margin-left: 1.1rem; } -ul.circle { - list-style-type: circle; - margin-left: 1.1rem; } -ul.disc { - list-style-type: disc; - margin-left: 1.1rem; } -ul.no-bullet { - list-style: none; } - -/* Ordered Lists */ -ol { - margin-left: 1.4rem; } - ol li ul, - ol li ol { - margin-left: 1.25rem; - margin-bottom: 0; } - -/* Definition Lists */ -dl dt { - margin-bottom: 0.3rem; - font-weight: bold; } -dl dd { - margin-bottom: 0.75rem; } - -/* Abbreviations */ -abbr, -acronym { - text-transform: uppercase; - font-size: 90%; - color: #222222; - cursor: help; } - -abbr { - text-transform: none; } - abbr[title] { - border-bottom: 1px dotted #DDDDDD; } - -/* Blockquotes */ -blockquote { - margin: 0 0 1.25rem; - padding: 0.5625rem 1.25rem 0 1.1875rem; - border-left: 1px solid #DDDDDD; } - blockquote cite { - display: block; - font-size: 0.8125rem; - color: #555555; } - blockquote cite:before { - content: "\2014 \0020"; } - blockquote cite a, - blockquote cite a:visited { - color: #555555; } - -blockquote, -blockquote p { - line-height: 1.6; - color: #6f6f6f; } - -/* Microformats */ -.vcard { - display: inline-block; - margin: 0 0 1.25rem 0; - border: 1px solid #DDDDDD; - padding: 0.625rem 0.75rem; } - .vcard li { - margin: 0; - display: block; } - .vcard .fn { - font-weight: bold; - font-size: 0.9375rem; } - -.vevent .summary { - font-weight: bold; } -.vevent abbr { - cursor: default; - text-decoration: none; - font-weight: bold; - border: none; - padding: 0 0.0625rem; } - -@media only screen and (min-width: 40.063em) { - h1, h2, h3, h4, h5, h6 { - line-height: 1.4; } - - h1 { - font-size: 2.75rem; } - - h2 { - font-size: 2.3125rem; } - - h3 { - font-size: 1.6875rem; } - - h4 { - font-size: 1.4375rem; } - - h5 { - font-size: 1.125rem; } - - h6 { - font-size: 1rem; } } -/* - * Print styles. - * - * Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/ - * Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com) -*/ -.print-only { - display: none !important; } - -@media print { - * { - background: transparent !important; - color: #000000 !important; - /* Black prints faster: h5bp.com/s */ - box-shadow: none !important; - text-shadow: none !important; } - - a, - a:visited { - text-decoration: underline; } - - a[href]:after { - content: " (" attr(href) ")"; } - - abbr[title]:after { - content: " (" attr(title) ")"; } - - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; } - - pre, - blockquote { - border: 1px solid #999999; - page-break-inside: avoid; } - - thead { - display: table-header-group; - /* h5bp.com/t */ } - - tr, - img { - page-break-inside: avoid; } - - img { - max-width: 100% !important; } - - @page { - margin: 0.5cm; } - p, - h2, - h3 { - orphans: 3; - widows: 3; } - - h2, - h3 { - page-break-after: avoid; } - - .hide-on-print { - display: none !important; } - - .print-only { - display: block !important; } - - .hide-for-print { - display: none !important; } - - .show-for-print { - display: inherit !important; } } -.label { - font-weight: normal; - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - text-align: center; - text-decoration: none; - line-height: 1; - white-space: nowrap; - display: inline-block; - position: relative; - margin-bottom: auto; - padding: 0.25rem 0.5rem 0.25rem; - font-size: 0.6875rem; - background-color: #2ba6cb; - color: #FFFFFF; } - .label.radius { - border-radius: 3px; } - .label.round { - border-radius: 1000px; } - .label.alert { - background-color: #c60f13; - color: #FFFFFF; } - .label.warning { - background-color: #f08a24; - color: #FFFFFF; } - .label.success { - background-color: #5da423; - color: #FFFFFF; } - .label.secondary { - background-color: #e9e9e9; - color: #333333; } - .label.info { - background-color: #a0d3e8; - color: #333333; } - -table { - background: #FFFFFF; - margin-bottom: 1.25rem; - border: solid 1px #DDDDDD; - table-layout: auto; } - table caption { - background: transparent; - color: #222222; - font-size: 1rem; - font-weight: bold; } - table thead { - background: #F5F5F5; } - table thead tr th, - table thead tr td { - padding: 0.5rem 0.625rem 0.625rem; - font-size: 0.875rem; - font-weight: bold; - color: #222222; } - table tfoot { - background: #F5F5F5; } - table tfoot tr th, - table tfoot tr td { - padding: 0.5rem 0.625rem 0.625rem; - font-size: 0.875rem; - font-weight: bold; - color: #222222; } - table tr th, - table tr td { - padding: 0.5625rem 0.625rem; - font-size: 0.875rem; - color: #222222; - text-align: left; } - table tr.even, table tr.alt, table tr:nth-of-type(even) { - background: #F9F9F9; } - table thead tr th, - table tfoot tr th, - table tfoot tr td, - table tbody tr th, - table tbody tr td, - table tr td { - display: table-cell; - line-height: 1.125rem; } - -/* Standard Forms */ -form { - margin: 0 0 1rem; } - -/* Using forms within rows, we need to set some defaults */ -form .row .row { - margin: 0 -0.5rem; } - form .row .row .column, - form .row .row .columns { - padding: 0 0.5rem; } - form .row .row.collapse { - margin: 0; } - form .row .row.collapse .column, - form .row .row.collapse .columns { - padding: 0; } - form .row .row.collapse input { - -webkit-border-bottom-right-radius: 0; - -webkit-border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-top-right-radius: 0; } -form .row input.column, -form .row input.columns, -form .row textarea.column, -form .row textarea.columns { - padding-left: 0.5rem; } - -/* Label Styles */ -label { - font-size: 0.875rem; - color: #4d4d4d; - cursor: pointer; - display: block; - font-weight: normal; - line-height: 1.5; - margin-bottom: 0; - /* Styles for required inputs */ } - label.right { - float: none !important; - text-align: right; } - label.inline { - margin: 0 0 1rem 0; - padding: 0.5625rem 0; } - label small { - text-transform: capitalize; - color: #676767; } - -/* Attach elements to the beginning or end of an input */ -.prefix, -.postfix { - display: block; - position: relative; - z-index: 2; - text-align: center; - width: 100%; - padding-top: 0; - padding-bottom: 0; - border-style: solid; - border-width: 1px; - overflow: hidden; - font-size: 0.875rem; - height: 2.3125rem; - line-height: 2.3125rem; } - -/* Adjust padding, alignment and radius if pre/post element is a button */ -.postfix.button { - padding-left: 0; - padding-right: 0; - padding-top: 0; - padding-bottom: 0; - text-align: center; - border: none; } - -.prefix.button { - padding-left: 0; - padding-right: 0; - padding-top: 0; - padding-bottom: 0; - text-align: center; - border: none; } - -.prefix.button.radius { - border-radius: 0; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } - -.postfix.button.radius { - border-radius: 0; - -webkit-border-bottom-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - -.prefix.button.round { - border-radius: 0; - -webkit-border-bottom-left-radius: 1000px; - -webkit-border-top-left-radius: 1000px; - border-bottom-left-radius: 1000px; - border-top-left-radius: 1000px; } - -.postfix.button.round { - border-radius: 0; - -webkit-border-bottom-right-radius: 1000px; - -webkit-border-top-right-radius: 1000px; - border-bottom-right-radius: 1000px; - border-top-right-radius: 1000px; } - -/* Separate prefix and postfix styles when on span or label so buttons keep their own */ -span.prefix, label.prefix { - background: #f2f2f2; - border-right: none; - color: #333333; - border-color: #cccccc; } - -span.postfix, label.postfix { - background: #f2f2f2; - border-left: none; - color: #333333; - border-color: #cccccc; } - -/* We use this to get basic styling on all basic form elements */ -input[type="text"], input[type="password"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="week"], input[type="email"], input[type="number"], input[type="search"], input[type="tel"], input[type="time"], input[type="url"], input[type="color"], textarea { - -webkit-appearance: none; - border-radius: 0; - background-color: #FFFFFF; - font-family: inherit; - border-style: solid; - border-width: 1px; - border-color: #cccccc; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - color: rgba(0, 0, 0, 0.75); - display: block; - font-size: 0.875rem; - margin: 0 0 1rem 0; - padding: 0.5rem; - height: 2.3125rem; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - transition: box-shadow 0.45s, border-color 0.45s ease-in-out; } - input[type="text"]:focus, input[type="password"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="week"]:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="time"]:focus, input[type="url"]:focus, input[type="color"]:focus, textarea:focus { - box-shadow: 0 0 5px #999999; - border-color: #999999; } - input[type="text"]:focus, input[type="password"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="week"]:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="time"]:focus, input[type="url"]:focus, input[type="color"]:focus, textarea:focus { - background: #fafafa; - border-color: #999999; - outline: none; } - input[type="text"]:disabled, input[type="password"]:disabled, input[type="date"]:disabled, input[type="datetime"]:disabled, input[type="datetime-local"]:disabled, input[type="month"]:disabled, input[type="week"]:disabled, input[type="email"]:disabled, input[type="number"]:disabled, input[type="search"]:disabled, input[type="tel"]:disabled, input[type="time"]:disabled, input[type="url"]:disabled, input[type="color"]:disabled, textarea:disabled { - background-color: #DDDDDD; - cursor: default; } - input[type="text"][disabled], input[type="text"][readonly], fieldset[disabled] input[type="text"], input[type="password"][disabled], input[type="password"][readonly], fieldset[disabled] input[type="password"], input[type="date"][disabled], input[type="date"][readonly], fieldset[disabled] input[type="date"], input[type="datetime"][disabled], input[type="datetime"][readonly], fieldset[disabled] input[type="datetime"], input[type="datetime-local"][disabled], input[type="datetime-local"][readonly], fieldset[disabled] input[type="datetime-local"], input[type="month"][disabled], input[type="month"][readonly], fieldset[disabled] input[type="month"], input[type="week"][disabled], input[type="week"][readonly], fieldset[disabled] input[type="week"], input[type="email"][disabled], input[type="email"][readonly], fieldset[disabled] input[type="email"], input[type="number"][disabled], input[type="number"][readonly], fieldset[disabled] input[type="number"], input[type="search"][disabled], input[type="search"][readonly], fieldset[disabled] input[type="search"], input[type="tel"][disabled], input[type="tel"][readonly], fieldset[disabled] input[type="tel"], input[type="time"][disabled], input[type="time"][readonly], fieldset[disabled] input[type="time"], input[type="url"][disabled], input[type="url"][readonly], fieldset[disabled] input[type="url"], input[type="color"][disabled], input[type="color"][readonly], fieldset[disabled] input[type="color"], textarea[disabled], textarea[readonly], fieldset[disabled] textarea { - background-color: #DDDDDD; - cursor: default; } - input[type="text"].radius, input[type="password"].radius, input[type="date"].radius, input[type="datetime"].radius, input[type="datetime-local"].radius, input[type="month"].radius, input[type="week"].radius, input[type="email"].radius, input[type="number"].radius, input[type="search"].radius, input[type="tel"].radius, input[type="time"].radius, input[type="url"].radius, input[type="color"].radius, textarea.radius { - border-radius: 3px; } - -form .row .prefix-radius.row.collapse input, -form .row .prefix-radius.row.collapse textarea, -form .row .prefix-radius.row.collapse select { - border-radius: 0; - -webkit-border-bottom-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } -form .row .prefix-radius.row.collapse .prefix { - border-radius: 0; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } -form .row .postfix-radius.row.collapse input, -form .row .postfix-radius.row.collapse textarea, -form .row .postfix-radius.row.collapse select { - border-radius: 0; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } -form .row .postfix-radius.row.collapse .postfix { - border-radius: 0; - -webkit-border-bottom-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } -form .row .prefix-round.row.collapse input, -form .row .prefix-round.row.collapse textarea, -form .row .prefix-round.row.collapse select { - border-radius: 0; - -webkit-border-bottom-right-radius: 1000px; - -webkit-border-top-right-radius: 1000px; - border-bottom-right-radius: 1000px; - border-top-right-radius: 1000px; } -form .row .prefix-round.row.collapse .prefix { - border-radius: 0; - -webkit-border-bottom-left-radius: 1000px; - -webkit-border-top-left-radius: 1000px; - border-bottom-left-radius: 1000px; - border-top-left-radius: 1000px; } -form .row .postfix-round.row.collapse input, -form .row .postfix-round.row.collapse textarea, -form .row .postfix-round.row.collapse select { - border-radius: 0; - -webkit-border-bottom-left-radius: 1000px; - -webkit-border-top-left-radius: 1000px; - border-bottom-left-radius: 1000px; - border-top-left-radius: 1000px; } -form .row .postfix-round.row.collapse .postfix { - border-radius: 0; - -webkit-border-bottom-right-radius: 1000px; - -webkit-border-top-right-radius: 1000px; - border-bottom-right-radius: 1000px; - border-top-right-radius: 1000px; } - -input[type="submit"] { - -webkit-appearance: none; - border-radius: 0; } - -/* Respect enforced amount of rows for textarea */ -textarea[rows] { - height: auto; } - -/* Not allow resize out of parent */ -textarea { - max-width: 100%; } - -/* Add height value for select elements to match text input height */ -select { - -webkit-appearance: none !important; - border-radius: 0; - background-color: #FAFAFA; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+); - background-position: 100% center; - background-repeat: no-repeat; - border-style: solid; - border-width: 1px; - border-color: #cccccc; - padding: 0.5rem; - font-size: 0.875rem; - font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; - color: rgba(0, 0, 0, 0.75); - line-height: normal; - border-radius: 0; - height: 2.3125rem; } - select::-ms-expand { - display: none; } - select.radius { - border-radius: 3px; } - select:hover { - background-color: #f3f3f3; - border-color: #999999; } - select:disabled { - background-color: #DDDDDD; - cursor: default; } - -/* Adjust margin for form elements below */ -input[type="file"], -input[type="checkbox"], -input[type="radio"], -select { - margin: 0 0 1rem 0; } - -input[type="checkbox"] + label, -input[type="radio"] + label { - display: inline-block; - margin-left: 0.5rem; - margin-right: 1rem; - margin-bottom: 0; - vertical-align: baseline; } - -/* Normalize file input width */ -input[type="file"] { - width: 100%; } - -/* HTML5 Number spinners settings */ -/* We add basic fieldset styling */ -fieldset { - border: 1px solid #DDDDDD; - padding: 1.25rem; - margin: 1.125rem 0; } - fieldset legend { - font-weight: bold; - background: #FFFFFF; - padding: 0 0.1875rem; - margin: 0; - margin-left: -0.1875rem; } - -/* Error Handling */ -[data-abide] .error small.error, [data-abide] .error span.error, [data-abide] span.error, [data-abide] small.error { - display: block; - padding: 0.375rem 0.5625rem 0.5625rem; - margin-top: -1px; - margin-bottom: 1rem; - font-size: 0.75rem; - font-weight: normal; - font-style: italic; - background: #c60f13; - color: #FFFFFF; } -[data-abide] span.error, [data-abide] small.error { - display: none; } - -span.error, small.error { - display: block; - padding: 0.375rem 0.5625rem 0.5625rem; - margin-top: -1px; - margin-bottom: 1rem; - font-size: 0.75rem; - font-weight: normal; - font-style: italic; - background: #c60f13; - color: #FFFFFF; } - -.error input, -.error textarea, -.error select { - margin-bottom: 0; } -.error input[type="checkbox"], -.error input[type="radio"] { - margin-bottom: 1rem; } -.error label, -.error label.error { - color: #c60f13; } -.error small.error { - display: block; - padding: 0.375rem 0.5625rem 0.5625rem; - margin-top: -1px; - margin-bottom: 1rem; - font-size: 0.75rem; - font-weight: normal; - font-style: italic; - background: #c60f13; - color: #FFFFFF; } -.error > label > small { - color: #676767; - background: transparent; - padding: 0; - text-transform: capitalize; - font-style: normal; - font-size: 60%; - margin: 0; - display: inline; } -.error span.error-message { - display: block; } - -input.error, -textarea.error, -select.error { - margin-bottom: 0; } - -label.error { - color: #c60f13; } - -[class*="block-grid-"] { - display: block; - padding: 0; - margin: 0 -0.625rem; } - [class*="block-grid-"]:before, [class*="block-grid-"]:after { - content: " "; - display: table; } - [class*="block-grid-"]:after { - clear: both; } - [class*="block-grid-"] > li { - display: block; - height: auto; - float: left; - padding: 0 0.625rem 1.25rem; } - -@media only screen { - .small-block-grid-1 > li { - width: 100%; - list-style: none; } - .small-block-grid-1 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-1 > li:nth-of-type(1n+1) { - clear: both; } - - .small-block-grid-2 > li { - width: 50%; - list-style: none; } - .small-block-grid-2 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-2 > li:nth-of-type(2n+1) { - clear: both; } - - .small-block-grid-3 > li { - width: 33.33333%; - list-style: none; } - .small-block-grid-3 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-3 > li:nth-of-type(3n+1) { - clear: both; } - - .small-block-grid-4 > li { - width: 25%; - list-style: none; } - .small-block-grid-4 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-4 > li:nth-of-type(4n+1) { - clear: both; } - - .small-block-grid-5 > li { - width: 20%; - list-style: none; } - .small-block-grid-5 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-5 > li:nth-of-type(5n+1) { - clear: both; } - - .small-block-grid-6 > li { - width: 16.66667%; - list-style: none; } - .small-block-grid-6 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-6 > li:nth-of-type(6n+1) { - clear: both; } - - .small-block-grid-7 > li { - width: 14.28571%; - list-style: none; } - .small-block-grid-7 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-7 > li:nth-of-type(7n+1) { - clear: both; } - - .small-block-grid-8 > li { - width: 12.5%; - list-style: none; } - .small-block-grid-8 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-8 > li:nth-of-type(8n+1) { - clear: both; } - - .small-block-grid-9 > li { - width: 11.11111%; - list-style: none; } - .small-block-grid-9 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-9 > li:nth-of-type(9n+1) { - clear: both; } - - .small-block-grid-10 > li { - width: 10%; - list-style: none; } - .small-block-grid-10 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-10 > li:nth-of-type(10n+1) { - clear: both; } - - .small-block-grid-11 > li { - width: 9.09091%; - list-style: none; } - .small-block-grid-11 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-11 > li:nth-of-type(11n+1) { - clear: both; } - - .small-block-grid-12 > li { - width: 8.33333%; - list-style: none; } - .small-block-grid-12 > li:nth-of-type(1n) { - clear: none; } - .small-block-grid-12 > li:nth-of-type(12n+1) { - clear: both; } } -@media only screen and (min-width: 40.063em) { - .medium-block-grid-1 > li { - width: 100%; - list-style: none; } - .medium-block-grid-1 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-1 > li:nth-of-type(1n+1) { - clear: both; } - - .medium-block-grid-2 > li { - width: 50%; - list-style: none; } - .medium-block-grid-2 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-2 > li:nth-of-type(2n+1) { - clear: both; } - - .medium-block-grid-3 > li { - width: 33.33333%; - list-style: none; } - .medium-block-grid-3 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-3 > li:nth-of-type(3n+1) { - clear: both; } - - .medium-block-grid-4 > li { - width: 25%; - list-style: none; } - .medium-block-grid-4 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-4 > li:nth-of-type(4n+1) { - clear: both; } - - .medium-block-grid-5 > li { - width: 20%; - list-style: none; } - .medium-block-grid-5 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-5 > li:nth-of-type(5n+1) { - clear: both; } - - .medium-block-grid-6 > li { - width: 16.66667%; - list-style: none; } - .medium-block-grid-6 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-6 > li:nth-of-type(6n+1) { - clear: both; } - - .medium-block-grid-7 > li { - width: 14.28571%; - list-style: none; } - .medium-block-grid-7 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-7 > li:nth-of-type(7n+1) { - clear: both; } - - .medium-block-grid-8 > li { - width: 12.5%; - list-style: none; } - .medium-block-grid-8 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-8 > li:nth-of-type(8n+1) { - clear: both; } - - .medium-block-grid-9 > li { - width: 11.11111%; - list-style: none; } - .medium-block-grid-9 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-9 > li:nth-of-type(9n+1) { - clear: both; } - - .medium-block-grid-10 > li { - width: 10%; - list-style: none; } - .medium-block-grid-10 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-10 > li:nth-of-type(10n+1) { - clear: both; } - - .medium-block-grid-11 > li { - width: 9.09091%; - list-style: none; } - .medium-block-grid-11 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-11 > li:nth-of-type(11n+1) { - clear: both; } - - .medium-block-grid-12 > li { - width: 8.33333%; - list-style: none; } - .medium-block-grid-12 > li:nth-of-type(1n) { - clear: none; } - .medium-block-grid-12 > li:nth-of-type(12n+1) { - clear: both; } } -@media only screen and (min-width: 64.063em) { - .large-block-grid-1 > li { - width: 100%; - list-style: none; } - .large-block-grid-1 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-1 > li:nth-of-type(1n+1) { - clear: both; } - - .large-block-grid-2 > li { - width: 50%; - list-style: none; } - .large-block-grid-2 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-2 > li:nth-of-type(2n+1) { - clear: both; } - - .large-block-grid-3 > li { - width: 33.33333%; - list-style: none; } - .large-block-grid-3 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-3 > li:nth-of-type(3n+1) { - clear: both; } - - .large-block-grid-4 > li { - width: 25%; - list-style: none; } - .large-block-grid-4 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-4 > li:nth-of-type(4n+1) { - clear: both; } - - .large-block-grid-5 > li { - width: 20%; - list-style: none; } - .large-block-grid-5 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-5 > li:nth-of-type(5n+1) { - clear: both; } - - .large-block-grid-6 > li { - width: 16.66667%; - list-style: none; } - .large-block-grid-6 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-6 > li:nth-of-type(6n+1) { - clear: both; } - - .large-block-grid-7 > li { - width: 14.28571%; - list-style: none; } - .large-block-grid-7 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-7 > li:nth-of-type(7n+1) { - clear: both; } - - .large-block-grid-8 > li { - width: 12.5%; - list-style: none; } - .large-block-grid-8 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-8 > li:nth-of-type(8n+1) { - clear: both; } - - .large-block-grid-9 > li { - width: 11.11111%; - list-style: none; } - .large-block-grid-9 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-9 > li:nth-of-type(9n+1) { - clear: both; } - - .large-block-grid-10 > li { - width: 10%; - list-style: none; } - .large-block-grid-10 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-10 > li:nth-of-type(10n+1) { - clear: both; } - - .large-block-grid-11 > li { - width: 9.09091%; - list-style: none; } - .large-block-grid-11 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-11 > li:nth-of-type(11n+1) { - clear: both; } - - .large-block-grid-12 > li { - width: 8.33333%; - list-style: none; } - .large-block-grid-12 > li:nth-of-type(1n) { - clear: none; } - .large-block-grid-12 > li:nth-of-type(12n+1) { - clear: both; } } -/* small displays */ -@media only screen { - .show-for-small-only, .show-for-small-up, .show-for-small, .show-for-small-down, .hide-for-medium-only, .hide-for-medium-up, .hide-for-medium, .show-for-medium-down, .hide-for-large-only, .hide-for-large-up, .hide-for-large, .show-for-large-down, .hide-for-xlarge-only, .hide-for-xlarge-up, .hide-for-xlarge, .show-for-xlarge-down, .hide-for-xxlarge-only, .hide-for-xxlarge-up, .hide-for-xxlarge, .show-for-xxlarge-down { - display: inherit !important; } - - .hide-for-small-only, .hide-for-small-up, .hide-for-small, .hide-for-small-down, .show-for-medium-only, .show-for-medium-up, .show-for-medium, .hide-for-medium-down, .show-for-large-only, .show-for-large-up, .show-for-large, .hide-for-large-down, .show-for-xlarge-only, .show-for-xlarge-up, .show-for-xlarge, .hide-for-xlarge-down, .show-for-xxlarge-only, .show-for-xxlarge-up, .show-for-xxlarge, .hide-for-xxlarge-down { - display: none !important; } - - .visible-for-small-only, .visible-for-small-up, .visible-for-small, .visible-for-small-down, .hidden-for-medium-only, .hidden-for-medium-up, .hidden-for-medium, .visible-for-medium-down, .hidden-for-large-only, .hidden-for-large-up, .hidden-for-large, .visible-for-large-down, .hidden-for-xlarge-only, .hidden-for-xlarge-up, .hidden-for-xlarge, .visible-for-xlarge-down, .hidden-for-xxlarge-only, .hidden-for-xxlarge-up, .hidden-for-xxlarge, .visible-for-xxlarge-down { - position: static !important; - height: auto; - width: auto; - overflow: visible; - clip: auto; } - - .hidden-for-small-only, .hidden-for-small-up, .hidden-for-small, .hidden-for-small-down, .visible-for-medium-only, .visible-for-medium-up, .visible-for-medium, .hidden-for-medium-down, .visible-for-large-only, .visible-for-large-up, .visible-for-large, .hidden-for-large-down, .visible-for-xlarge-only, .visible-for-xlarge-up, .visible-for-xlarge, .hidden-for-xlarge-down, .visible-for-xxlarge-only, .visible-for-xxlarge-up, .visible-for-xxlarge, .hidden-for-xxlarge-down { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); } - - table.show-for-small-only, table.show-for-small-up, table.show-for-small, table.show-for-small-down, table.hide-for-medium-only, table.hide-for-medium-up, table.hide-for-medium, table.show-for-medium-down, table.hide-for-large-only, table.hide-for-large-up, table.hide-for-large, table.show-for-large-down, table.hide-for-xlarge-only, table.hide-for-xlarge-up, table.hide-for-xlarge, table.show-for-xlarge-down, table.hide-for-xxlarge-only, table.hide-for-xxlarge-up, table.hide-for-xxlarge, table.show-for-xxlarge-down { - display: table !important; } - - thead.show-for-small-only, thead.show-for-small-up, thead.show-for-small, thead.show-for-small-down, thead.hide-for-medium-only, thead.hide-for-medium-up, thead.hide-for-medium, thead.show-for-medium-down, thead.hide-for-large-only, thead.hide-for-large-up, thead.hide-for-large, thead.show-for-large-down, thead.hide-for-xlarge-only, thead.hide-for-xlarge-up, thead.hide-for-xlarge, thead.show-for-xlarge-down, thead.hide-for-xxlarge-only, thead.hide-for-xxlarge-up, thead.hide-for-xxlarge, thead.show-for-xxlarge-down { - display: table-header-group !important; } - - tbody.show-for-small-only, tbody.show-for-small-up, tbody.show-for-small, tbody.show-for-small-down, tbody.hide-for-medium-only, tbody.hide-for-medium-up, tbody.hide-for-medium, tbody.show-for-medium-down, tbody.hide-for-large-only, tbody.hide-for-large-up, tbody.hide-for-large, tbody.show-for-large-down, tbody.hide-for-xlarge-only, tbody.hide-for-xlarge-up, tbody.hide-for-xlarge, tbody.show-for-xlarge-down, tbody.hide-for-xxlarge-only, tbody.hide-for-xxlarge-up, tbody.hide-for-xxlarge, tbody.show-for-xxlarge-down { - display: table-row-group !important; } - - tr.show-for-small-only, tr.show-for-small-up, tr.show-for-small, tr.show-for-small-down, tr.hide-for-medium-only, tr.hide-for-medium-up, tr.hide-for-medium, tr.show-for-medium-down, tr.hide-for-large-only, tr.hide-for-large-up, tr.hide-for-large, tr.show-for-large-down, tr.hide-for-xlarge-only, tr.hide-for-xlarge-up, tr.hide-for-xlarge, tr.show-for-xlarge-down, tr.hide-for-xxlarge-only, tr.hide-for-xxlarge-up, tr.hide-for-xxlarge, tr.show-for-xxlarge-down { - display: table-row !important; } - - th.show-for-small-only, td.show-for-small-only, th.show-for-small-up, td.show-for-small-up, th.show-for-small, td.show-for-small, th.show-for-small-down, td.show-for-small-down, th.hide-for-medium-only, td.hide-for-medium-only, th.hide-for-medium-up, td.hide-for-medium-up, th.hide-for-medium, td.hide-for-medium, th.show-for-medium-down, td.show-for-medium-down, th.hide-for-large-only, td.hide-for-large-only, th.hide-for-large-up, td.hide-for-large-up, th.hide-for-large, td.hide-for-large, th.show-for-large-down, td.show-for-large-down, th.hide-for-xlarge-only, td.hide-for-xlarge-only, th.hide-for-xlarge-up, td.hide-for-xlarge-up, th.hide-for-xlarge, td.hide-for-xlarge, th.show-for-xlarge-down, td.show-for-xlarge-down, th.hide-for-xxlarge-only, td.hide-for-xxlarge-only, th.hide-for-xxlarge-up, td.hide-for-xxlarge-up, th.hide-for-xxlarge, td.hide-for-xxlarge, th.show-for-xxlarge-down, td.show-for-xxlarge-down { - display: table-cell !important; } } -/* medium displays */ -@media only screen and (min-width: 40.063em) { - .hide-for-small-only, .show-for-small-up, .hide-for-small, .hide-for-small-down, .show-for-medium-only, .show-for-medium-up, .show-for-medium, .show-for-medium-down, .hide-for-large-only, .hide-for-large-up, .hide-for-large, .show-for-large-down, .hide-for-xlarge-only, .hide-for-xlarge-up, .hide-for-xlarge, .show-for-xlarge-down, .hide-for-xxlarge-only, .hide-for-xxlarge-up, .hide-for-xxlarge, .show-for-xxlarge-down { - display: inherit !important; } - - .show-for-small-only, .hide-for-small-up, .show-for-small, .show-for-small-down, .hide-for-medium-only, .hide-for-medium-up, .hide-for-medium, .hide-for-medium-down, .show-for-large-only, .show-for-large-up, .show-for-large, .hide-for-large-down, .show-for-xlarge-only, .show-for-xlarge-up, .show-for-xlarge, .hide-for-xlarge-down, .show-for-xxlarge-only, .show-for-xxlarge-up, .show-for-xxlarge, .hide-for-xxlarge-down { - display: none !important; } - - .hidden-for-small-only, .visible-for-small-up, .hidden-for-small, .hidden-for-small-down, .visible-for-medium-only, .visible-for-medium-up, .visible-for-medium, .visible-for-medium-down, .hidden-for-large-only, .hidden-for-large-up, .hidden-for-large, .visible-for-large-down, .hidden-for-xlarge-only, .hidden-for-xlarge-up, .hidden-for-xlarge, .visible-for-xlarge-down, .hidden-for-xxlarge-only, .hidden-for-xxlarge-up, .hidden-for-xxlarge, .visible-for-xxlarge-down { - position: static !important; - height: auto; - width: auto; - overflow: visible; - clip: auto; } - - .visible-for-small-only, .hidden-for-small-up, .visible-for-small, .visible-for-small-down, .hidden-for-medium-only, .hidden-for-medium-up, .hidden-for-medium, .hidden-for-medium-down, .visible-for-large-only, .visible-for-large-up, .visible-for-large, .hidden-for-large-down, .visible-for-xlarge-only, .visible-for-xlarge-up, .visible-for-xlarge, .hidden-for-xlarge-down, .visible-for-xxlarge-only, .visible-for-xxlarge-up, .visible-for-xxlarge, .hidden-for-xxlarge-down { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); } - - table.hide-for-small-only, table.show-for-small-up, table.hide-for-small, table.hide-for-small-down, table.show-for-medium-only, table.show-for-medium-up, table.show-for-medium, table.show-for-medium-down, table.hide-for-large-only, table.hide-for-large-up, table.hide-for-large, table.show-for-large-down, table.hide-for-xlarge-only, table.hide-for-xlarge-up, table.hide-for-xlarge, table.show-for-xlarge-down, table.hide-for-xxlarge-only, table.hide-for-xxlarge-up, table.hide-for-xxlarge, table.show-for-xxlarge-down { - display: table !important; } - - thead.hide-for-small-only, thead.show-for-small-up, thead.hide-for-small, thead.hide-for-small-down, thead.show-for-medium-only, thead.show-for-medium-up, thead.show-for-medium, thead.show-for-medium-down, thead.hide-for-large-only, thead.hide-for-large-up, thead.hide-for-large, thead.show-for-large-down, thead.hide-for-xlarge-only, thead.hide-for-xlarge-up, thead.hide-for-xlarge, thead.show-for-xlarge-down, thead.hide-for-xxlarge-only, thead.hide-for-xxlarge-up, thead.hide-for-xxlarge, thead.show-for-xxlarge-down { - display: table-header-group !important; } - - tbody.hide-for-small-only, tbody.show-for-small-up, tbody.hide-for-small, tbody.hide-for-small-down, tbody.show-for-medium-only, tbody.show-for-medium-up, tbody.show-for-medium, tbody.show-for-medium-down, tbody.hide-for-large-only, tbody.hide-for-large-up, tbody.hide-for-large, tbody.show-for-large-down, tbody.hide-for-xlarge-only, tbody.hide-for-xlarge-up, tbody.hide-for-xlarge, tbody.show-for-xlarge-down, tbody.hide-for-xxlarge-only, tbody.hide-for-xxlarge-up, tbody.hide-for-xxlarge, tbody.show-for-xxlarge-down { - display: table-row-group !important; } - - tr.hide-for-small-only, tr.show-for-small-up, tr.hide-for-small, tr.hide-for-small-down, tr.show-for-medium-only, tr.show-for-medium-up, tr.show-for-medium, tr.show-for-medium-down, tr.hide-for-large-only, tr.hide-for-large-up, tr.hide-for-large, tr.show-for-large-down, tr.hide-for-xlarge-only, tr.hide-for-xlarge-up, tr.hide-for-xlarge, tr.show-for-xlarge-down, tr.hide-for-xxlarge-only, tr.hide-for-xxlarge-up, tr.hide-for-xxlarge, tr.show-for-xxlarge-down { - display: table-row !important; } - - th.hide-for-small-only, td.hide-for-small-only, th.show-for-small-up, td.show-for-small-up, th.hide-for-small, td.hide-for-small, th.hide-for-small-down, td.hide-for-small-down, th.show-for-medium-only, td.show-for-medium-only, th.show-for-medium-up, td.show-for-medium-up, th.show-for-medium, td.show-for-medium, th.show-for-medium-down, td.show-for-medium-down, th.hide-for-large-only, td.hide-for-large-only, th.hide-for-large-up, td.hide-for-large-up, th.hide-for-large, td.hide-for-large, th.show-for-large-down, td.show-for-large-down, th.hide-for-xlarge-only, td.hide-for-xlarge-only, th.hide-for-xlarge-up, td.hide-for-xlarge-up, th.hide-for-xlarge, td.hide-for-xlarge, th.show-for-xlarge-down, td.show-for-xlarge-down, th.hide-for-xxlarge-only, td.hide-for-xxlarge-only, th.hide-for-xxlarge-up, td.hide-for-xxlarge-up, th.hide-for-xxlarge, td.hide-for-xxlarge, th.show-for-xxlarge-down, td.show-for-xxlarge-down { - display: table-cell !important; } } -/* large displays */ -@media only screen and (min-width: 64.063em) { - .hide-for-small-only, .show-for-small-up, .hide-for-small, .hide-for-small-down, .hide-for-medium-only, .show-for-medium-up, .hide-for-medium, .hide-for-medium-down, .show-for-large-only, .show-for-large-up, .show-for-large, .show-for-large-down, .hide-for-xlarge-only, .hide-for-xlarge-up, .hide-for-xlarge, .show-for-xlarge-down, .hide-for-xxlarge-only, .hide-for-xxlarge-up, .hide-for-xxlarge, .show-for-xxlarge-down { - display: inherit !important; } - - .show-for-small-only, .hide-for-small-up, .show-for-small, .show-for-small-down, .show-for-medium-only, .hide-for-medium-up, .show-for-medium, .show-for-medium-down, .hide-for-large-only, .hide-for-large-up, .hide-for-large, .hide-for-large-down, .show-for-xlarge-only, .show-for-xlarge-up, .show-for-xlarge, .hide-for-xlarge-down, .show-for-xxlarge-only, .show-for-xxlarge-up, .show-for-xxlarge, .hide-for-xxlarge-down { - display: none !important; } - - .hidden-for-small-only, .visible-for-small-up, .hidden-for-small, .hidden-for-small-down, .hidden-for-medium-only, .visible-for-medium-up, .hidden-for-medium, .hidden-for-medium-down, .visible-for-large-only, .visible-for-large-up, .visible-for-large, .visible-for-large-down, .hidden-for-xlarge-only, .hidden-for-xlarge-up, .hidden-for-xlarge, .visible-for-xlarge-down, .hidden-for-xxlarge-only, .hidden-for-xxlarge-up, .hidden-for-xxlarge, .visible-for-xxlarge-down { - position: static !important; - height: auto; - width: auto; - overflow: visible; - clip: auto; } - - .visible-for-small-only, .hidden-for-small-up, .visible-for-small, .visible-for-small-down, .visible-for-medium-only, .hidden-for-medium-up, .visible-for-medium, .visible-for-medium-down, .hidden-for-large-only, .hidden-for-large-up, .hidden-for-large, .hidden-for-large-down, .visible-for-xlarge-only, .visible-for-xlarge-up, .visible-for-xlarge, .hidden-for-xlarge-down, .visible-for-xxlarge-only, .visible-for-xxlarge-up, .visible-for-xxlarge, .hidden-for-xxlarge-down { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); } - - table.hide-for-small-only, table.show-for-small-up, table.hide-for-small, table.hide-for-small-down, table.hide-for-medium-only, table.show-for-medium-up, table.hide-for-medium, table.hide-for-medium-down, table.show-for-large-only, table.show-for-large-up, table.show-for-large, table.show-for-large-down, table.hide-for-xlarge-only, table.hide-for-xlarge-up, table.hide-for-xlarge, table.show-for-xlarge-down, table.hide-for-xxlarge-only, table.hide-for-xxlarge-up, table.hide-for-xxlarge, table.show-for-xxlarge-down { - display: table !important; } - - thead.hide-for-small-only, thead.show-for-small-up, thead.hide-for-small, thead.hide-for-small-down, thead.hide-for-medium-only, thead.show-for-medium-up, thead.hide-for-medium, thead.hide-for-medium-down, thead.show-for-large-only, thead.show-for-large-up, thead.show-for-large, thead.show-for-large-down, thead.hide-for-xlarge-only, thead.hide-for-xlarge-up, thead.hide-for-xlarge, thead.show-for-xlarge-down, thead.hide-for-xxlarge-only, thead.hide-for-xxlarge-up, thead.hide-for-xxlarge, thead.show-for-xxlarge-down { - display: table-header-group !important; } - - tbody.hide-for-small-only, tbody.show-for-small-up, tbody.hide-for-small, tbody.hide-for-small-down, tbody.hide-for-medium-only, tbody.show-for-medium-up, tbody.hide-for-medium, tbody.hide-for-medium-down, tbody.show-for-large-only, tbody.show-for-large-up, tbody.show-for-large, tbody.show-for-large-down, tbody.hide-for-xlarge-only, tbody.hide-for-xlarge-up, tbody.hide-for-xlarge, tbody.show-for-xlarge-down, tbody.hide-for-xxlarge-only, tbody.hide-for-xxlarge-up, tbody.hide-for-xxlarge, tbody.show-for-xxlarge-down { - display: table-row-group !important; } - - tr.hide-for-small-only, tr.show-for-small-up, tr.hide-for-small, tr.hide-for-small-down, tr.hide-for-medium-only, tr.show-for-medium-up, tr.hide-for-medium, tr.hide-for-medium-down, tr.show-for-large-only, tr.show-for-large-up, tr.show-for-large, tr.show-for-large-down, tr.hide-for-xlarge-only, tr.hide-for-xlarge-up, tr.hide-for-xlarge, tr.show-for-xlarge-down, tr.hide-for-xxlarge-only, tr.hide-for-xxlarge-up, tr.hide-for-xxlarge, tr.show-for-xxlarge-down { - display: table-row !important; } - - th.hide-for-small-only, td.hide-for-small-only, th.show-for-small-up, td.show-for-small-up, th.hide-for-small, td.hide-for-small, th.hide-for-small-down, td.hide-for-small-down, th.hide-for-medium-only, td.hide-for-medium-only, th.show-for-medium-up, td.show-for-medium-up, th.hide-for-medium, td.hide-for-medium, th.hide-for-medium-down, td.hide-for-medium-down, th.show-for-large-only, td.show-for-large-only, th.show-for-large-up, td.show-for-large-up, th.show-for-large, td.show-for-large, th.show-for-large-down, td.show-for-large-down, th.hide-for-xlarge-only, td.hide-for-xlarge-only, th.hide-for-xlarge-up, td.hide-for-xlarge-up, th.hide-for-xlarge, td.hide-for-xlarge, th.show-for-xlarge-down, td.show-for-xlarge-down, th.hide-for-xxlarge-only, td.hide-for-xxlarge-only, th.hide-for-xxlarge-up, td.hide-for-xxlarge-up, th.hide-for-xxlarge, td.hide-for-xxlarge, th.show-for-xxlarge-down, td.show-for-xxlarge-down { - display: table-cell !important; } } -/* xlarge displays */ -@media only screen and (min-width: 90.063em) { - .hide-for-small-only, .show-for-small-up, .hide-for-small, .hide-for-small-down, .hide-for-medium-only, .show-for-medium-up, .hide-for-medium, .hide-for-medium-down, .hide-for-large-only, .show-for-large-up, .hide-for-large, .hide-for-large-down, .show-for-xlarge-only, .show-for-xlarge-up, .show-for-xlarge, .show-for-xlarge-down, .hide-for-xxlarge-only, .hide-for-xxlarge-up, .hide-for-xxlarge, .show-for-xxlarge-down { - display: inherit !important; } - - .show-for-small-only, .hide-for-small-up, .show-for-small, .show-for-small-down, .show-for-medium-only, .hide-for-medium-up, .show-for-medium, .show-for-medium-down, .show-for-large-only, .hide-for-large-up, .show-for-large, .show-for-large-down, .hide-for-xlarge-only, .hide-for-xlarge-up, .hide-for-xlarge, .hide-for-xlarge-down, .show-for-xxlarge-only, .show-for-xxlarge-up, .show-for-xxlarge, .hide-for-xxlarge-down { - display: none !important; } - - .hidden-for-small-only, .visible-for-small-up, .hidden-for-small, .hidden-for-small-down, .hidden-for-medium-only, .visible-for-medium-up, .hidden-for-medium, .hidden-for-medium-down, .hidden-for-large-only, .visible-for-large-up, .hidden-for-large, .hidden-for-large-down, .visible-for-xlarge-only, .visible-for-xlarge-up, .visible-for-xlarge, .visible-for-xlarge-down, .hidden-for-xxlarge-only, .hidden-for-xxlarge-up, .hidden-for-xxlarge, .visible-for-xxlarge-down { - position: static !important; - height: auto; - width: auto; - overflow: visible; - clip: auto; } - - .visible-for-small-only, .hidden-for-small-up, .visible-for-small, .visible-for-small-down, .visible-for-medium-only, .hidden-for-medium-up, .visible-for-medium, .visible-for-medium-down, .visible-for-large-only, .hidden-for-large-up, .visible-for-large, .visible-for-large-down, .hidden-for-xlarge-only, .hidden-for-xlarge-up, .hidden-for-xlarge, .hidden-for-xlarge-down, .visible-for-xxlarge-only, .visible-for-xxlarge-up, .visible-for-xxlarge, .hidden-for-xxlarge-down { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); } - - table.hide-for-small-only, table.show-for-small-up, table.hide-for-small, table.hide-for-small-down, table.hide-for-medium-only, table.show-for-medium-up, table.hide-for-medium, table.hide-for-medium-down, table.hide-for-large-only, table.show-for-large-up, table.hide-for-large, table.hide-for-large-down, table.show-for-xlarge-only, table.show-for-xlarge-up, table.show-for-xlarge, table.show-for-xlarge-down, table.hide-for-xxlarge-only, table.hide-for-xxlarge-up, table.hide-for-xxlarge, table.show-for-xxlarge-down { - display: table !important; } - - thead.hide-for-small-only, thead.show-for-small-up, thead.hide-for-small, thead.hide-for-small-down, thead.hide-for-medium-only, thead.show-for-medium-up, thead.hide-for-medium, thead.hide-for-medium-down, thead.hide-for-large-only, thead.show-for-large-up, thead.hide-for-large, thead.hide-for-large-down, thead.show-for-xlarge-only, thead.show-for-xlarge-up, thead.show-for-xlarge, thead.show-for-xlarge-down, thead.hide-for-xxlarge-only, thead.hide-for-xxlarge-up, thead.hide-for-xxlarge, thead.show-for-xxlarge-down { - display: table-header-group !important; } - - tbody.hide-for-small-only, tbody.show-for-small-up, tbody.hide-for-small, tbody.hide-for-small-down, tbody.hide-for-medium-only, tbody.show-for-medium-up, tbody.hide-for-medium, tbody.hide-for-medium-down, tbody.hide-for-large-only, tbody.show-for-large-up, tbody.hide-for-large, tbody.hide-for-large-down, tbody.show-for-xlarge-only, tbody.show-for-xlarge-up, tbody.show-for-xlarge, tbody.show-for-xlarge-down, tbody.hide-for-xxlarge-only, tbody.hide-for-xxlarge-up, tbody.hide-for-xxlarge, tbody.show-for-xxlarge-down { - display: table-row-group !important; } - - tr.hide-for-small-only, tr.show-for-small-up, tr.hide-for-small, tr.hide-for-small-down, tr.hide-for-medium-only, tr.show-for-medium-up, tr.hide-for-medium, tr.hide-for-medium-down, tr.hide-for-large-only, tr.show-for-large-up, tr.hide-for-large, tr.hide-for-large-down, tr.show-for-xlarge-only, tr.show-for-xlarge-up, tr.show-for-xlarge, tr.show-for-xlarge-down, tr.hide-for-xxlarge-only, tr.hide-for-xxlarge-up, tr.hide-for-xxlarge, tr.show-for-xxlarge-down { - display: table-row !important; } - - th.hide-for-small-only, td.hide-for-small-only, th.show-for-small-up, td.show-for-small-up, th.hide-for-small, td.hide-for-small, th.hide-for-small-down, td.hide-for-small-down, th.hide-for-medium-only, td.hide-for-medium-only, th.show-for-medium-up, td.show-for-medium-up, th.hide-for-medium, td.hide-for-medium, th.hide-for-medium-down, td.hide-for-medium-down, th.hide-for-large-only, td.hide-for-large-only, th.show-for-large-up, td.show-for-large-up, th.hide-for-large, td.hide-for-large, th.hide-for-large-down, td.hide-for-large-down, th.show-for-xlarge-only, td.show-for-xlarge-only, th.show-for-xlarge-up, td.show-for-xlarge-up, th.show-for-xlarge, td.show-for-xlarge, th.show-for-xlarge-down, td.show-for-xlarge-down, th.hide-for-xxlarge-only, td.hide-for-xxlarge-only, th.hide-for-xxlarge-up, td.hide-for-xxlarge-up, th.hide-for-xxlarge, td.hide-for-xxlarge, th.show-for-xxlarge-down, td.show-for-xxlarge-down { - display: table-cell !important; } } -/* xxlarge displays */ -@media only screen and (min-width: 120.063em) { - .hide-for-small-only, .show-for-small-up, .hide-for-small, .hide-for-small-down, .hide-for-medium-only, .show-for-medium-up, .hide-for-medium, .hide-for-medium-down, .hide-for-large-only, .show-for-large-up, .hide-for-large, .hide-for-large-down, .hide-for-xlarge-only, .show-for-xlarge-up, .hide-for-xlarge, .hide-for-xlarge-down, .show-for-xxlarge-only, .show-for-xxlarge-up, .show-for-xxlarge, .show-for-xxlarge-down { - display: inherit !important; } - - .show-for-small-only, .hide-for-small-up, .show-for-small, .show-for-small-down, .show-for-medium-only, .hide-for-medium-up, .show-for-medium, .show-for-medium-down, .show-for-large-only, .hide-for-large-up, .show-for-large, .show-for-large-down, .show-for-xlarge-only, .hide-for-xlarge-up, .show-for-xlarge, .show-for-xlarge-down, .hide-for-xxlarge-only, .hide-for-xxlarge-up, .hide-for-xxlarge, .hide-for-xxlarge-down { - display: none !important; } - - .hidden-for-small-only, .visible-for-small-up, .hidden-for-small, .hidden-for-small-down, .hidden-for-medium-only, .visible-for-medium-up, .hidden-for-medium, .hidden-for-medium-down, .hidden-for-large-only, .visible-for-large-up, .hidden-for-large, .hidden-for-large-down, .hidden-for-xlarge-only, .visible-for-xlarge-up, .hidden-for-xlarge, .hidden-for-xlarge-down, .visible-for-xxlarge-only, .visible-for-xxlarge-up, .visible-for-xxlarge, .visible-for-xxlarge-down { - position: static !important; - height: auto; - width: auto; - overflow: visible; - clip: auto; } - - .visible-for-small-only, .hidden-for-small-up, .visible-for-small, .visible-for-small-down, .visible-for-medium-only, .hidden-for-medium-up, .visible-for-medium, .visible-for-medium-down, .visible-for-large-only, .hidden-for-large-up, .visible-for-large, .visible-for-large-down, .visible-for-xlarge-only, .hidden-for-xlarge-up, .visible-for-xlarge, .visible-for-xlarge-down, .hidden-for-xxlarge-only, .hidden-for-xxlarge-up, .hidden-for-xxlarge, .hidden-for-xxlarge-down { - position: absolute !important; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); } - - table.hide-for-small-only, table.show-for-small-up, table.hide-for-small, table.hide-for-small-down, table.hide-for-medium-only, table.show-for-medium-up, table.hide-for-medium, table.hide-for-medium-down, table.hide-for-large-only, table.show-for-large-up, table.hide-for-large, table.hide-for-large-down, table.hide-for-xlarge-only, table.show-for-xlarge-up, table.hide-for-xlarge, table.hide-for-xlarge-down, table.show-for-xxlarge-only, table.show-for-xxlarge-up, table.show-for-xxlarge, table.show-for-xxlarge-down { - display: table !important; } - - thead.hide-for-small-only, thead.show-for-small-up, thead.hide-for-small, thead.hide-for-small-down, thead.hide-for-medium-only, thead.show-for-medium-up, thead.hide-for-medium, thead.hide-for-medium-down, thead.hide-for-large-only, thead.show-for-large-up, thead.hide-for-large, thead.hide-for-large-down, thead.hide-for-xlarge-only, thead.show-for-xlarge-up, thead.hide-for-xlarge, thead.hide-for-xlarge-down, thead.show-for-xxlarge-only, thead.show-for-xxlarge-up, thead.show-for-xxlarge, thead.show-for-xxlarge-down { - display: table-header-group !important; } - - tbody.hide-for-small-only, tbody.show-for-small-up, tbody.hide-for-small, tbody.hide-for-small-down, tbody.hide-for-medium-only, tbody.show-for-medium-up, tbody.hide-for-medium, tbody.hide-for-medium-down, tbody.hide-for-large-only, tbody.show-for-large-up, tbody.hide-for-large, tbody.hide-for-large-down, tbody.hide-for-xlarge-only, tbody.show-for-xlarge-up, tbody.hide-for-xlarge, tbody.hide-for-xlarge-down, tbody.show-for-xxlarge-only, tbody.show-for-xxlarge-up, tbody.show-for-xxlarge, tbody.show-for-xxlarge-down { - display: table-row-group !important; } - - tr.hide-for-small-only, tr.show-for-small-up, tr.hide-for-small, tr.hide-for-small-down, tr.hide-for-medium-only, tr.show-for-medium-up, tr.hide-for-medium, tr.hide-for-medium-down, tr.hide-for-large-only, tr.show-for-large-up, tr.hide-for-large, tr.hide-for-large-down, tr.hide-for-xlarge-only, tr.show-for-xlarge-up, tr.hide-for-xlarge, tr.hide-for-xlarge-down, tr.show-for-xxlarge-only, tr.show-for-xxlarge-up, tr.show-for-xxlarge, tr.show-for-xxlarge-down { - display: table-row !important; } - - th.hide-for-small-only, td.hide-for-small-only, th.show-for-small-up, td.show-for-small-up, th.hide-for-small, td.hide-for-small, th.hide-for-small-down, td.hide-for-small-down, th.hide-for-medium-only, td.hide-for-medium-only, th.show-for-medium-up, td.show-for-medium-up, th.hide-for-medium, td.hide-for-medium, th.hide-for-medium-down, td.hide-for-medium-down, th.hide-for-large-only, td.hide-for-large-only, th.show-for-large-up, td.show-for-large-up, th.hide-for-large, td.hide-for-large, th.hide-for-large-down, td.hide-for-large-down, th.hide-for-xlarge-only, td.hide-for-xlarge-only, th.show-for-xlarge-up, td.show-for-xlarge-up, th.hide-for-xlarge, td.hide-for-xlarge, th.hide-for-xlarge-down, td.hide-for-xlarge-down, th.show-for-xxlarge-only, td.show-for-xxlarge-only, th.show-for-xxlarge-up, td.show-for-xxlarge-up, th.show-for-xxlarge, td.show-for-xxlarge, th.show-for-xxlarge-down, td.show-for-xxlarge-down { - display: table-cell !important; } } -/* Orientation targeting */ -.show-for-landscape, -.hide-for-portrait { - display: inherit !important; } - -.hide-for-landscape, -.show-for-portrait { - display: none !important; } - -/* Specific visibility for tables */ -table.hide-for-landscape, table.show-for-portrait { - display: table !important; } - -thead.hide-for-landscape, thead.show-for-portrait { - display: table-header-group !important; } - -tbody.hide-for-landscape, tbody.show-for-portrait { - display: table-row-group !important; } - -tr.hide-for-landscape, tr.show-for-portrait { - display: table-row !important; } - -td.hide-for-landscape, td.show-for-portrait, -th.hide-for-landscape, -th.show-for-portrait { - display: table-cell !important; } - -@media only screen and (orientation: landscape) { - .show-for-landscape, - .hide-for-portrait { - display: inherit !important; } - - .hide-for-landscape, - .show-for-portrait { - display: none !important; } - - /* Specific visibility for tables */ - table.show-for-landscape, table.hide-for-portrait { - display: table !important; } - - thead.show-for-landscape, thead.hide-for-portrait { - display: table-header-group !important; } - - tbody.show-for-landscape, tbody.hide-for-portrait { - display: table-row-group !important; } - - tr.show-for-landscape, tr.hide-for-portrait { - display: table-row !important; } - - td.show-for-landscape, td.hide-for-portrait, - th.show-for-landscape, - th.hide-for-portrait { - display: table-cell !important; } } -@media only screen and (orientation: portrait) { - .show-for-portrait, - .hide-for-landscape { - display: inherit !important; } - - .hide-for-portrait, - .show-for-landscape { - display: none !important; } - - /* Specific visibility for tables */ - table.show-for-portrait, table.hide-for-landscape { - display: table !important; } - - thead.show-for-portrait, thead.hide-for-landscape { - display: table-header-group !important; } - - tbody.show-for-portrait, tbody.hide-for-landscape { - display: table-row-group !important; } - - tr.show-for-portrait, tr.hide-for-landscape { - display: table-row !important; } - - td.show-for-portrait, td.hide-for-landscape, - th.show-for-portrait, - th.hide-for-landscape { - display: table-cell !important; } } -/* Touch-enabled device targeting */ -.show-for-touch { - display: none !important; } - -.hide-for-touch { - display: inherit !important; } - -.touch .show-for-touch { - display: inherit !important; } - -.touch .hide-for-touch { - display: none !important; } - -/* Specific visibility for tables */ -table.hide-for-touch { - display: table !important; } - -.touch table.show-for-touch { - display: table !important; } - -thead.hide-for-touch { - display: table-header-group !important; } - -.touch thead.show-for-touch { - display: table-header-group !important; } - -tbody.hide-for-touch { - display: table-row-group !important; } - -.touch tbody.show-for-touch { - display: table-row-group !important; } - -tr.hide-for-touch { - display: table-row !important; } - -.touch tr.show-for-touch { - display: table-row !important; } - -td.hide-for-touch { - display: table-cell !important; } - -.touch td.show-for-touch { - display: table-cell !important; } - -th.hide-for-touch { - display: table-cell !important; } - -.touch th.show-for-touch { - display: table-cell !important; } - -/* Print visibility */ -@media print { - .show-for-print { - display: block; } - - .hide-for-print { - display: none; } - - table.show-for-print { - display: table !important; } - - thead.show-for-print { - display: table-header-group !important; } - - tbody.show-for-print { - display: table-row-group !important; } - - tr.show-for-print { - display: table-row !important; } - - td.show-for-print { - display: table-cell !important; } - - th.show-for-print { - display: table-cell !important; } } diff --git a/web/assets/css/style.css b/web/assets/css/style.css index c1466d5..d99adaa 100644 --- a/web/assets/css/style.css +++ b/web/assets/css/style.css @@ -1,167 +1,1955 @@ +/* ========================================================================== + WPackagist Styles + Design tokens from Figma + custom styles + ========================================================================== */ + +/* -------------------------------------------------------------------------- + CSS Custom Properties (Design Tokens) + -------------------------------------------------------------------------- */ +:root { + /* Colors - Primary (v2 Blue) */ + --color-primary: #006BD6; + --color-primary-hover: #0059B3; + --color-navy: #002447; + + /* Colors - Tints */ + --color-primary-100: #E6F0FB; + --color-primary-200: #D5E6F8; + --color-primary-400: #80B5EB; + --color-gray-25: #FAFBFC; + --color-gray-300: #EEF0F1; + --color-gray-400: #CED5D8; + --color-gray-1000: #435056; + --color-gray-1050: #394247; + + /* Colors - Text */ + --text-primary: #1f2426; + --text-secondary: #5b6c74; + --text-tertiary: #73858c; + --text-disabled: #B6C0C5; + --text-inverted: #ffffff; + + /* Colors - Backgrounds */ + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --bg-code: #001224; + --bg-code-highlight: #002447; + --color-code-highlight: #FFC34E; + + /* Colors - Borders */ + --border-primary: #e2e6e8; + --border-secondary: #eef0f1; + --border-container: rgba(31, 36, 38, 0.1); + --border-dashed: #DDDDDD; + --border-divider: #EEEEEE; + + /* Colors - Status */ + --color-success: #039B5C; + --color-error: #DD1243; + + /* Typography */ + --font-primary: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-heading: "Lora", Georgia, "Times New Roman", serif; + --font-mono: "Roboto Mono", "SF Mono", SFMono-Regular, ui-monospace, Menlo, Monaco, Consolas, monospace; + + /* Font Weights */ + --font-regular: 400; + --font-medium: 500; + --font-semibold: 600; + --font-bold: 700; + + /* Font Sizes */ + --text-xs: 12px; + --text-sm: 13px; + --text-base: 15px; + --text-lg: 18px; + --text-xl: 22px; + --text-2xl: 28px; + --text-3xl: 36px; + --text-4xl: 48px; + + /* Line Heights */ + --leading-tight: 1.25; + --leading-normal: 1.5; + --leading-relaxed: 1.625; + + /* Spacing */ + --spacing-xs: 4px; + --spacing-sm: 8px; + --spacing-md: 12px; + --spacing-lg: 16px; + --spacing-xl: 24px; + --spacing-2xl: 32px; + --spacing-2halfxl: 40px; + --spacing-3xl: 48px; + --spacing-4xl: 64px; + --spacing-5xl: 80px; + + /* Border Radius */ + --radius-xs: 4px; + --radius-sm: 6px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + --radius-full: 9999px; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(31, 36, 38, 0.05); + --shadow-md: 0 2px 4px rgba(31, 36, 38, 0.05); + --shadow-lg: 0 4px 8px rgba(31, 36, 38, 0.1); + + /* Layout */ + --container-max: 1200px; + --container-padding: 80px; + --content-max: 1200px; +} + +/* -------------------------------------------------------------------------- + Reset & Base + -------------------------------------------------------------------------- */ +*, *::before, *::after { + box-sizing: border-box; +} + +html { + font-size: 16px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + body { - border-top: 5px solid #E14C41; + margin: 0; + padding: 0; + font-family: var(--font-primary); + font-size: var(--text-base); + font-weight: var(--font-regular); + line-height: var(--leading-normal); + color: var(--text-primary); + background-color: var(--bg-primary); +} + +h1, h2, h3, h4, h5, h6 { + margin: 0 0 var(--spacing-lg); + font-family: var(--font-heading); + font-weight: var(--font-semibold); + line-height: var(--leading-tight); + color: var(--text-primary); } -h1, h2, h3, h4 { - font-family: 'Noto Sans', sans-serif; - font-weight: bold; +h1 { font-size: var(--text-4xl); } +h2 { font-size: var(--text-3xl); } +h3 { font-size: var(--text-2xl); } +h4 { font-size: var(--text-xl); } +h5 { font-size: var(--text-lg); } +h6 { font-size: var(--text-base); } + +p { + margin: 0 0 var(--spacing-lg); } a { - color: #E14C41; - text-decoration: none; + color: var(--color-primary); + text-decoration: underline; + transition: color 0.15s ease; } a:hover { - color: #E14C41; - text-decoration: underline; + color: var(--color-primary-hover); } -h1 a { - color: inherit; +ul, ol { + margin: 0 0 var(--spacing-lg); + padding-left: var(--spacing-xl); } -h1 a:hover::after { - display: inline-block; - vertical-align: middle; +li { + margin-bottom: var(--spacing-sm); +} + +li::marker { + color: var(--color-primary-400); +} + +.section ul { + list-style: none; + margin-bottom: 0; + padding-bottom: 0; +} + +.section ul li { + position: relative; + padding-left: var(--spacing-lg); + margin-bottom: var(--spacing-md); +} + +.section ul li:last-child { + margin-bottom: 0; +} + +.section ul li:after { content: ''; - background: url(../img/home.svg) no-repeat center / 100%; - width: 35px; - height: 35px; - opacity: 0.5; - margin-left: 0.2em; + height: .4em; + width: .4em; + background: var(--color-primary-400); + display: block; + position: absolute; + transform: rotate(45deg); + top: .7em; + left: 0; +} + +img { + max-width: 100%; + height: auto; +} + +/* -------------------------------------------------------------------------- + Layout + -------------------------------------------------------------------------- */ +.container { + max-width: calc(var(--container-max) + 2 * var(--container-padding)); + margin: 0 auto; + padding: 0 var(--container-padding); +} + +.content { + max-width: var(--content-max); + margin: 0 auto; +} + +/* -------------------------------------------------------------------------- + WP Engine Meta Navigation (from wpengine-meta-nav plugin) + -------------------------------------------------------------------------- */ +.wpe-navs__metanav-container { + --background-color: #E6F0FB; + --metaNavIconColor: #80B5EB; + --metaNavIconColorHover: #002447; + --transitionSettings: 220ms cubic-bezier(0.65, 0.05, 0.36, 1); + + width: 100%; + min-height: 32px; + background-color: var(--background-color); + border-bottom: 1px solid #D5E6F8; + z-index: 99998; +} + +.wpe-navs__metanav__inner { + display: flex; + align-items: stretch; + justify-content: space-between; + max-width: calc(1280px + 2 * var(--container-padding)); + margin: 0 auto; + padding: 0 var(--container-padding); } -input[type="search"]:focus { - box-shadow: none; +.wpe-navs__metanav__nav { + display: flex; + flex-shrink: 0; + align-items: stretch; + justify-content: flex-start; + list-style: none; + margin: 0; + padding: 0; } -ul { - margin-left: 25px; - list-style-type: square; +.wpe-navs__metanav__navitem { + align-items: center; + display: inline-flex; + list-style: none; + margin: 0; + padding: 0; } -ol { - margin-left: 25px; +.wpe-navs__metanav__navitem::before { + display: none; } -blockquote, pre { - border-left: 3px solid #E14C41; - padding: 10px 20px 10px 17px; - margin-bottom: 7px; - background-color: #f2f2f2; +.wpe-navs__metanav__navlink { + display: flex; + align-items: center; + min-height: 32px; + position: relative; + isolation: isolate; + padding: 0 16px; + text-decoration: none; } -pre { - overflow: auto; +.wpe-navs__metanav__navlink::before { + content: ""; + display: block; + position: absolute; + left: 0; + width: 100%; + height: 100%; + background-color: #fff; + opacity: 0; + transition: opacity var(--transitionSettings); + z-index: -1; } -#title, .mission { - margin: 3rem 0; +.wpe-navs__metanav__navlink--active::before, +.wpe-navs__metanav__navlink:hover::before { + opacity: 1; } -.mission { - font-size: 1.125rem; +.wpe-navs__metanav__navlink > svg { + display: block; + position: relative; + pointer-events: none; + stroke: none; + height: 18px; + width: auto; + max-width: unset; + transition: fill var(--transitionSettings); + z-index: 1; } -.highlighter { - font-weight: bold; - background-color: #ffff99; +.wpe-navs__metanav__navlink > svg, +.wpe-navs__metanav__navlink > svg * { + fill: var(--metaNavIconColor); + transition: fill var(--transitionSettings); } -.primary-color { - background-color: #E14C41; - border-color: #ce2d21; +.wpe-navs__metanav__navlink--active > svg, +.wpe-navs__metanav__navlink--active > svg *, +.wpe-navs__metanav__navlink:hover > svg, +.wpe-navs__metanav__navlink:hover > svg * { + fill: var(--metaNavIconColorHover); } -.label:hover, .label:focus { - color: #fff; - background-color: #ce2d21; +.wpe-navs__metanav__promo { + display: flex; + align-items: center; + gap: var(--spacing-lg); + color: var(--text-secondary); + font-size: var(--text-xs); } -button:hover, button:focus, .button:hover, .button:focus { - background-color: #ce2d21; +.wpe-navs__metanav__promo a { + color: var(--color-primary); + font-weight: var(--font-medium); text-decoration: none; } -button[disabled], -.button[disabled], -button[disabled]:focus, -.button[disabled]:focus, -button[disabled]:hover, -.button[disabled]:hover { - background-color: #bbb; - border-color: #000; - color: #fff; +.wpe-navs__metanav__promo a:hover { + text-decoration: underline; } -.search-result__refresh-form { - margin: 0; +.wpe-navs__metanav__promo span { + font-weight: 600; } -.search-result__refresh-button { - border-radius: 100%; - line-height: 0.75rem; - margin: 0; - padding: 0.5rem; +@media (max-width: 1200px) { + /* Steps - allow content to wrap */ + .steps__item { + display: flex; + flex-wrap: wrap; + align-items: baseline; + } + + .steps__item::before { + flex-shrink: 0; + } + + /* Allow inline code to wrap */ + code { + white-space: normal; + word-break: break-word; + } +} + +@media (max-width: 1175px) { + .wpe-navs__metanav__promo { + display: none; + } } -.no-results { +@media (max-width: 1024px) { + .wpe-navs__metanav__nav { + display: none; + } +} + +/* -------------------------------------------------------------------------- + Hero Section + -------------------------------------------------------------------------- */ +.hero { + padding: var(--spacing-3xl) 0; text-align: center; - font-weight: bold; - padding: 2em; + position: relative; + overflow: hidden; +} + +.hero__card { + background: var(--color-gray-25); + padding: var(--spacing-2xl); + max-width: 1200px; + margin: 0 auto; + position: relative; + z-index: 1; +} + +/* Extending dashed border lines */ +.dashed_border { + position: relative; + max-width: inherit; +} +.dashed_border::before, +.dashed_border::after { + content: ""; + position: absolute; + border: 1px dashed var(--border-dashed); + pointer-events: none; +} + +/* Horizontal lines (extend left and right) */ +.dashed_border::before { + top: 0; + bottom: 0; + left: -40px; + right: -40px; + border-left: none; + border-right: none; +} + +/* Vertical lines (extend top and bottom) */ +.dashed_border::after { + left: 0; + right: 0; + top: -40px; + bottom: -40px; + border-top: none; + border-bottom: none; +} + +/* Bottom dashed divider with background image */ +.bottom--dashed { + position: relative; + margin-bottom: calc(64px + var(--spacing-xl)); +} + +/* Last bottom-dashed needs extra margin before footer */ +.bottom--dashed:last-child { + margin-bottom: calc(64px + var(--spacing-3xl) + var(--spacing-2halfxl)); +} + +/* Remove bottom border from dashed_border when bottom--dashed is used */ +.dashed_border.bottom--dashed::before { + bottom: 64px; + border-bottom: 0; +} + +.dashed_border.bottom--dashed:not(:first-child)::before { + border-top: 0; +} + +/* Extend vertical lines through the divider area - only for last one */ +.dashed_border.bottom--dashed:last-child::after { + bottom: calc(-1 * var(--spacing-2halfxl) - 64px); +} + +/* First bottom-dashed extends through divider with small overhang */ +.dashed_border.bottom--dashed:first-child::after { + bottom: -44px; +} + +/* When combined with dashed_border, use .content for the divider pseudo-element */ +.dashed_border.bottom--dashed > .content::after { + content: ""; + position: absolute; + bottom: calc(-1 * var(--spacing-2halfxl)); + left: 0; + right: 0; + height: 64px; + background: url('../img/divider-bg.svg') no-repeat center center; + background-size: cover; + border: 1px dashed var(--border-dashed); + pointer-events: none; +} + +/* Extending horizontal lines beyond the divider */ +.dashed_border.bottom--dashed > .content::before { + content: ""; + position: absolute; + bottom: calc(-1 * var(--spacing-2halfxl)); + left: -40px; + right: -40px; + height: 64px; + border-top: 1px dashed var(--border-dashed); + border-bottom: 1px dashed var(--border-dashed); + pointer-events: none; + z-index: -1; +} + +/* Ensure .content is positioned for pseudo-elements */ +.dashed_border.bottom--dashed > .content { + position: relative; } -.version { - margin: .5em; +/* Only remove top padding from first section in subsequent dashed blocks (not the first one) */ +.dashed_border.bottom--dashed + .dashed_border.bottom--dashed .section:first-child { + padding-top: 0; } -.twitter-follow-button { - margin-top: -3px; +.dashed_border.bottom--dashed .section:last-child { + padding-bottom: var(--spacing-4xl); +} +.hero__content { + background: var(--bg-primary) url('../img/hero-bg.svg') repeat-x top left; + background-size: contain; + min-width: 880px; + padding: var(--spacing-xl) var(--spacing-3xl); + border: 1px solid var(--border-secondary); + position: initial; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +/* Hero min-height only on large screens */ +@media (min-width: 1280px) { + .hero__content { + min-height: 585px; + } } -@media only screen and (max-width: 767px) { - #title { - margin: 30px 0; +/* Smaller screens - 24px padding on content blocks */ +@media (max-width: 879px) { + .hero__content { + min-width: auto; } + + .content { + padding-left: 24px; + padding-right: 24px; + } +} + +.hero__logo { + width: 72px; + height: 72px; + margin: 0 auto var(--spacing-lg); +} + +.hero__title { + font-family: var(--font-primary); + font-size: 56px; + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-sm); + color: var(--color-navy); +} + +.hero__tagline { + font-size: var(--text-base); + color: var(--color-navy); + margin-bottom: var(--spacing-xl); + margin-left: auto; + margin-right: auto; +} + +.hero__tagline a { + color: var(--color-primary); +} + +.disclaimer-link { + text-decoration: none; +} + +/* -------------------------------------------------------------------------- + Search Bar + -------------------------------------------------------------------------- */ +.search-bar { + display: flex; + align-items: center; + width: 100%; + max-width: 816px; + height: 64px; + margin: 0 auto; + background: var(--color-primary-100); + border: 1px solid var(--color-primary-200); + border-radius: var(--radius-full); + overflow: hidden; + padding: var(--spacing-sm); +} + +.search-bar--compact { + max-width: 100%; + margin: 0; +} + +.search-bar__icon { + display: flex; + align-items: center; + height: 48px; + padding: 0 var(--spacing-lg); + background: var(--bg-primary); + border-radius: var(--radius-full) 0 0 var(--radius-full); + color: var(--text-tertiary); + border: 1px solid rgba(0, 0, 0, 0.12); + border-right: none; } +.search-bar__icon svg { + width: 18px; + height: 18px; + display: block; +} + +.search-bar__input { + flex: 1; + height: 48px; + border: none; + border-top: 1px solid rgba(0, 0, 0, 0.12); + border-bottom: 1px solid rgba(0, 0, 0, 0.12); + padding: 0; + font-size: var(--text-sm); + font-family: var(--font-primary); + color: var(--text-primary); + background: var(--bg-primary); + outline: none; +} + +.search-bar__input::placeholder { + color: var(--text-tertiary); +} + +.search-bar__dropdown { + display: flex; + align-items: center; + gap: var(--spacing-sm); + height: 48px; + min-width: 152px; + padding: 0 var(--spacing-3xl) 0 var(--spacing-lg); + margin-right: var(--spacing-sm); + background: var(--bg-secondary); + color: var(--color-gray-1000); + font-size: var(--text-sm); + font-family: var(--font-primary); + cursor: pointer; + border: 1px solid rgba(0, 0, 0, 0.12); + border-radius: 0 var(--radius-full) var(--radius-full) 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23435056' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right var(--spacing-lg) center; +} + +.search-bar__dropdown:hover { + background-color: var(--border-secondary); + color: var(--text-primary); +} + +.search-bar__button { + height: 48px; + min-width: 136px; + padding: 0 var(--spacing-2xl); + background: var(--color-primary); + color: var(--text-inverted); + font-size: var(--text-sm); + font-weight: var(--font-regular); + font-family: var(--font-primary); + border: none; + border-radius: var(--radius-full); + cursor: pointer; + transition: background 0.15s ease; +} + +.search-bar__button:hover { + background: var(--color-primary-hover); +} + +/* -------------------------------------------------------------------------- + Search Header (for search results page) + -------------------------------------------------------------------------- */ +.search-header { + padding: 40px 0; + position: relative; +} + +.search-header__card { + max-width: var(--container-max); + margin: 0 auto; + position: relative; +} + + + +.search-header__inner { + display: flex; + align-items: center; + gap: var(--spacing-xl); + background: + linear-gradient(180deg, rgba(250, 250, 250, 0) 0%, rgba(250, 250, 250, 1) 100%), + url('../img/hero-bg.svg') repeat-x top left, + #FAFAFA; + background-size: auto; + min-height: 144px; + padding: var(--spacing-xl) 40px; + border: 1px solid var(--border-secondary); +} + +.search-header__logo { + width: 64px; + height: 64px; + flex-shrink: 0; +} + +.search-header__logo img { + width: 100%; + height: 100%; +} + +.search-header__form { + flex: 1; +} + +.search-header__form .search-bar { + height: 64px; +} + +.search-header__form .search-bar__icon, +.search-header__form .search-bar__input, +.search-header__form .search-bar__dropdown, +.search-header__form .search-bar__button { + height: 48px; +} + +.search-header__form .search-bar__button { + min-width: 100px; +} + +/* -------------------------------------------------------------------------- + Content Sections + -------------------------------------------------------------------------- */ +.section { + padding: var(--spacing-4xl) var(--spacing-5xl); +} + +.section--bordered { + position: relative; + border-top: none; +} + +.section--bordered::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: var(--border-divider); +} + +/* Keep border within container */ +.dashed_border .section--bordered::before { + left: 0; + right: 0; +} + +.section__title { + font-family: var(--font-heading); + font-size: 32px; + font-weight: var(--font-medium); + margin-bottom: var(--spacing-xl); + color: var(--color-navy); +} + +/* -------------------------------------------------------------------------- + Steps List + -------------------------------------------------------------------------- */ +.steps { + list-style: none; + padding: 0; + margin: 0; + counter-reset: step; +} + +.steps__item { + display: flex; + align-items: baseline; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-md); + font-size: var(--text-base); +} + +.steps__item:last-child { + margin-bottom: 0; +} + +.steps__item::before { + counter-increment: step; + content: counter(step) "."; + font-family: var(--font-heading); + font-weight: var(--font-semibold); + color: var(--color-primary); + min-width: 24px; +} + +/* -------------------------------------------------------------------------- + Inline Code + -------------------------------------------------------------------------- */ +code { + font-family: var(--font-mono); + font-size: 0.9em; + background: var(--color-gray-300); + padding: 2px 6px; + border: 1px solid var(--color-gray-400); + border-radius: var(--radius-xs); + color: var(--text-primary); + white-space: nowrap; +} + +code.refresh-icon { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 2px 4px; + vertical-align: middle; + line-height: 1; +} + +code.refresh-icon svg { + display: block; +} + +/* -------------------------------------------------------------------------- + Code Block + -------------------------------------------------------------------------- */ +.code-block { + display: flex; + background: var(--bg-code); + border-radius: var(--radius-lg); + overflow: hidden; + font-family: var(--font-mono); + font-size: var(--text-sm); + line-height: 1.5; + margin-bottom: var(--spacing-xl); +} + +.code-block__lines { + padding: 0 var(--spacing-lg); + background: #001224; + color: var(--text-tertiary); + text-align: right; + user-select: none; + border-right: 1px solid rgba(255, 255, 255, 0.1); +} + +.code-block__content { + flex: 1; + padding: 0 var(--spacing-lg); + color: var(--text-inverted); + overflow-x: auto; +} -.clearfix:after { - content: "."; +.code-block__highlight { display: block; - clear: both; - visibility: hidden; - line-height: 0; - height: 0; + background: var(--bg-code-highlight); + color: var(--color-code-highlight); + margin: 0 calc(-1 * var(--spacing-lg)); + padding: 0 var(--spacing-lg); +} + +/* -------------------------------------------------------------------------- + Blockquote + -------------------------------------------------------------------------- */ +blockquote { + margin: 0 0 var(--spacing-lg); + padding: var(--spacing-xl); + background: var(--color-primary-100); + border: 1px solid var(--color-primary-200); + border-radius: var(--radius-lg); + font-style: normal; } -.clearfix { - display: inline-block; +blockquote p:last-child { + margin-bottom: 0; } -html[xmlns] .clearfix { +blockquote cite { display: block; + margin-top: var(--spacing-sm); + font-size: var(--text-sm); + color: var(--text-secondary); } -* html .clearfix { - height: 1%; +blockquote cite a { + color: var(--color-primary); } -.pagination a { - text-decoration: none; + +/* -------------------------------------------------------------------------- + Results Wrapper + -------------------------------------------------------------------------- */ +.results-wrapper { + padding: var(--spacing-xl) 0; } -table { - border-collapse: collapse; +/* Override dashed_border for results - only show vertical lines */ +.results-wrapper.dashed_border::before { + border-top: none; + border-bottom: none; +} + +/* Limit vertical line extension at bottom of results */ +.results-wrapper.dashed_border::after { + bottom: 0; +} + +/* -------------------------------------------------------------------------- + Search Divider + -------------------------------------------------------------------------- */ +.search-divider { + height: 64px; + margin: 0 0 var(--spacing-3xl); + background: url('../img/divider-bg.svg') no-repeat center center; + background-size: cover; + position: relative; } -table abbr { - font-size: 100%; +/* Extending horizontal lines for search divider */ +.search-divider::before { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: -40px; + right: -40px; + border-top: 1px dashed var(--border-dashed); + border-bottom: 1px dashed var(--border-dashed); + pointer-events: none; + z-index: -1; } -.fork { +/* Extending vertical lines for search divider */ +.search-divider::after { + content: ""; position: absolute; top: 0; + bottom: -40px; + left: 0; right: 0; - border: 0; + border-left: 1px dashed var(--border-dashed); + border-right: 1px dashed var(--border-dashed); + pointer-events: none; + z-index: -1; +} + +/* -------------------------------------------------------------------------- + Results Table + -------------------------------------------------------------------------- */ +.results-table { + width: 100%; + border-collapse: collapse; + font-size: var(--text-sm); +} + +.results-table thead { + position: relative; + background: var(--bg-secondary); +} + +.results-table thead::before, +.results-table thead::after { + content: ""; + position: absolute; + left: -40px; + right: -40px; + height: 1px; + border-top: 1px dashed var(--border-dashed); + pointer-events: none; +} + +.results-table thead::before { + top: 0; +} + +.results-table thead::after { + bottom: 0; +} + +.results-table th { + text-align: left; + padding: var(--spacing-md) var(--spacing-lg); + font-weight: var(--font-medium); + color: var(--text-primary); + white-space: nowrap; +} + +.results-table th a, +.results-table th abbr { + text-decoration: none; + border: none; +} + +.results-table td { + padding: var(--spacing-md) var(--spacing-lg); + vertical-align: middle; + border-bottom: 1px solid var(--color-gray-300); + height: 72px; +} + +.results-table tbody tr:nth-child(odd) { + background: var(--bg-primary); +} + +.results-table tbody tr:nth-child(even) { + background: var(--bg-secondary); +} + +.results-table tbody tr:hover { + background: var(--color-primary-100); +} + +.results-table__name { + color: var(--color-primary); + font-weight: var(--font-medium); +} + +.results-table__type { + font-size: var(--text-sm); + color: var(--text-secondary); +} + +/* Date columns (last committed, last fetched) use same gray as type */ +.results-table td:nth-child(3), +.results-table td:nth-child(4) { + color: var(--text-secondary); +} + +.results-table__expand { + background: none; + border: none; + cursor: pointer; + padding: var(--spacing-xs); + color: var(--text-tertiary); +} + +.results-table__expand:hover { + color: var(--text-primary); +} + +.results-table__expand--disabled, +.results-table__expand:disabled { + color: var(--text-disabled); + cursor: default; +} + +.results-table__expand--disabled:hover, +.results-table__expand:disabled:hover { + color: var(--text-disabled); +} + +/* -------------------------------------------------------------------------- + Version Links (in results table) + -------------------------------------------------------------------------- */ +.results-table .version-pill { + display: inline; + padding: 0; + background: none; + color: var(--color-primary); + border-radius: 0; + font-size: var(--text-sm); + font-weight: var(--font-regular); + text-decoration: underline; + margin-right: var(--spacing-sm); + margin-bottom: 0; +} + +.results-table .version-pill:hover { + background: none; + text-decoration: underline; + color: var(--color-primary-hover); +} + +.results-table .version-pill--dev { + background: none; + color: var(--color-primary); +} + +.results-table .version-pill--more { + color: var(--color-primary); +} + +/* -------------------------------------------------------------------------- + Status Icons + -------------------------------------------------------------------------- */ +.status-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; +} + +.status-icon--active { + color: var(--color-success); +} + +.status-icon--inactive { + color: var(--color-error); +} + +/* -------------------------------------------------------------------------- + Refresh Button + -------------------------------------------------------------------------- */ +.refresh-button { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + background: var(--color-primary); + color: var(--text-inverted); + border: none; + border-radius: 8px; + cursor: pointer; + transition: background 0.15s ease; +} + +.refresh-button svg { + width: 14px; + height: 14px; +} + +.refresh-button:hover { + background: var(--color-primary-hover); +} + +.refresh-button:disabled { + background: var(--text-disabled); + cursor: default; +} + +/* -------------------------------------------------------------------------- + Pagination (Pagerfanta default view) + -------------------------------------------------------------------------- */ +nav.pagination { + display: flex; + align-items: center; + justify-content: flex-start; + gap: var(--spacing-sm); + margin: var(--spacing-xl) 0; + padding-left: var(--spacing-lg); + flex-wrap: wrap; +} + +nav.pagination .pagination__item { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 32px; + height: 32px; + padding: 0 var(--spacing-sm); + background: transparent; + border: none; + border-radius: var(--radius-sm); + color: var(--color-primary); + font-size: var(--text-sm); + font-weight: var(--font-medium); + text-decoration: none; + cursor: pointer; + transition: all 0.15s ease; +} + +nav.pagination a.pagination__item { + text-decoration: underline; +} + +nav.pagination a.pagination__item:hover { + background: var(--color-primary-100); + text-decoration: underline; + color: var(--color-primary); +} + +nav.pagination .pagination__item--current-page { + background: var(--color-primary-100); + color: var(--color-primary); + cursor: default; +} + +nav.pagination .pagination__item--dots { + background: transparent; + color: var(--text-tertiary); + min-width: auto; + padding: 0 var(--spacing-xs); +} + +nav.pagination .pagination__item--disabled { + background: transparent; + color: var(--text-disabled); + cursor: default; +} + +nav.pagination a.pagination__item--previous-page, +nav.pagination a.pagination__item--next-page { + text-decoration: none; +} + +nav.pagination a.pagination__item--previous-page:hover, +nav.pagination a.pagination__item--next-page:hover { + text-decoration: none; +} + +nav.pagination .pagination__item--previous-page::before { + content: "<"; + margin-right: var(--spacing-sm); +} + +nav.pagination .pagination__item--next-page::after { + content: ">"; + margin-left: var(--spacing-sm); +} + +/* -------------------------------------------------------------------------- + Alert/Info Banner + -------------------------------------------------------------------------- */ +.alert { + display: flex; + align-items: flex-start; + gap: var(--spacing-md); + padding: var(--spacing-lg); + border-radius: var(--radius-md); + font-size: var(--text-sm); + margin: var(--spacing-4xl) 0; +} + +.alert--info { + background: var(--color-primary-100); + border: 1px solid var(--color-primary-200); + color: var(--text-primary); +} + +.alert--warning { + background: var(--color-primary-100); + color: var(--text-primary); +} + +.alert__icon { + flex-shrink: 0; + width: 20px; + height: 20px; + color: var(--color-primary-400); +} + +.alert--warning .alert__icon { + color: var(--color-primary); +} + +.alert__content { + flex: 1; +} + +.alert a { + color: var(--color-primary); + text-decoration: underline; +} + +/* -------------------------------------------------------------------------- + Footer + -------------------------------------------------------------------------- */ +.footer { + background: var(--bg-secondary); + padding: var(--spacing-4xl) 0 var(--spacing-2xl); + margin-top: var(--spacing-4xl); +} + +.footer__inner { + max-width: calc(var(--container-max) + 2 * var(--container-padding)); + margin: 0 auto; + padding: 0 var(--container-padding); +} + +.footer__top { + display: grid; + grid-template-columns: 1fr auto auto; + gap: var(--spacing-4xl); + padding-bottom: var(--spacing-2xl); + align-items: start; +} + +.footer__brand { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-lg); +} + +.footer__descp { + max-width: 350px; + color: var(--text-secondary); +} + +.footer__logo { + flex-shrink: 0; + max-width: 290px; +} + +.footer__section h4 { + font-family: var(--font-primary); + font-size: var(--text-xs); + font-weight: var(--font-semibold); + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-tertiary); + margin-bottom: var(--spacing-lg); +} + +.footer__links { + list-style: none; + padding: 0; + margin: 0; +} + +.footer__links li { + margin-bottom: var(--spacing-sm); +} + +.footer__links a { + color: var(--text-secondary); + font-size: var(--text-base); + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.footer__links a:hover { + color: var(--color-primary); +} + +.footer__links svg { + width: 18px; + height: 18px; +} + +.footer__products { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--spacing-sm) var(--spacing-2xl); +} + +.footer__products li { + margin-bottom: 0; +} + +.footer__bottom { + border-top: 1px solid var(--border-primary); + padding-top: var(--spacing-2xl); +} + +.footer__legal { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-lg); + font-size: var(--text-sm); + color: var(--text-tertiary); +} + +.footer__legal-links { + display: flex; + gap: var(--spacing-lg); +} + +.footer__legal-links a { + color: var(--text-secondary); +} + +.footer__disclaimer { + font-size: var(--text-xs); + color: var(--text-tertiary); + line-height: var(--leading-relaxed); +} + +.footer__legal span { + color: var(--text-secondary); +} + +/* -------------------------------------------------------------------------- + Utilities + -------------------------------------------------------------------------- */ +.text-center { text-align: center; } +.text-left { text-align: left; } +.text-right { text-align: right; } + +.mt-0 { margin-top: 0; } +.mb-0 { margin-bottom: 0; } + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.hide { + display: none; +} + +/* -------------------------------------------------------------------------- + Modal + -------------------------------------------------------------------------- */ +.modal { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10000; + align-items: center; + justify-content: center; +} + +.modal--open { + display: flex; +} + +.modal__backdrop { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 36, 71, 0.5); +} + +.modal__container { + position: relative; + width: 100%; + max-width: 800px; + max-height: 90vh; + margin: var(--spacing-xl); + background: var(--bg-primary); + border-radius: var(--radius-lg); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + overflow: hidden; + display: flex; + flex-direction: column; +} + +.modal__header { + display: flex; + align-items: center; + justify-content: space-between; + height: 56px; + padding: 0 var(--spacing-xl); + border-bottom: 1px solid var(--border-secondary); +} + +.modal__title { + font-family: var(--font-primary); + font-size: var(--text-sm); + font-weight: var(--font-medium); + margin: 0; + color: var(--text-primary); +} + +.modal__close { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + padding: 0; + background: transparent; + border: none; + border-radius: var(--radius-sm); + color: var(--text-secondary); + cursor: pointer; + transition: all 0.15s ease; +} + +.modal__close svg { + width: 18px; + height: 18px; +} + +.modal__close:hover { + background: var(--bg-secondary); + color: var(--text-primary); +} + +.modal__body { + padding: var(--spacing-xl); + overflow-y: auto; + flex: 1; +} + +.modal__info-grid { + display: flex; + border: 1px solid var(--border-secondary); + border-radius: var(--radius-md); + overflow: hidden; + margin-bottom: var(--spacing-xl); +} + +.modal__info-col { + flex: 1; + min-width: 0; +} + +.modal__info-col:first-child { + border-right: 1px solid var(--border-secondary); +} + +.modal__info-row { + display: flex; + align-items: center; + justify-content: space-between; + height: 40px; + min-height: 32px; + padding: 0 var(--spacing-lg); +} + +.modal__info-row--alt { + background: var(--bg-secondary); + border-top: 1px solid var(--border-secondary); + border-bottom: 1px solid var(--border-secondary); +} + +.modal__info-label { + font-size: var(--text-sm); + color: var(--text-primary); + min-width: 120px; +} + +.modal__info-value { + font-size: var(--text-sm); + color: var(--text-primary); + text-align: right; +} + +.modal__action-link { + display: inline-flex; + align-items: center; + gap: 6px; + color: var(--color-primary); + font-size: var(--text-sm); + text-decoration: underline; +} + +.modal__action-link:hover { + text-decoration: underline; + color: var(--color-primary-hover); +} + +.modal__action-link svg { + flex-shrink: 0; + text-decoration: none; +} + +.modal__action-link--loading { + pointer-events: none; + color: var(--text-tertiary); + text-decoration: none; +} + +.modal__spinner { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +.modal__versions-section { + padding-top: var(--spacing-lg); +} + +.modal__versions-header { + display: flex; + flex-direction: column; + gap: 1px; + margin-bottom: var(--spacing-lg); +} + +.modal__versions-title { + font-family: var(--font-primary); + font-size: var(--text-sm); + font-weight: var(--font-regular); + margin: 0; + color: var(--text-primary); + line-height: 20px; +} + +.modal__versions-subtitle { + font-family: var(--font-primary); + font-size: 11px; + font-weight: var(--font-regular); + margin: 0; + color: var(--text-tertiary); + line-height: 16px; +} + +.modal__versions { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.modal__versions .version-pill { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 32px; + padding: 1px 12px; + background: var(--bg-secondary); + border: 1px solid var(--border-secondary); + border-radius: var(--radius-full); + font-size: var(--text-sm); + font-weight: var(--font-regular); + color: var(--text-secondary); + text-decoration: none; + cursor: pointer; + margin: 0; +} + +.modal__versions .version-pill:hover { + background: var(--color-gray-300); +} + +.modal__versions .version-pill--selected { + background: var(--color-primary); + border-color: var(--color-primary); + color: var(--text-inverted); +} + +.modal__versions .version-pill--selected:hover { + background: var(--color-primary-hover); + border-color: var(--color-primary-hover); +} + +.modal__footer { + padding: var(--spacing-xl); + border-top: 1px solid var(--border-secondary); + background: var(--bg-secondary); +} + +.modal__copy-field { + display: flex; + align-items: stretch; + height: 40px; + background: var(--bg-primary); + border: 1px solid #b6c0c5; + border-radius: var(--radius-md); + box-shadow: 0 1px 2px rgba(31, 36, 38, 0.05); + overflow: hidden; +} + +.modal__copy-input { + flex: 1; + height: 100%; + padding: 4px 12px; + background: transparent; + border: none; + font-family: var(--font-mono); + font-size: var(--text-sm); + color: var(--text-primary); + line-height: 20px; +} + +.modal__copy-input:focus { + outline: none; +} + +.modal__copy-suffix { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + min-width: 110px; + padding: 4px 12px; + background: var(--bg-secondary); + border: none; + border-left: 1px solid var(--border-secondary); + color: var(--text-tertiary); + font-family: var(--font-primary); + font-size: var(--text-sm); + cursor: pointer; + transition: all 0.15s ease; +} + +.modal__copy-suffix:hover { + background: var(--color-gray-300); + color: var(--text-secondary); +} + +.modal__copy-suffix svg { + flex-shrink: 0; +} + +.modal__copy-suffix--copied { + background: var(--color-success); + color: var(--text-inverted); +} + +.modal__copy-suffix--copied:hover { + background: var(--color-success); + color: var(--text-inverted); +} + +/* -------------------------------------------------------------------------- + Responsive + -------------------------------------------------------------------------- */ +@media (max-width: 1024px) { + :root { + --container-padding: 40px; + } + + body { + border-top: 5px solid var(--color-primary-100); + } + + .wpe-navs__metanav-container { + display: none; + } + + .footer__descp { + max-width: 100% + } + + .footer__top { + grid-template-columns: 1fr; + gap: var(--spacing-2xl); + } +} + +@media (max-width: 870px) { + /* Results table horizontal scroll */ + .results-table { + display: block; + overflow-x: auto; + } +} + +@media (max-width: 768px) { + :root { + --container-padding: 24px; + --text-4xl: 36px; + --text-3xl: 28px; + --text-2xl: 22px; + } + + /* Reduce dashed border extensions */ + .dashed_border::before { + left: -24px; + right: -24px; + } + + .dashed_border::after { + top: -24px; + bottom: -24px; + } + + .dashed_border.bottom--dashed > .content::before { + left: -24px; + right: -24px; + } + + .dashed_border.bottom--dashed::after { + bottom: calc(-1 * var(--spacing-2halfxl) - 64px); + } + + /* Reduce bottom-dashed margin on small screens */ + .bottom--dashed:last-child { + margin-bottom: calc(64px + var(--spacing-xl)); + } + + /* First bottom-dashed extends through divider with small overhang */ + .dashed_border.bottom--dashed:first-child::after { + bottom: -88px; + } + + + .search-divider::before { + left: -24px; + right: -24px; + } + + /* Hero adjustments */ + .hero { + padding: var(--spacing-xl) 0; + } + + .hero__card { + padding: var(--spacing-lg); + } + + .hero__content { + padding: var(--spacing-lg) var(--spacing-xl); + } + + .hero__title { + font-size: 40px; + } + + /* Search header - stack with centered logo */ + .search-header__inner { + flex-direction: column; + gap: var(--spacing-lg); + text-align: center; + } + + .search-header__logo { + width: 64px; + height: 64px; + margin: 0 auto; + } + + .search-header__form { + width: 100%; + } + + .search-header__form .search-bar { + height: auto; + } + + .search-header__form .search-bar__icon, + .search-header__form .search-bar__input, + .search-header__form .search-bar__dropdown, + .search-header__form .search-bar__button { + height: 48px; + } + + /* Search bar adjustments */ + .search-bar { + flex-wrap: wrap; + height: auto; + border-radius: var(--radius-lg); + position: relative; + } + + .search-bar__icon { + position: absolute; + background: transparent; + top: var(--spacing-sm); + left: var(--spacing-sm); + height: 48px; + width: 48px; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + border-radius: var(--radius-lg) 0 0 0; + } + + .search-bar__input { + flex: 0 0 100%; + width: 100%; + order: 1; + border-bottom: 1px solid var(--border-primary); + padding-left: 56px; + height: 48px; + border-radius: var(--radius-lg) var(--radius-lg) 0 0; + } + + .search-bar__dropdown { + flex: 0 0 50%; + width: 50%; + min-width: 0; + order: 2; + border-left: none; + margin-right: 0; + height: 48px; + border-radius: 0 0 0 var(--radius-lg); + } + + .search-bar__button { + flex: 0 0 50%; + width: 50%; + min-width: 0; + order: 3; + height: 48px; + border-radius: 0 0 var(--radius-lg) 0; + } + + /* Modal */ + .modal__info-grid { + flex-direction: column; + } + + .modal__info-col:first-child { + border-right: none; + border-bottom: 1px solid var(--border-secondary); + } + + /* Code block */ + .code-block { + overflow-x: auto; + } + + /* Footer */ + .footer__products { + grid-template-columns: 1fr; + } + + .footer__legal { + flex-direction: column; + gap: var(--spacing-md); + text-align: center; + } + + .footer__legal-links { + justify-content: center; + } +} + +@media (max-width: 480px) { + :root { + --container-padding: 16px; + } + + /* Further reduce dashed border extensions */ + .dashed_border::before { + left: -16px; + right: -16px; + } + + .dashed_border.bottom--dashed > .content::before { + left: -16px; + right: -16px; + } + + .search-divider::before { + left: -16px; + right: -16px; + } + + /* Search bar stacks fully */ + .search-bar__dropdown { + flex: 0 0 100%; + width: 100%; + border-bottom: 1px solid var(--border-primary); + border-radius: 0; + } + + .search-bar__button { + flex: 0 0 100%; + width: 100%; + border-radius: 0 0 var(--radius-lg) var(--radius-lg); + } + + /* Modal copy field */ + .modal__copy-suffix span { + display: none; + } + + .modal__copy-suffix { + padding: var(--spacing-sm) var(--spacing-md); + } + + /* Section padding */ + .section { + padding: var(--spacing-xl) 0; + } } diff --git a/web/assets/img/divider-bg.svg b/web/assets/img/divider-bg.svg new file mode 100644 index 0000000..0afade3 --- /dev/null +++ b/web/assets/img/divider-bg.svg @@ -0,0 +1,1055 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/img/fork.png b/web/assets/img/fork.png deleted file mode 100644 index 146ef8a..0000000 Binary files a/web/assets/img/fork.png and /dev/null differ diff --git a/web/assets/img/hero-bg.svg b/web/assets/img/hero-bg.svg new file mode 100644 index 0000000..a691f0f --- /dev/null +++ b/web/assets/img/hero-bg.svg @@ -0,0 +1,2085 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/img/wpackagist-logo-wpe.svg b/web/assets/img/wpackagist-logo-wpe.svg new file mode 100644 index 0000000..067e8d9 --- /dev/null +++ b/web/assets/img/wpackagist-logo-wpe.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/img/wpackagist-logo.svg b/web/assets/img/wpackagist-logo.svg new file mode 100644 index 0000000..9fa9ad0 --- /dev/null +++ b/web/assets/img/wpackagist-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/web/assets/js/main.js b/web/assets/js/main.js index 2ca4c01..f4a3d3a 100644 --- a/web/assets/js/main.js +++ b/web/assets/js/main.js @@ -1,46 +1,185 @@ $(document).ready(function () { + var $modal = $('#package-modal'); + var currentPackageData = null; + var selectedVersion = null; + + // Disable refresh buttons while refreshing to prevent double submit crashes. $('.search-result__refresh-form').on('submit', function (event) { - // Disable refresh buttons while refreshing to prevent double submit crashes. $('.search-result__refresh-button').prop('disabled', true); }); - //click on a version sug to display an info box row + // Open modal when clicking any version pill $('.js-version').on('click', function (event) { event.preventDefault(); var $element = $(this), $parentRow = $element.closest('tr'), - name = $parentRow.find('[data-name]').data('name'), - type = $parentRow.find('[data-type]').data('type'), - version = $element.data('version'), - copyString = '"wpackagist-' + type + '/' + name + '":"' + version + '"'; - - //remove any existing info boxes - $('.js-composer-info').remove(); - - //add info box in next row - $parentRow.after(" \ -
\ -
\ - \ -
\ -
\ - \ -
\ -
\ - "); - - //select text for copying - $('.js-composer-info .js-copy').val(copyString).select(); - }); - - //extra versions toggle - $('.js-toggle-more').on('click', function (event) { + clickedVersion = $element.data('version'); + + // Get package data from row data attributes + currentPackageData = { + name: $parentRow.data('package-name'), + type: $parentRow.data('package-type'), + lastCommitted: $parentRow.data('package-last-committed'), + lastFetched: $parentRow.data('package-last-fetched'), + isActive: $parentRow.data('package-is-active') === true || $parentRow.data('package-is-active') === 'true', + versions: $parentRow.data('package-versions') || [] + }; + + // Set selected version (use first available if "more..." was clicked) + if (clickedVersion) { + selectedVersion = clickedVersion; + } else if (currentPackageData.versions.length > 0) { + // For "more..." pill, select the latest version + var versions = currentPackageData.versions.slice().reverse(); + selectedVersion = versions[0] !== 'dev-trunk' ? versions[0] : (versions[1] || versions[0]); + } + + openModal(); + }); + + function openModal() { + if (!currentPackageData) return; + + // Populate modal header + $('#modal-package-name').text(currentPackageData.name); + + // Populate info grid + $('#modal-package-type').text(capitalizeFirst(currentPackageData.type)); + $('#modal-package-committed').text(currentPackageData.lastCommitted); + $('#modal-package-fetched').text(currentPackageData.lastFetched); + + // Active status + if (currentPackageData.isActive) { + $('#modal-package-active').html(''); + } else { + $('#modal-package-active').html(''); + } + + // Set links + $('#modal-wp-link').attr('href', 'https://wordpress.org/' + currentPackageData.type + 's/' + currentPackageData.name + '/'); + + // Build versions pills + var $versionsContainer = $('#modal-versions'); + $versionsContainer.empty(); + + var versions = currentPackageData.versions.slice().reverse(); + + // Show dev-trunk first if available + var devTrunkIndex = versions.indexOf('dev-trunk'); + if (devTrunkIndex > -1) { + versions.splice(devTrunkIndex, 1); + versions.unshift('dev-trunk'); + } + + versions.forEach(function(version) { + var isDevTrunk = version === 'dev-trunk'; + var isSelected = version === selectedVersion; + var classes = 'version-pill'; + if (isDevTrunk) classes += ' version-pill--dev'; + if (isSelected) classes += ' version-pill--selected'; + + var $pill = $('' + version + ''); + $versionsContainer.append($pill); + }); + + // Update copy field + updateCopyField(); + + // Show modal + $modal.addClass('modal--open'); + $('body').css('overflow', 'hidden'); + } + + function updateCopyField() { + if (!currentPackageData || !selectedVersion) return; + + var copyString = '"wpackagist-' + currentPackageData.type + '/' + currentPackageData.name + '": "' + selectedVersion + '"'; + $('#modal-copy-field').val(copyString); + } + + function capitalizeFirst(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + + function closeModal() { + $modal.removeClass('modal--open'); + $('body').css('overflow', ''); + currentPackageData = null; + selectedVersion = null; + } + + // Close modal on backdrop click + $modal.on('click', '.modal__backdrop', function () { + closeModal(); + }); + + // Close modal on close button click + $modal.on('click', '.modal__close', function () { + closeModal(); + }); + + // Close modal on Escape key + $(document).on('keydown', function (e) { + if (e.key === 'Escape' && $modal.hasClass('modal--open')) { + closeModal(); + } + }); + + // Select version in modal + $modal.on('click', '.version-pill', function (event) { event.preventDefault(); - var $element = $(this), - $siblingsToToggle = $element.siblings('[data-hide]'); + var $pill = $(this); + selectedVersion = $pill.data('version'); + + // Update selected state + $modal.find('.version-pill').removeClass('version-pill--selected'); + $pill.addClass('version-pill--selected'); + + // Update copy field + updateCopyField(); + }); + + // Copy button functionality + $modal.on('click', '#modal-copy-btn', function () { + var $input = $('#modal-copy-field'); + var $button = $(this); + + $input.select(); + + if (navigator.clipboard) { + navigator.clipboard.writeText($input.val()).then(function () { + $button.addClass('modal__copy-suffix--copied').html('Copied!'); + + setTimeout(function () { + $button.removeClass('modal__copy-suffix--copied').html('Copy'); + }, 2000); + }); + } else { + // Fallback for older browsers + document.execCommand('copy'); + } + }); + + // Handle refresh link in modal + $modal.on('click', '#modal-refresh-link', function (event) { + event.preventDefault(); + + if (!currentPackageData) return; + + var $link = $(this); + + // Show loading state + $link.addClass('modal__action-link--loading'); + $link.html('Checking for updates...'); + + // Create and submit a form to refresh the package + var $form = $('
' + + '' + + '
'); - $siblingsToToggle.toggleClass('hide'); + $('body').append($form); + $form.submit(); }); }); diff --git a/web/assets/js/segment.js b/web/assets/js/segment.js new file mode 100644 index 0000000..faffd68 --- /dev/null +++ b/web/assets/js/segment.js @@ -0,0 +1,340 @@ +// function to check empty-ish strings and return undefined if empty-ish +function check_empty_string(str) { + if (!str || str === '' || str.match(/undefined|null/)) return undefined; + else return str +} + +// function to set a cookie in the user's browser +function set_cookie(name, value, duration_in_days, path = '/', host = '.wpackagist.org') { + let expires = ''; + + if (duration_in_days) { + const date = new Date(); + date.setTime(date.getTime() + (duration_in_days * 24 * 60 * 60 * 1000)); // Convert days to milliseconds + expires = '; expires=' + date.toUTCString(); + } + + const cookie_string = encodeURIComponent(value) + expires + '; path=' + path + '; domain=' + host; + document.cookie = name + '=' + cookie_string; +} + +// function to get all browser cookies as an object +function get_all_cookies() { + const cookies = {}; + const cookie_string = document.cookie; + + if (cookie_string) { + const cookie_pairs = cookie_string.split('; '); + for (const pair of cookie_pairs) { + const [name, value] = pair.split('='); + cookies[decodeURIComponent(name)] = decodeURIComponent(value); + } + } + + return cookies; +} + +// function to get cookie with specified name from cookies object +function get_cookie(name, cookies) { + cookies = cookies || get_all_cookies() + return cookies[name] +} + +// --- SEGMENT MIDDLEWARES --- // + +// function to extract specified cookies and transform the values +function extract_traits_from_cookies(cookies) { + const configurations = [{ + trait: 'ga_client_id', + cookie: '_ga', + transform: function(value) { + let extracted = /^[GA\d\.]+\.(\d+\.\d+)/.exec(value) || undefined + if (extracted) extracted = extracted[1] + return extracted + } + }, + { + trait: 'ga_session_id', + cookie: '_ga_QQ5FN8NX8W', + transform: function(value) { + let extracted = /^[GS\d\.]+\.s(\d+)\$/.exec(value) || undefined + if (extracted) extracted = extracted[1] + return extracted + } + }, + { + cookie: '_fbp', + trait: 'fbp' + }, + { + cookie: '_fbc', + trait: 'fbc' + }, + { + cookie: 'kameleoonVisitorCode', + trait: 'kameleoonVisitorCode' + }, + { + cookie: 'hubspotutk', + trait: 'hubspotutk' + }, + { + cookie: '_hstc', + trait: 'hstc' + }, + { + cookie: '_hssc', + trait: 'hssc' + }, + { + cookie: '_hssrc', + trait: 'hssrc' + }, + { + cookie: 'uetvid', + trait: 'uetvid' + }, + { + cookie: 'uetsid', + trait: 'uetsid' + }, + { + cookie: 'fbclid', + trait: 'fbclid' + }, + { + cookie: 'gclid', + trait: 'gclid' + }, + { + cookie: 'msclkid', + trait: 'msclkid' + }, + { + cookie: 'li_fat_id', + trait: 'li_fat_id' + }, + ]; + + cookies = cookies || get_all_cookies(); + const extracted = {}; + + for (const configuration of configurations) { + var value = get_cookie(configuration.cookie, cookies) + if (value && configuration?.transform) { + try { + value = configuration.transform(value) + } catch (error) { + console.log(error) + } + } + extracted[configuration?.trait] = value + } + + return extracted; +} + +// function to add context traits to every segment event +function add_traits_context_to_event(event, cookies) { + cookies = cookies || get_all_cookies() + let traits = window.analytics.user()?.traits() + if (!traits) traits = JSON.parse(localStorage.getItem('ajs_user_traits') || '{}') + event.context.traits = { + ...traits, + ...extract_traits_from_cookies(cookies) + } + return event +} + +// function to add "active" (logged in) context to every event +function add_active_context_to_event(event, cookies) { + const active = undefined // update with logic to check if user is logged in + event.context.active = active + return event +} + + +// function to add screen context to every event +function add_screen_context_to_event(event) { + event.context.screen = { + width: window.screen.availWidth, + height: window.screen.availHeight, + density: window.devicePixelRatio, + depth: window.screen.colorDepth, + orientation: window.screen.orientation.type, + viewport: { + width: window.innerWidth, + height: window.innerHeight, + visible: document.hidden === false, + }, + } + + return event +} + +// function to add device context to every event +function add_device_context_to_event(event) { + function get_device_details() { + const ua = window.navigator.userAgent.toLowerCase() + let browser = "Unknown"; + let browser_version = "Unknown"; + let os = "Unknown"; + let os_version = "Unknown"; + + // Browser detection + if (ua.includes("firefox")) { + browser = "Firefox"; + browser_version = ua.match(/firefox\/([\d.]+)/)?.[1] || "Unknown"; + } else if (ua.includes("chrome") && !ua.includes("edg/")) { + browser = "Chrome"; + browser_version = ua.match(/chrome\/([\d.]+)/)?.[1] || "Unknown"; + } else if (ua.includes("safari") && !ua.includes("chrome")) { + browser = "Safari"; + browser_version = ua.match(/version\/([\d.]+)/)?.[1] || "Unknown"; + } else if (ua.includes("edg/")) { + browser = "Edge"; + browser_version = ua.match(/edg\/([\d.]+)/)?.[1] || "Unknown"; + } else if (ua.includes("opr/") || ua.includes("opera")) { + browser = "Opera"; + browser_version = (ua.match(/(?:opr|opera)\/([\d.]+)/)?.[1]) || "Unknown"; + } else if (ua.includes("trident") || ua.includes("msie")) { + browser = "Internet Explorer"; + browser_version = (ua.match(/(?:msie |rv:)([\d.]+)/)?.[1]) || "Unknown"; + } + + // OS detection + if (ua.includes("win")) { + os = "Windows"; + if (ua.includes("windows nt 10.0")) os_version = "10"; + else if (ua.includes("windows nt 6.3")) os_version = "8.1"; + else if (ua.includes("windows nt 6.2")) os_version = "8"; + else if (ua.includes("windows nt 6.1")) os_version = "7"; + else os_version = "Unknown"; + } else if (ua.includes("mac")) { + os = "macOS"; + os_version = ua.match(/mac os x ([\d_.]+)/)?.[1]?.replace(/_/g, ".") || "Unknown"; + } else if (ua.includes("android")) { + os = "Android"; + os_version = ua.match(/android ([\d.]+)/)?.[1] || "Unknown"; + } else if (ua.includes("linux")) { + os = "Linux"; + } else if (ua.includes("ios")) { + os = "iOS"; + os_version = ua.match(/os ([\d_]+)/)?.[1]?.replace(/_/g, ".") || "Unknown"; + } + + return { + 'browser': { + 'name': browser, + 'version': browser_version + }, + 'os': { + 'name': os, + 'version': os_version + }, + }; + } + + const device = get_device_details() + event.context.browser = device.browser + event.context.os = device.os + return event +} + +// --- SEGMENT INITIALIZATION --- // +// dev write key: LJtH5KB9NekHD4NI9nTTP7RFdP9qBz4k +// prod write key: JE0JDr66vnWajTou1WbihYddU4FKMTU0 +const segment_key = (window.location.host === 'wpackagist.org') ? 'JE0JDr66vnWajTou1WbihYddU4FKMTU0' : (window.location.host == 'staging.wpackagist.org' ? 'LJtH5KB9NekHD4NI9nTTP7RFdP9qBz4k' : null); +if (segment_key !== null) { + var analytics = window.analytics = window.analytics || []; + if (!analytics.initialize) { + if (analytics.invoked) { + window.console && console.error && console.error('Segment snippet included twice.'); + } else { + analytics.invoked = !0; + analytics.methods = [ + 'trackSubmit', + 'trackClick', + 'trackLink', + 'trackForm', + 'pageview', + 'identify', + 'reset', + 'group', + 'track', + 'ready', + 'alias', + 'debug', + 'page', + 'once', + 'off', + 'on', + 'addSourceMiddleware', + 'addIntegrationMiddleware', + 'setAnonymousId', + 'addDestinationMiddleware', + 'timeout']; + analytics.factory = function(e) { + return function() { + var t = Array.prototype.slice.call(arguments); + t.unshift(e); + analytics.push(t); + return analytics; + }; + }; + for (var e = 0; e < analytics.methods.length; e++) { + var key = analytics.methods[e]; + analytics[key] = analytics.factory(key); + } + analytics.load = function(key, e) { + var t = document.createElement('script'); + t.type = 'text/javascript'; + t.async = !0; + t.src = 'https://journey-cdn.wpengine.com/journey.js/v1/' + key + '/journey.min.js' + var n = document.getElementsByTagName('script')[0]; + n.parentNode.insertBefore(t, n); + analytics._loadOptions = e; + }; + analytics._writeKey = segment_key; + analytics.SNIPPET_VERSION = '4.15.2'; + analytics.timeout(500); + analytics._cdn = 'https://journey-cdn.wpengine.com'; + } + } + + // function to apply above function logic to Segment events + analytics.addSourceMiddleware(function({payload, integration, next}) { + let event = payload.obj + const cookies = get_all_cookies() + event = add_traits_context_to_event(event, cookies) + event = add_active_context_to_event(event, cookies) + event = add_screen_context_to_event(event) + event = add_device_context_to_event(event) + payload.obj = event + next(payload) + }); + + // function to add context and the event id to Google Tag Manager dataLayer pushes + analytics.addDestinationMiddleware('Google Tag Manager', function({payload, next}) { + payload.obj.properties.context = payload.obj.context; + payload.obj.properties.event_id = payload.obj.messageId; + next(payload); + }); + + + /** + * `analytics.load(...)` and `analytics.page()` are run at the very end of all of the code in this file to ensure + * that the context is added to every event, including page views, as we may not have fully initialized all + * middlewares before sending the page view subsequently not including the context data. + * + * Segment has 2 stages of "loading": + * 1. Initialization + * 2. Loading Dependencies + * + * All code that is run before `analytics.load(...)` is initializing Segment (primarily setting the object to the window). + * After `analytics.load(...)` runs, dependencies are downloaded and all events are queued while everything that was + * previously initialized is sent to Segment. + */ + analytics.load(segment_key); + analytics.page(); +} diff --git a/web/favicon.png b/web/favicon.png index ad8a872..0f46e53 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/index.php b/web/index.php index d3ab760..c87d94a 100644 --- a/web/index.php +++ b/web/index.php @@ -13,7 +13,11 @@ } if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { - Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); + // Trust X-Forwarded-For, Proto, and Port headers (but not Host for security) + Request::setTrustedProxies( + explode(',', $trustedProxies), + Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_PORT + ); } else { /** * If no env override, get the correct request context behind an AWS load balancer. diff --git a/web/templates/footer.twig b/web/templates/footer.twig deleted file mode 100644 index ff63210..0000000 --- a/web/templates/footer.twig +++ /dev/null @@ -1,20 +0,0 @@ -
-

- - -

-

An Outlandish experiment.

-

- The WordPress® trademark is the intellectual property of the WordPress Foundation. Uses of the WordPress® - name in this website are for identification purposes only and do not imply an endorsement by WordPress Foundation. - WPackagist is not endorsed or owned by, or affiliated with, the WordPress Foundation. -

-
diff --git a/web/templates/index.twig b/web/templates/index.twig index 18cd53f..6727000 100644 --- a/web/templates/index.twig +++ b/web/templates/index.twig @@ -1,43 +1,99 @@ {% extends "layout.twig" %} -{% block title %} - {{ title }} -{% endblock %} +{% block title %}{{ title }}{% endblock %} {% block content %} -

This site mirrors the WordPress® plugin and theme directories as a Composer repository. -

- - {% include 'searchbar.twig' %} - -
-
-

How do I use it?

- -
    -
  1. Add the repository to your composer.json
  2. - -
  3. Add the desired plugins and themes to your requirements using - wpackagist-plugin or wpackagist-theme as - the vendor name.
  4. - -
  5. Run $ composer.phar update
  6. - -
  7. Packages are - installed to wp-content/plugins/ or - wp-content/themes/ (unless otherwise specified by - installer-paths) -
  8. -
- -

Example

+ +
+
+
+
+ +

WPackagist

+

+ A free service that mirrors the WordPress® plugin and theme directories as a Composer repository. 1 +

+ + {% include 'searchbar.twig' %} +
+
+
+
+ + +
+
+
+ +
+

How do I use it?

+
    +
  1. Add the repository to your composer.json
  2. +
  3. Add the desired plugins and themes to your requirements using wpackagist-plugin + or wpackagist-theme as the vendor name. +
  4. +
  5. Run $ composer.phar update
  6. +
  7. Packages are installed to + wp-content/plugins/ or wp-content/themes/ (unless otherwise + specified by installer-paths) +
  8. +
+
+ + +
+

Example Usage

+
+
+
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+
+
{
     "name": "acme/brilliant-wordpress-site",
     "description": "My brilliant WordPress site",
-
"repositories":[ + "repositories":[ { "name": "wpackagist", "type": "composer", @@ -47,13 +103,13 @@ "wpackagist-theme/*" ] } - ], -
"require": { + ], + "require": { "aws/aws-sdk-php":"*", -
"wpackagist-plugin/akismet":"dev-trunk", - "wpackagist-plugin/wordpress-seo":">=7.0.2", - "wpackagist-theme/hueman":"*" -
}, + "wpackagist-plugin/akismet":"dev-trunk", + "wpackagist-plugin/advanced-custom-fields":">=6.7.1", + "wpackagist-theme/frost":"*" + }, "autoload": { "psr-0": { "Acme": "src/" @@ -61,105 +117,100 @@ }, "extra": { "installer-paths": { -
"wp-content/mu-plugins/{$name}/": [ + "wp-content/mu-plugins/{$name}/": [ "wpackagist-plugin/akismet" - ], -
"wp-content/plugins/{$name}/": [ + ], + "wp-content/plugins/{$name}/": [ "type:wordpress-plugin" ] } } }
- -

This example composer.json file adds the Wpackagist - repository and includes the latest version of Akismet (installed as - a must-use plugin), at least version 7.0.2 of Wordpress SEO, and the latest - Hueman theme along with the Amazon Web Services SDK from the main - Packagist repository.

- -

Find out more about using Composer - including custom - install paths.

- -

The old vendor prefix wpackagist is now - removed in favour of - wpackagist-plugin.

+
+
+

+ This example composer.json file adds the Wpackagist repository and includes the + latest version of Akismet (installed as a must-use plugin), at least version 6.7.1 of Advanced Custom Fields, and the latest Frost theme along with the Amazon Web Services SDK from the main Packagist repository. +

+

+ Find out more about using Composer + including custom install + paths. +

+

+ The old vendor prefix wpackagist is now removed in favour of + wpackagist-plugin. +

+
+
- -
-

Why use Composer?

- -
- “Composer is a tool for dependency management in PHP. It - allows you to declare the dependent libraries your project needs - and it will install them in your project for you.” - -
- — getcomposer.org -
-
- -
    -
  • Avoid committing plugins and themes into source control.
  • - -
  • Avoid having to use git submodules.
  • - -
  • Manage WordPress® and non-WordPress® project libraries with the - same tools.
  • - -
  • Could eventually be used to manage dependencies between - plugins.
  • -
- -

How does the repository work?

- -
    -
  • Scans the WordPress® Subversion repository every hour for plugins and themes. Search and click to make any newer versions available. -
  • - -
  • Fetches the tags for each updated package and maps - those to versions.
  • - -
  • For plugins, adds trunk as a dev version.
  • - -
  • Rebuilds the composer package JSON files.
  • -
- -

Known issues

- -
    -
  • Requires Composer 1.0.0-alpha7 or more recent
  • - -
  • Version strings which Composer cannot parse are ignored. All - plugins have at least the trunk build available.
  • - -
  • Themes do not have a trunk version. It is recommended to use - "*" as the required version.
  • - -
  • Even when packages are present on SVN, they won’t be available - if they are not published on wordpress.org. - Try searching for your plugin before reporting a - bug.
  • - -
  • You can also check for open issues.
  • -
- -

WordPress® Core

- -

See - fancyguy/webroot-installer or - roots/wordpress for installing - WordPress® itself using Composer.

- -

Contribute or get support

- -

Please visit our GitHub page.

- +
+
+ +
+

Why use Composer?

+
+

“Composer is a tool for dependency management in PHP. It allows you to declare the + dependent libraries your project needs and it will install them in your project for you.”

+ getcomposer.org +
+
    +
  • Avoid committing plugins and themes into source control.
  • +
  • Avoid having to use git submodules.
  • +
  • Manage WordPress® and non-WordPress® project libraries with the same tools.
  • +
  • Could eventually be used to manage dependencies between plugins.
  • +
+
+ + +
+

How does the repository work?

+
    +
  • Scans the WordPress® Subversion repository every hour for plugins and themes. Search and click + + to make any newer versions available. +
  • +
  • Fetches the tags for each updated package and maps those to versions.
  • +
  • For plugins, adds trunk as a dev version.
  • +
  • Rebuilds the composer package JSON files.
  • +
+
+ + +
+

Known issues

+
    +
  • Requires Composer 1.0.0-alpha7 or more recent
  • +
  • Version strings which Composer cannot parse are ignored. All plugins have at least the trunk + build available. +
  • +
  • Themes do not have a trunk version. It is recommended to use "*" as the + required version. +
  • +
  • Even when packages are present on SVN, they won’t be available if they are not + published on wordpress.org. Try searching for your plugin before reporting + a bug. +
  • +
  • You can also check for open + issues. +
  • +
+
+ + +
+

WordPress® Core

+

+ See fancyguy/webroot-installer + or roots/wordpress for installing + WordPress® itself using Composer. +

+
+
-
+
{% endblock %} diff --git a/web/templates/layout.twig b/web/templates/layout.twig index 879b2c0..46099bf 100644 --- a/web/templates/layout.twig +++ b/web/templates/layout.twig @@ -1,35 +1,89 @@ - + + {% block title %}{% endblock %} - - - - + + + + + - - - + -
-
+ + {% include 'metanav.twig' %} -

WPackagist

+ {% block content %}{% endblock %} - {% block content %}{% endblock %} - - {% include 'footer.twig' %} + +
- Fork WPackagist on GitHub - - + + + + diff --git a/web/templates/metanav.twig b/web/templates/metanav.twig new file mode 100644 index 0000000..41807aa --- /dev/null +++ b/web/templates/metanav.twig @@ -0,0 +1,25 @@ +{% if metanav_data is defined and metanav_data %} + +{% endif %} diff --git a/web/templates/search.twig b/web/templates/search.twig index f568340..cb34064 100644 --- a/web/templates/search.twig +++ b/web/templates/search.twig @@ -1,87 +1,246 @@ {% extends "layout.twig" %} -{% block title %} - {{ title }} -{% endblock %} +{% block title %}{{ title }}{% endblock %} {% block content %} - {% include 'searchbar.twig' %} + +
+
+
+
+ +
+ {% include 'searchbar.twig' with {'is_compact': true} %} +
+
+
+
+
+ + +
+
+ {% if error %} +
+ + + + + + + +
{{ error }}
+
+ {% endif %} - {% if error %} -
{{ error }}
- {% endif %} - - - - - - - - - - - - - - {% for package in currentPageResults %} +
TypeNameLast committedLast fetchedVersionsActiveRefresh
+ - - - - - + + + + + + + + + + {% for package in currentPageResults %} + {% set versions = package.versions | format_versions %} + {% set totalVersions = versions | length %} + {% set hasHiddenVersions = totalVersions > 3 %} + + + + + + - - - - {% else %} - - - - {% endfor %} + + + + + {% else %} + + + + {% endfor %} + +
- {{ package.type | capitalize }} - - {{ package.name | e }} - - {{ package.lastCommitted ? package.lastCommitted | date : 'Not Committed' }} - - {{ package.lastFetched ? package.lastFetched | date : 'Not fetched' }} - - {% set versions = package.versions | format_versions %} - {% for version in versions %} - {# Separator allowing to toggle the show more version #} - {% if (loop.index == 2 and loop.length > 4) %} - ... + NameTypeLast committedLast fetchedVersionsActiveRefresh
+ {{ package.name | e }} + + {{ package.type | capitalize }} + + {{ package.lastCommitted ? package.lastCommitted | date('M j, Y H:i') : 'Not Committed' }} + + {{ package.lastFetched ? package.lastFetched | date('M j, Y H:i') : 'Not fetched' }} + + {% set hasDevTrunk = 'dev-trunk' in versions %} + {% set maxVisible = 3 %} + {% set hiddenCount = totalVersions > maxVisible ? totalVersions - maxVisible : 0 %} + + {# Show dev-trunk first if available #} + {% if hasDevTrunk %} + dev-trunk {% endif %} - {# Hide extra versions, keep showing only the last 3 and the dev-trunk #} - {% if loop.index >= 2 and loop.index <= loop.length - 3 %} - {{ version }} + + {# Show latest versions (excluding dev-trunk) #} + {% set versionIndex = 0 %} + {% set versionsToShow = hasDevTrunk ? maxVisible - 1 : maxVisible %} + {% for version in versions | reverse %} + {% if version != 'dev-trunk' %} + {% set versionIndex = versionIndex + 1 %} + {% if versionIndex <= versionsToShow %} + {{ version }} + {% endif %} + {% endif %} {% else %} - {{ version }} + {% if not hasDevTrunk %} + No version available. + {% endif %} + {% endfor %} + + {# Show "more..." pill to open modal with all versions #} + {% if hiddenCount > 0 %} + more… {% endif %} - {% else %} - No version available. - {% endfor %} - - {% if package.isActive %} - - {% else %} - - {% endif %} - -
- - -
-
No results.
+ {% if package.isActive %} + + + + + + {% else %} + + + + + + + {% endif %} + +
+ + +
+
+ No results found. +
+ + + {{ pagerfanta(pager, 'default') }} +
+ + +
- - + +
+ + + + + + + +
+ If a package has no version and/or is not active, please check it is visible on wordpress.org before reporting a bug. +
+
+
- {{ pagerfanta(pager, 'default') }} + +