diff --git a/app/composer.json b/app/composer.json index 879b2b491..1726aa9c5 100644 --- a/app/composer.json +++ b/app/composer.json @@ -6,10 +6,10 @@ "license": "MIT", "require": { "php": ">=7.3", - "cakephp/cakephp": "^4.3", + "cakephp/cakephp": "^4.4", "cakephp/migrations": "^3.2", "cakephp/plugin-installer": "^1.3", - "components/jquery": "~3.6.0", + "components/jquery": "~3.7", "doctrine/dbal": "^3.3", "mobiledetect/mobiledetectlib": "^2.8", "twbs/bootstrap": "^5.1" @@ -76,6 +76,10 @@ }, "prefer-stable": true, "config": { - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "cakephp/plugin-installer": true + } } } diff --git a/app/composer.lock b/app/composer.lock index ec4b9163f..c9c36f6ad 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d4260a1be97158a49b35b1d1eadc05a8", + "content-hash": "0d865a4843fd23d964c2c327103cde7a", "packages": [ { "name": "cakephp/cakephp", - "version": "4.3.8", + "version": "4.4.17", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp.git", - "reference": "34aae68e91e6834aa6711c3e435a3f220bf56c0b" + "reference": "9ff254d6d60720089dec1e10aa1907e24e39a98e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp/zipball/34aae68e91e6834aa6711c3e435a3f220bf56c0b", - "reference": "34aae68e91e6834aa6711c3e435a3f220bf56c0b", + "url": "https://api.github.com/repos/cakephp/cakephp/zipball/9ff254d6d60720089dec1e10aa1907e24e39a98e", + "reference": "9ff254d6d60720089dec1e10aa1907e24e39a98e", "shasum": "" }, "require": { @@ -27,9 +27,9 @@ "ext-json": "*", "ext-mbstring": "*", "laminas/laminas-diactoros": "^2.2.2", - "laminas/laminas-httphandlerrunner": "^1.1", + "laminas/laminas-httphandlerrunner": "^1.1 || ^2.0", "league/container": "^4.2.0", - "php": ">=7.2.0", + "php": ">=7.4.0", "psr/container": "^1.1 || ^2.0", "psr/http-client": "^1.0", "psr/http-server-handler": "^1.0", @@ -37,6 +37,14 @@ "psr/log": "^1.0 || ^2.0", "psr/simple-cache": "^1.0 || ^2.0" }, + "provide": { + "psr/container-implementation": "^1.0 || ^2.0", + "psr/http-client-implementation": "^1.0", + "psr/http-server-handler-implementation": "^1.0", + "psr/http-server-middleware-implementation": "^1.0", + "psr/log-implementation": "^1.0 || ^2.0", + "psr/simple-cache-implementation": "^1.0 || ^2.0" + }, "replace": { "cakephp/cache": "self.version", "cakephp/collection": "self.version", @@ -63,7 +71,7 @@ "suggest": { "ext-curl": "To enable more efficient network calls in Http\\Client.", "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.", - "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()", + "lib-ICU": "To use locale-aware features in the I18n and Database packages", "paragonie/csp-builder": "CSP builder, to use the CSP Middleware" }, "type": "library", @@ -108,20 +116,20 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/cakephp" }, - "time": "2022-04-23T01:23:23+00:00" + "time": "2023-08-20T02:36:22+00:00" }, { "name": "cakephp/chronos", - "version": "2.3.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "3ecd6e7ae191c676570cd1bed51fd561de4606dd" + "reference": "dd583900b26971e84d56c482d6c5fc16961bd103" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/3ecd6e7ae191c676570cd1bed51fd561de4606dd", - "reference": "3ecd6e7ae191c676570cd1bed51fd561de4606dd", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/dd583900b26971e84d56c482d6c5fc16961bd103", + "reference": "dd583900b26971e84d56c482d6c5fc16961bd103", "shasum": "" }, "require": { @@ -152,48 +160,47 @@ }, { "name": "The CakePHP Team", - "homepage": "http://cakephp.org" + "homepage": "https://cakephp.org" } ], "description": "A simple API extension for DateTime.", - "homepage": "http://cakephp.org", + "homepage": "https://cakephp.org", "keywords": [ "date", "datetime", "time" ], "support": { - "irc": "irc://irc.freenode.org/cakephp", "issues": "https://github.com/cakephp/chronos/issues", "source": "https://github.com/cakephp/chronos" }, - "time": "2021-10-17T02:44:05+00:00" + "time": "2023-09-12T03:12:29+00:00" }, { "name": "cakephp/migrations", - "version": "3.5.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/cakephp/migrations.git", - "reference": "6b03a44bef94b99a24ab7d4c44cb292bb6f275c2" + "reference": "58446fdd096087ddf7752c0317731b8725d1dc28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/migrations/zipball/6b03a44bef94b99a24ab7d4c44cb292bb6f275c2", - "reference": "6b03a44bef94b99a24ab7d4c44cb292bb6f275c2", + "url": "https://api.github.com/repos/cakephp/migrations/zipball/58446fdd096087ddf7752c0317731b8725d1dc28", + "reference": "58446fdd096087ddf7752c0317731b8725d1dc28", "shasum": "" }, "require": { "cakephp/cache": "^4.3.0", "cakephp/orm": "^4.3.0", - "php": ">=7.2.0", - "robmorgan/phinx": "^0.12" + "php": ">=7.4.0", + "robmorgan/phinx": "^0.13.2" }, "require-dev": { "cakephp/bake": "^2.6.0", "cakephp/cakephp": "^4.3.0", "cakephp/cakephp-codesniffer": "^4.1", - "phpunit/phpunit": "^8.5.0 || ^9.5.0" + "phpunit/phpunit": "^9.5.0" }, "suggest": { "cakephp/bake": "If you want to generate migrations.", @@ -227,7 +234,7 @@ "issues": "https://github.com/cakephp/migrations/issues", "source": "https://github.com/cakephp/migrations" }, - "time": "2022-03-14T14:26:38+00:00" + "time": "2023-09-22T08:39:18+00:00" }, { "name": "cakephp/plugin-installer", @@ -329,16 +336,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.1", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -385,7 +392,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.3.1" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -401,20 +408,20 @@ "type": "tidelift" } ], - "time": "2021-10-28T20:44:15+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "doctrine/cache", - "version": "2.1.1", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", "shasum": "" }, "require": { @@ -424,18 +431,12 @@ "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "predis/predis": "~1.0", + "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.2 || ^6.0@dev", - "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "type": "library", "autoload": { @@ -484,7 +485,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.1.1" + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, "funding": [ { @@ -500,20 +501,20 @@ "type": "tidelift" } ], - "time": "2021-07-17T14:49:29+00:00" + "time": "2022-05-20T20:07:39+00:00" }, { "name": "doctrine/dbal", - "version": "3.5.1", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5" + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", - "reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/00d03067f07482f025d41ab55e4ba0db5eca2cdf", + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf", "shasum": "" }, "require": { @@ -526,16 +527,18 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "10.0.0", - "jetbrains/phpstorm-stubs": "2022.2", - "phpstan/phpstan": "1.8.10", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "9.5.25", - "psalm/plugin-phpunit": "0.17.0", - "squizlabs/php_codesniffer": "3.7.1", + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.35", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.13", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", - "vimeo/psalm": "4.29.0" + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -595,7 +598,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.5.1" + "source": "https://github.com/doctrine/dbal/tree/3.7.0" }, "funding": [ { @@ -611,29 +614,33 @@ "type": "tidelift" } ], - "time": "2022-10-24T07:26:18+00:00" + "time": "2023-09-26T20:56:55+00:00" }, { "name": "doctrine/deprecations", - "version": "v0.5.3", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", - "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0|^7.0|^8.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0", - "psr/log": "^1.0" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -652,43 +659,40 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2021-03-21T12:59:47+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/event-manager", - "version": "1.1.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "conflict": { - "doctrine/common": "<2.9@dev" + "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" + "Doctrine\\Common\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -732,7 +736,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" }, "funding": [ { @@ -748,29 +752,28 @@ "type": "tidelift" } ], - "time": "2020-05-29T18:28:51+00:00" + "time": "2022-10-12T20:59:15+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "2.9.2", + "version": "2.25.2", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "07475df6b4bf6277ae8b9cbbc94d0ac6fee5e726" + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/07475df6b4bf6277ae8b9cbbc94d0ac6fee5e726", - "reference": "07475df6b4bf6277ae8b9cbbc94d0ac6fee5e726", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", "shasum": "" }, "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.1" }, "conflict": { - "phpspec/prophecy": "<1.9.0", "zendframework/zend-diactoros": "*" }, "provide": { @@ -782,13 +785,12 @@ "ext-dom": "*", "ext-gd": "*", "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.8.0", - "laminas/laminas-coding-standard": "~1.0.0", - "php-http/psr7-integration-tests": "^1.1", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.1", - "psalm/plugin-phpunit": "^0.14.0", - "vimeo/psalm": "^4.3" + "http-interop/http-factory-tests": "^0.9.0", + "laminas/laminas-coding-standard": "^2.5", + "php-http/psr7-integration-tests": "^1.2", + "phpunit/phpunit": "^9.5.28", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.6" }, "type": "library", "extra": { @@ -847,38 +849,34 @@ "type": "community_bridge" } ], - "time": "2022-04-06T17:37:15+00:00" + "time": "2023-04-17T15:44:17+00:00" }, { "name": "laminas/laminas-httphandlerrunner", - "version": "1.5.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-httphandlerrunner.git", - "reference": "5f94e55d93f756e8ad07b9049aeb3d6d84582d0e" + "reference": "d3e84755a17e563b1c5f8290cbfb150210501a77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/5f94e55d93f756e8ad07b9049aeb3d6d84582d0e", - "reference": "5f94e55d93f756e8ad07b9049aeb3d6d84582d0e", + "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/d3e84755a17e563b1c5f8290cbfb150210501a77", + "reference": "d3e84755a17e563b1c5f8290cbfb150210501a77", "shasum": "" }, "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.3 || ~8.0.0 || ~8.1.0", - "psr/http-message": "^1.0", - "psr/http-message-implementation": "^1.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-message-implementation": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, - "replace": { - "zendframework/zend-httphandlerrunner": "^1.1.0" - }, "require-dev": { - "laminas/laminas-coding-standard": "~1.0.0", - "laminas/laminas-diactoros": "^2.8.0", - "phpunit/phpunit": "^9.5.9", - "psalm/plugin-phpunit": "^0.16.1", - "vimeo/psalm": "^4.10.0" + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-diactoros": "^3.0.0", + "phpunit/phpunit": "^10.1.2", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.11" }, "type": "library", "extra": { @@ -918,69 +916,7 @@ "type": "community_bridge" } ], - "time": "2021-09-22T09:17:54+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "7f049390b756d34ba5940a8fb47634fbb51f79ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/7f049390b756d34ba5940a8fb47634fbb51f79ab", - "reference": "7f049390b756d34ba5940a8fb47634fbb51f79ab", - "shasum": "" - }, - "require": { - "php": ">=7.4, <8.2" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.14", - "psalm/plugin-phpunit": "^0.15.2", - "squizlabs/php_codesniffer": "^3.6.2", - "vimeo/psalm": "^4.21.0" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2022-02-22T22:17:01+00:00" + "time": "2023-09-04T10:43:03+00:00" }, { "name": "league/container", @@ -1066,16 +1002,16 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.39", + "version": "2.8.41", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45" + "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/0fd6753003fc870f6e229bae869cc1337c99bc45", - "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", + "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", "shasum": "" }, "require": { @@ -1116,26 +1052,26 @@ ], "support": { "issues": "https://github.com/serbanghita/Mobile-Detect/issues", - "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.39" + "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.41" }, - "time": "2022-02-17T19:24:25+00:00" + "time": "2022-11-08T18:31:26+00:00" }, { "name": "psr/cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -1155,7 +1091,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -1165,9 +1101,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/container", @@ -1224,21 +1160,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1258,7 +1194,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -1270,27 +1206,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1310,7 +1246,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -1325,31 +1261,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -1378,27 +1314,27 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/http-server-handler", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1418,7 +1354,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side request handler", @@ -1434,28 +1370,27 @@ "server" ], "support": { - "issues": "https://github.com/php-fig/http-server-handler/issues", - "source": "https://github.com/php-fig/http-server-handler/tree/master" + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" }, - "time": "2018-10-30T16:46:14+00:00" + "time": "2023-04-10T20:06:20+00:00" }, { "name": "psr/http-server-middleware", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "type": "library", @@ -1476,7 +1411,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side middleware", @@ -1492,36 +1427,36 @@ ], "support": { "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/master" + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" }, - "time": "2018-10-30T17:12:04+00:00" + "time": "2023-04-11T06:14:47+00:00" }, { "name": "psr/log", - "version": "1.1.4", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "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/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1542,31 +1477,31 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/2.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:41:46+00:00" }, { "name": "psr/simple-cache", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1581,7 +1516,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for simple caching", @@ -1593,22 +1528,22 @@ "simple-cache" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" + "source": "https://github.com/php-fig/simple-cache/tree/2.0.0" }, - "time": "2017-10-23T01:57:42+00:00" + "time": "2021-10-29T13:22:09+00:00" }, { "name": "robmorgan/phinx", - "version": "0.12.10", + "version": "0.13.4", "source": { "type": "git", "url": "https://github.com/cakephp/phinx.git", - "reference": "ad056cff354fc67fedf9bf96c441c2b428afad0c" + "reference": "18e06e4a2b18947663438afd2f467e17c62e867d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/phinx/zipball/ad056cff354fc67fedf9bf96c441c2b428afad0c", - "reference": "ad056cff354fc67fedf9bf96c441c2b428afad0c", + "url": "https://api.github.com/repos/cakephp/phinx/zipball/18e06e4a2b18947663438afd2f467e17c62e867d", + "reference": "18e06e4a2b18947663438afd2f467e17c62e867d", "shasum": "" }, "require": { @@ -1679,44 +1614,40 @@ ], "support": { "issues": "https://github.com/cakephp/phinx/issues", - "source": "https://github.com/cakephp/phinx/tree/0.12.10" + "source": "https://github.com/cakephp/phinx/tree/0.13.4" }, - "time": "2022-01-21T19:53:14+00:00" + "time": "2023-01-07T00:42:55+00:00" }, { "name": "symfony/config", - "version": "v5.4.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "05624c386afa1b4ccc1357463d830fade8d9d404" + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/05624c386afa1b4ccc1357463d830fade8d9d404", - "reference": "05624c386afa1b4ccc1357463d830fade8d9d404", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", "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.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<4.4" + "symfony/finder": "<5.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": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -1744,7 +1675,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.7" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -1760,56 +1691,47 @@ "type": "tidelift" } ], - "time": "2022-03-21T13:42:03+00:00" + "time": "2023-07-19T20:22:16+00:00" }, { "name": "symfony/console", - "version": "v5.4.7", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/900275254f0a1a2afff1ab0e11abd5587a10e1d6", - "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "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": "^5.4|^6.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.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": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -1838,12 +1760,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.7" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -1859,29 +1781,29 @@ "type": "tidelift" } ], - "time": "2022-03-31T17:09:19+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -1910,7 +1832,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -1926,27 +1848,26 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.7", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -1974,7 +1895,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.7" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -1990,20 +1911,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T12:33:59+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.25.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -2018,7 +1939,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2056,7 +1977,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -2072,20 +1993,20 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -2097,7 +2018,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2137,7 +2058,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -2153,20 +2074,20 @@ "type": "tidelift" } ], - "time": "2021-11-23T21:10:46+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -2178,7 +2099,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2221,7 +2142,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -2237,20 +2158,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -2265,7 +2186,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2304,7 +2225,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -2320,44 +2241,45 @@ "type": "tidelift" } ], - "time": "2021-11-30T18:21:41+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.25.0", + "name": "symfony/service-contracts", + "version": "v3.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "3.4-dev" }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Contracts\\Service\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2374,16 +2296,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -2399,44 +2323,49 @@ "type": "tidelift" } ], - "time": "2021-06-05T21:20:04+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.25.0", + "name": "symfony/string", + "version": "v6.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" + "url": "https://github.com/symfony/string.git", + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, + "type": "library", "autoload": { "files": [ - "bootstrap.php" + "Resources/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Component\\String\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2444,10 +2373,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -2457,16 +2382,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -2482,319 +2409,72 @@ "type": "tidelift" } ], - "time": "2022-03-04T08:16:47+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.25.0", + "name": "twbs/bootstrap", + "version": "v5.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" + "url": "https://github.com/twbs/bootstrap.git", + "reference": "344e912d04b5b6a04482113eff20ab416ff01048" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/344e912d04b5b6a04482113eff20ab416ff01048", + "reference": "344e912d04b5b6a04482113eff20ab416ff01048", "shasum": "" }, - "require": { - "php": ">=7.1" + "replace": { + "twitter/bootstrap": "self.version" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Mark Otto", + "email": "markdotto@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jacob Thornton", + "email": "jacobthornton@gmail.com" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "homepage": "https://getbootstrap.com/", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "JS", + "css", + "framework", + "front-end", + "mobile-first", + "responsive", + "sass", + "web" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0" + "issues": "https://github.com/twbs/bootstrap/issues", + "source": "https://github.com/twbs/bootstrap/tree/v5.3.2" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-09-13T13:58:11+00:00" - }, + "time": "2023-09-14T14:19:27+00:00" + } + ], + "packages-dev": [ { - "name": "symfony/service-contracts", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "psr/container": "^2.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-30T19:17:58+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "twbs/bootstrap", - "version": "v5.1.3", - "source": { - "type": "git", - "url": "https://github.com/twbs/bootstrap.git", - "reference": "1a6fdfae6be09b09eaced8f0e442ca6f7680a61e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/1a6fdfae6be09b09eaced8f0e442ca6f7680a61e", - "reference": "1a6fdfae6be09b09eaced8f0e442ca6f7680a61e", - "shasum": "" - }, - "replace": { - "twitter/bootstrap": "self.version" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Otto", - "email": "markdotto@gmail.com" - }, - { - "name": "Jacob Thornton", - "email": "jacobthornton@gmail.com" - } - ], - "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", - "homepage": "https://getbootstrap.com/", - "keywords": [ - "JS", - "css", - "framework", - "front-end", - "mobile-first", - "responsive", - "sass", - "web" - ], - "support": { - "issues": "https://github.com/twbs/bootstrap/issues", - "source": "https://github.com/twbs/bootstrap/tree/v5.1.3" - }, - "time": "2021-10-09T06:43:19+00:00" - } - ], - "packages-dev": [ - { - "name": "brick/varexporter", - "version": "0.3.5", + "name": "brick/varexporter", + "version": "0.3.8", "source": { "type": "git", "url": "https://github.com/brick/varexporter.git", - "reference": "05241f28dfcba2b51b11e2d750e296316ebbe518" + "reference": "b5853edea6204ff8fa10633c3a4cccc4058410ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/varexporter/zipball/05241f28dfcba2b51b11e2d750e296316ebbe518", - "reference": "05241f28dfcba2b51b11e2d750e296316ebbe518", + "url": "https://api.github.com/repos/brick/varexporter/zipball/b5853edea6204ff8fa10633c3a4cccc4058410ed", + "reference": "b5853edea6204ff8fa10633c3a4cccc4058410ed", "shasum": "" }, "require": { @@ -2804,7 +2484,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^8.5 || ^9.0", - "vimeo/psalm": "4.4.1" + "vimeo/psalm": "4.23.0" }, "type": "library", "autoload": { @@ -2822,28 +2502,35 @@ ], "support": { "issues": "https://github.com/brick/varexporter/issues", - "source": "https://github.com/brick/varexporter/tree/0.3.5" + "source": "https://github.com/brick/varexporter/tree/0.3.8" }, - "time": "2021-02-10T13:53:07+00:00" + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-21T23:05:38+00:00" }, { "name": "cakephp/bake", - "version": "2.7.0", + "version": "2.9.3", "source": { "type": "git", "url": "https://github.com/cakephp/bake.git", - "reference": "3933caa0941b2f75f3e53c5456efdbf588917584" + "reference": "a9b02fb6a5f96e8fb9887be55cccea501468907b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/bake/zipball/3933caa0941b2f75f3e53c5456efdbf588917584", - "reference": "3933caa0941b2f75f3e53c5456efdbf588917584", + "url": "https://api.github.com/repos/cakephp/bake/zipball/a9b02fb6a5f96e8fb9887be55cccea501468907b", + "reference": "a9b02fb6a5f96e8fb9887be55cccea501468907b", "shasum": "" }, "require": { "brick/varexporter": "^0.3.5", "cakephp/cakephp": "^4.3.0", "cakephp/twig-view": "^1.0.2", + "nikic/php-parser": "^4.13.2", "php": ">=7.2" }, "require-dev": { @@ -2880,25 +2567,25 @@ "issues": "https://github.com/cakephp/bake/issues", "source": "https://github.com/cakephp/bake" }, - "time": "2022-04-14T08:50:07+00:00" + "time": "2023-03-18T19:26:16+00:00" }, { "name": "cakephp/cakephp-codesniffer", - "version": "4.5.1", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp-codesniffer.git", - "reference": "6b17905db024b8d7e64a15296688545c61ab6694" + "reference": "24fa2321d54e5251ac2f59dd92dd2066f0b0bdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/6b17905db024b8d7e64a15296688545c61ab6694", - "reference": "6b17905db024b8d7e64a15296688545c61ab6694", + "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/24fa2321d54e5251ac2f59dd92dd2066f0b0bdae", + "reference": "24fa2321d54e5251ac2f59dd92dd2066f0b0bdae", "shasum": "" }, "require": { "php": ">=7.2.0", - "slevomat/coding-standard": "^6.3.6 || ^7.0", + "slevomat/coding-standard": "^7.0 || ^8.0", "squizlabs/php_codesniffer": "^3.6" }, "require-dev": { @@ -2932,28 +2619,28 @@ "issues": "https://github.com/cakephp/cakephp-codesniffer/issues", "source": "https://github.com/cakephp/cakephp-codesniffer" }, - "time": "2021-07-11T04:47:47+00:00" + "time": "2023-04-10T06:35:04+00:00" }, { "name": "cakephp/debug_kit", - "version": "4.7.1", + "version": "4.9.4", "source": { "type": "git", "url": "https://github.com/cakephp/debug_kit.git", - "reference": "ce564bacca4ebf471c34a886741672b54328b382" + "reference": "663491edec4a6b9111f1cf4733ebd471450df71e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/ce564bacca4ebf471c34a886741672b54328b382", - "reference": "ce564bacca4ebf471c34a886741672b54328b382", + "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/663491edec4a6b9111f1cf4733ebd471450df71e", + "reference": "663491edec4a6b9111f1cf4733ebd471450df71e", "shasum": "" }, "require": { - "cakephp/cakephp": "^4.3.0", + "cakephp/cakephp": "^4.4.0", "cakephp/chronos": "^2.0", "composer/composer": "^1.3 | ^2.0", "jdorn/sql-formatter": "^1.2", - "php": ">=7.2" + "php": ">=7.4" }, "require-dev": { "cakephp/authorization": "^2.0", @@ -2993,12 +2680,12 @@ "kit" ], "support": { - "forum": "http://stackoverflow.com/tags/cakephp", + "forum": "https://stackoverflow.com/tags/cakephp", "irc": "irc://irc.freenode.org/cakephp", "issues": "https://github.com/cakephp/debug_kit/issues", "source": "https://github.com/cakephp/debug_kit" }, - "time": "2022-01-20T02:44:41+00:00" + "time": "2023-07-05T16:04:04+00:00" }, { "name": "cakephp/repl", @@ -3120,47 +2807,123 @@ }, "time": "2021-09-17T14:07:52+00:00" }, + { + "name": "composer/class-map-generator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.1.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-06-30T13:58:57+00:00" + }, { "name": "composer/composer", - "version": "2.3.5", + "version": "2.6.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "50c47b1f907cfcdb8f072b88164d22b527557ae1" + "reference": "ff477832e6d838a736556d4a39a3b80f4412abfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/50c47b1f907cfcdb8f072b88164d22b527557ae1", - "reference": "50c47b1f907cfcdb8f072b88164d22b527557ae1", + "url": "https://api.github.com/repos/composer/composer/zipball/ff477832e6d838a736556d4a39a3b80f4412abfd", + "reference": "ff477832e6d838a736556d4a39a3b80f4412abfd", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", + "composer/pcre": "^2.1 || ^3.1", + "composer/semver": "^3.2.5", + "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "react/promise": "^2.8 || ^3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", - "symfony/console": "^5.4.1 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/filesystem": "^5.4 || ^6.0 || ^7", + "symfony/finder": "^5.4 || ^6.0 || ^7", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "symfony/polyfill-php81": "^1.24", + "symfony/process": "^5.4 || ^6.0 || ^7" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan": "^1.9.3", "phpstan/phpstan-deprecation-rules": "^1", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0 || ^7" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -3173,12 +2936,17 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.6-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\": "src/Composer/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3207,7 +2975,8 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.3.5" + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.6.3" }, "funding": [ { @@ -3223,7 +2992,7 @@ "type": "tidelift" } ], - "time": "2022-04-13T14:43:00+00:00" + "time": "2023-09-15T07:38:22+00:00" }, { "name": "composer/metadata-minifier", @@ -3296,16 +3065,16 @@ }, { "name": "composer/pcre", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "shasum": "" }, "require": { @@ -3347,7 +3116,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "source": "https://github.com/composer/pcre/tree/3.1.0" }, "funding": [ { @@ -3363,20 +3132,20 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2022-11-17T09:50:14+00:00" }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -3426,9 +3195,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -3444,20 +3213,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.6", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "a30d487169d799745ca7280bc90fdfa693536901" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a30d487169d799745ca7280bc90fdfa693536901", - "reference": "a30d487169d799745ca7280bc90fdfa693536901", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { @@ -3508,7 +3277,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.6" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -3524,7 +3293,7 @@ "type": "tidelift" } ], - "time": "2021-11-18T10:14:14+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -3594,35 +3363,38 @@ }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.2", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", "shasum": "" }, "require": { "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3", + "php": ">=5.4", "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" }, "require-dev": { "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0" + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", "extra": { - "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, "autoload": { "psr-4": { - "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3638,7 +3410,7 @@ }, { "name": "Contributors", - "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", @@ -3662,37 +3434,37 @@ "tests" ], "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2022-02-04T12:51:07+00:00" + "time": "2023-01-05T11:28:13+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^11", "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.22" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -3719,7 +3491,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -3735,7 +3507,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { "name": "jasny/twig-extensions", @@ -3851,7 +3623,7 @@ ], "support": { "issues": "https://github.com/jdorn/sql-formatter/issues", - "source": "https://github.com/jdorn/sql-formatter/tree/master" + "source": "https://github.com/jdorn/sql-formatter/tree/v1.2.17" }, "time": "2014-01-12T16:20:24+00:00" }, @@ -4046,16 +3818,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -4093,7 +3865,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -4101,20 +3873,20 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.2", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -4155,9 +3927,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2021-11-30T19:35:32+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phar-io/manifest", @@ -4261,263 +4033,39 @@ "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" + } ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2021-12-08T12:19:24+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.4.5", + "version": "1.24.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "129a63b3bc7caeb593c224c41f420675e63cfefc" + "reference": "bcad8d995980440892759db0c32acae7c8e79442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/129a63b3bc7caeb593c224c41f420675e63cfefc", - "reference": "129a63b3bc7caeb593c224c41f420675e63cfefc", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" @@ -4537,22 +4085,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.4.5" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" }, - "time": "2022-04-22T11:11:01+00:00" + "time": "2023-09-26T12:28:12+00:00" }, { "name": "phpstan/phpstan", - "version": "0.12.99", + "version": "0.12.100", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7" + "reference": "48236ddf823547081b2b153d1cd2994b784328c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b4d40f1d759942f523be267a1bab6884f46ca3f7", - "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/48236ddf823547081b2b153d1cd2994b784328c3", + "reference": "48236ddf823547081b2b153d1cd2994b784328c3", "shasum": "" }, "require": { @@ -4583,7 +4131,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/0.12.99" + "source": "https://github.com/phpstan/phpstan/tree/0.12.100" }, "funding": [ { @@ -4594,36 +4142,32 @@ "url": "https://github.com/phpstan", "type": "github" }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, { "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", "type": "tidelift" } ], - "time": "2021-09-12T20:09:55+00:00" + "time": "2022-11-01T09:52:08+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.15", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -4638,8 +4182,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -4672,7 +4216,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -4680,7 +4225,7 @@ "type": "github" } ], - "time": "2022-03-07T09:28:20+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4925,20 +4470,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.20", + "version": "9.6.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -4949,31 +4494,26 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -4981,7 +4521,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -5012,7 +4552,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { @@ -5022,22 +4563,26 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-04-01T12:37:26+00:00" + "time": "2023-09-19T05:39:22+00:00" }, { "name": "psy/psysh", - "version": "v0.11.2", + "version": "v0.11.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "7f7da640d68b9c9fec819caae7c744a213df6514" + "reference": "bcb22101107f3bf770523b65630c9d547f60c540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/7f7da640d68b9c9fec819caae7c744a213df6514", - "reference": "7f7da640d68b9c9fec819caae7c744a213df6514", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", + "reference": "bcb22101107f3bf770523b65630c9d547f60c540", "shasum": "" }, "require": { @@ -5052,15 +4597,13 @@ "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.05.02" + "bamarni/composer-bin-plugin": "^1.2" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." }, "bin": [ "bin/psysh" @@ -5069,6 +4612,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -5100,29 +4647,30 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.2" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" }, - "time": "2022-02-28T15:28:54+00:00" + "time": "2023-09-17T21:15:54+00:00" }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.10.20 || 1.4.10", + "phpunit/phpunit": "^9.5 || ^7.5" }, "type": "library", "autoload": { @@ -5166,19 +4714,15 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v3.0.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-07-11T16:12:49+00:00" }, { "name": "sebastian/cli-parser", @@ -5349,16 +4893,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -5411,7 +4955,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -5419,7 +4963,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -5480,16 +5024,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -5534,7 +5078,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -5542,20 +5086,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -5597,7 +5141,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -5605,20 +5149,20 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -5674,7 +5218,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -5682,20 +5226,20 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -5738,7 +5282,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -5746,7 +5290,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -5919,16 +5463,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -5967,10 +5511,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -5978,7 +5522,7 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", @@ -6037,16 +5581,16 @@ }, { "name": "sebastian/type", - "version": "3.0.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { @@ -6058,7 +5602,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -6081,7 +5625,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -6089,7 +5633,7 @@ "type": "github" } ], - "time": "2022-03-15T09:54:48+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -6146,16 +5690,16 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -6193,48 +5737,353 @@ "validator" ], "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2023-05-11T13:16:46+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" + } + ], + "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/signal-handler", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "shasum": "" + }, + "require": { + "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-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" + }, + "time": "2023-09-03T09:24:00+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "8.13.4", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4b2af2fb17773656d02fbfb5d18024ebd19fe322", + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.23.0", + "squizlabs/php_codesniffer": "^3.7.1" + }, + "require-dev": { + "phing/phing": "2.17.4", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.10.26", + "phpstan/phpstan-deprecation-rules": "1.1.3", + "phpstan/phpstan-phpunit": "1.3.13", + "phpstan/phpstan-strict-rules": "1.5.1", + "phpunit/phpunit": "7.5.20|8.5.21|9.6.8|10.2.6" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.13.4" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2023-07-25T10:28:55+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.7.2", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2023-02-22T23:07:41+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { - "url": "https://github.com/Seldaek", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { - "name": "seld/phar-utils", - "version": "1.2.0", + "name": "symfony/polyfill-php73", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee", - "reference": "9f3452c93ff423469c0d56450431562ca423dcee", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Seld\\PharUtils\\": "src/" - } + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6242,163 +6091,160 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHAR file format utilities, for when PHP phars you up", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "phar" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, - "time": "2021-12-10T11:20:11+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "slevomat/coding-standard", - "version": "7.1", + "name": "symfony/polyfill-php80", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/slevomat/coding-standard.git", - "reference": "b521bd358b5f7a7d69e9637fd139e036d8adeb6f" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/b521bd358b5f7a7d69e9637fd139e036d8adeb6f", - "reference": "b521bd358b5f7a7d69e9637fd139e036d8adeb6f", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", - "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": "^1.4.1", - "squizlabs/php_codesniffer": "^3.6.2" - }, - "require-dev": { - "phing/phing": "2.17.2", - "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.4.10|1.5.2", - "phpstan/phpstan-deprecation-rules": "1.0.0", - "phpstan/phpstan-phpunit": "1.0.0|1.1.0", - "phpstan/phpstan-strict-rules": "1.1.0", - "phpunit/phpunit": "7.5.20|8.5.21|9.5.19" + "php": ">=7.1" }, - "type": "phpcodesniffer-standard", + "type": "library", "extra": { "branch-alias": { - "dev-master": "7.x-dev" + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard" - } + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/7.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { - "url": "https://github.com/kukulich", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-03-29T12:44:16+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "squizlabs/php_codesniffer", - "version": "3.6.2", + "name": "symfony/polyfill-php81", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "php": ">=7.1" }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2021-12-12T21:44:58+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.4.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" }, - "type": "library", "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -6407,18 +6253,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.3" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -6434,25 +6286,24 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:34:36+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/process", - "version": "v5.4.7", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/38a44b2517b470a436e1c944bf9b9ba3961137fb", - "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -6480,7 +6331,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.7" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -6496,43 +6347,38 @@ "type": "tidelift" } ], - "time": "2022-03-18T16:18:52+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.6", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0", - "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^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" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -6569,7 +6415,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -6585,7 +6431,7 @@ "type": "tidelift" } ], - "time": "2022-03-02T12:42:23+00:00" + "time": "2023-08-24T14:51:05+00:00" }, { "name": "theseer/tokenizer", @@ -6639,16 +6485,16 @@ }, { "name": "twig/markdown-extra", - "version": "v3.3.8", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "25ed505b6ffd3b00f922ca682489dfbaf44eb1f7" + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/25ed505b6ffd3b00f922ca682489dfbaf44eb1f7", - "reference": "25ed505b6ffd3b00f922ca682489dfbaf44eb1f7", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/83dfa86a0379f784ea30bdb9c15a356b8aabf780", + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780", "shasum": "" }, "require": { @@ -6659,15 +6505,10 @@ "erusev/parsedown": "^1.7", "league/commonmark": "^1.0|^2.0", "league/html-to-markdown": "^4.8|^5.0", - "michelf/php-markdown": "^1.8", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "michelf/php-markdown": "^1.8|^2.0", + "symfony/phpunit-bridge": "^5.4|^6.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, "autoload": { "psr-4": { "Twig\\Extra\\Markdown\\": "" @@ -6696,7 +6537,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.3.8" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.7.1" }, "funding": [ { @@ -6708,20 +6549,20 @@ "type": "tidelift" } ], - "time": "2022-01-29T15:34:05+00:00" + "time": "2023-07-29T15:34:56+00:00" }, { "name": "twig/twig", - "version": "v3.3.10", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "8442df056c51b706793adf80a9fd363406dd3674" + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/8442df056c51b706793adf80a9fd363406dd3674", - "reference": "8442df056c51b706793adf80a9fd363406dd3674", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", "shasum": "" }, "require": { @@ -6730,15 +6571,10 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, "autoload": { "psr-4": { "Twig\\": "src/" @@ -6772,7 +6608,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.3.10" + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" }, "funding": [ { @@ -6784,65 +6620,7 @@ "type": "tidelift" } ], - "time": "2022-04-06T06:47:41+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" + "time": "2023-08-28T11:09:02+00:00" } ], "aliases": [], @@ -6854,5 +6632,5 @@ "php": ">=7.3" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } diff --git a/app/config/VERSION b/app/config/VERSION index 524cb5524..26aaba0e8 100644 --- a/app/config/VERSION +++ b/app/config/VERSION @@ -1 +1 @@ -1.1.1 +1.2.0 diff --git a/app/config/app.php b/app/config/app.php index 8ab241079..cb4993ef9 100644 --- a/app/config/app.php +++ b/app/config/app.php @@ -207,7 +207,7 @@ */ 'Error' => [ 'errorLevel' => E_ALL, - 'exceptionRenderer' => ExceptionRenderer::class, + //'exceptionRenderer' => ExceptionRenderer::class, 'skipLog' => [], 'log' => true, 'trace' => true, diff --git a/app/config/bootstrap.php b/app/config/bootstrap.php index f93d37b82..131f566c8 100644 --- a/app/config/bootstrap.php +++ b/app/config/bootstrap.php @@ -37,8 +37,8 @@ use Cake\Database\TypeFactory; use Cake\Database\Type\StringType; use Cake\Datasource\ConnectionManager; -use Cake\Error\ConsoleErrorHandler; -use Cake\Error\ErrorHandler; +use Cake\Error\ErrorTrap; +use Cake\Error\ExceptionTrap; use Cake\Http\ServerRequest; use Cake\Log\Log; use Cake\Mailer\Mailer; @@ -128,11 +128,8 @@ * Register application error and exception handlers. */ $isCli = PHP_SAPI === 'cli'; -if ($isCli) { - (new ConsoleErrorHandler(Configure::read('Error')))->register(); -} else { - (new ErrorHandler(Configure::read('Error')))->register(); -} +(new ErrorTrap(Configure::read('Error')))->register(); +(new ExceptionTrap(Configure::read('Error')))->register(); /* * Include the CLI bootstrap overrides. diff --git a/app/config/schema/schema.json b/app/config/schema/schema.json index c452fa493..ab55b0b68 100644 --- a/app/config/schema/schema.json +++ b/app/config/schema/schema.json @@ -162,7 +162,6 @@ "index_display": { "type": "boolean" }, "alphanumeric": { "type": "boolean" }, "case_sensitive": { "type": "boolean" }, - "invalidates": { "type": "boolean" }, "null_equivalents": { "type": "boolean" }, "search_distance": { "type": "integer" }, "search_exact": { "type": "boolean" }, @@ -230,6 +229,7 @@ "id": {}, "matchgrid_id": {}, "label": { "type": "string", "size": 64 }, + "trust_mode": { "type": "string", "size": 2 }, "resolution_mode": { "type": "string", "size": 2 }, "notification_email": { "type": "string", "size": 80 } }, diff --git a/app/resources/locales/en_US/default.po b/app/resources/locales/en_US/default.po index c23fc6236..4893d51d8 100644 --- a/app/resources/locales/en_US/default.po +++ b/app/resources/locales/en_US/default.po @@ -53,6 +53,9 @@ msgid "match.banner.api_users.platform" msgstr "This page is for configuring Platform API Users, which have full read/write access to the entire platform. To create API Users restricted to a given Matchgrid, go to the management page for the desired Matchgrid and select API Users from there.
The Match API is available at {0}" ### Command Line text +msgid "match.cmd.arg.version" +msgstr "Version to upgrade to (default: current RELEASE)" + msgid "match.cmd.bl.index.off" msgstr "Dropping matchgrid indexes..." @@ -83,12 +86,21 @@ msgstr "Username of initial platform administrator" msgid "match.cmd.opt.force" msgstr "Force a rerun of setup (only if you know what you are doing)" +msgid "match.cmd.opt.forcecurrent" +msgstr "Force the specified current version -- ADVANCED USERS ONLY" + msgid "match.cmd.opt.not" msgstr "Calculate changes but do not apply" msgid "match.cmd.opt.skip-match" msgstr "Do not run Match Rules while processing records" +msgid "match.cmd.opt.skipdatabase" +msgstr "Skip database schema update -- ADVANCED USERS ONLY" + +msgid "match.cmd.opt.skipvalidation" +msgstr "Skip version validation -- ADVANCED USERS ONLY" + msgid "match.cmd.se.admin" msgstr "- Creating initial administrator permission" @@ -101,6 +113,24 @@ msgstr "Setup appears to have already run" msgid "match.cmd.se.salt" msgstr "- Generating salt file" +msgid "match.cmd.ug.current" +msgstr "Current version: {0}" + +msgid "match.cmd.ug.ok" +msgstr "Upgrade completed successfully" + +msgid "match.cmd.ug.post" +msgstr "Executing post-database step ({0})" + +msgid "match.cmd.ug.pre" +msgstr "Executing pre-database step ({0})" + +msgid "match.cmd.ug.target" +msgstr "Target version: {0}" + +msgid "match.cmd.ug.120.trust_mode" +msgstr "- Populating default values for trust_mode" + ### Controllers (Models) msgid "match.ct.ApiUsers" msgstr "{0,plural,=1{API User} other{API Users}}" @@ -230,6 +260,9 @@ msgstr "Exact" msgid "match.en.SearchTypeEnum.M" msgstr "Mapping" +msgid "match.en.SearchTypeEnum.IN" +msgstr "Invalidate" + msgid "match.en.SearchTypeEnum.X" msgstr "Skip" @@ -245,6 +278,15 @@ msgstr "Suspended" msgid "match.en.StatusEnum.S.badge" msgstr "Danger" +msgid "match.en.TrustModeEnum.P" +msgstr "Potential" + +msgid "match.en.TrustModeEnum.S" +msgstr "Standard" + +msgid "match.en.TrustModeEnum.T" +msgstr "Trust" + ### Error Messages msgid "match.er.args" msgstr "Incorrect arguments provided to {0}" @@ -258,6 +300,21 @@ msgstr "Error at line {0}: {1}" msgid "match.er.build" msgstr "Error applying matchgrid schema: {0}" +msgid "match.er.cmd.ug.blocked" +msgstr "Cannot automatically upgrade past version {0}. Please upgrade to that version first." + +msgid "match.er.cmd.ug.fail" +msgstr "ERROR: Upgrade failed" + +msgid "match.er.cmd.ug.order" +msgstr "Target version is before current version (cannot downgrade)" + +msgid "match.er.cmd.ug.same" +msgstr "Current and target versions are the same" + +msgid "match.er.cmd.ug.version" +msgstr "Unknown version \"{0}\"" + msgid "match.er.db.connect" msgstr "Failed to connect to database: {0}" @@ -438,9 +495,6 @@ msgstr "ID" msgid "match.fd.index_display" msgstr "Display Field in Matchgrid Index" -msgid "match.fd.invalidates" -msgstr "Invalidates" - msgid "match.fd.label" msgstr "Label" @@ -561,6 +615,9 @@ msgstr "Table Name" msgid "match.fd.table_name.desc" msgstr "Unique name for matchgrid, must be a valid SQL identifier (will be prefixed mg_ for actual table name)" +msgid "match.fd.trust_mode" +msgstr "Trust Mode" + msgid "match.fd.url" msgstr "URL" @@ -813,3 +870,6 @@ msgstr "Matchgrid: {0}" msgid "match.ti.properties" msgstr "Properties" + +msgid "match.ti.user" +msgstr "User" diff --git a/app/src/Command/UpgradeVersionCommand.php b/app/src/Command/UpgradeVersionCommand.php new file mode 100644 index 000000000..11fafc18d --- /dev/null +++ b/app/src/Command/UpgradeVersionCommand.php @@ -0,0 +1,307 @@ + ['block' => false], + "1.1.0" => ['block' => false], + "1.2.0" => ['block' => false, 'post' => 'post120'] + ]; + + // ConsoleIo + protected $io = null; + + /** + * Register command specific options. + * + * @since COmanage Match v1.2.0 + * @param ConsoleOptionParser $parser Console Option Parser + * @return ConsoleOptionParser Console Option Parser + */ + + public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { + $parser->addArgument( + 'version', + [ + 'help' => __('match.cmd.arg.version'), + 'required' => false + ] + )->addOption( + 'forcecurrent', + [ + 'short' => 'f', + 'help' => __('match.cmd.opt.forcecurrent'), + 'boolean' => false, + 'default' => false + ] + )->addOption( + 'skipdatabase', + [ + 'short' => 'D', + 'help' => __('match.cmd.opt.skipdatabase'), + 'boolean' => true, + 'default' => false + ] + )->addOption( + 'skipvalidation', + [ + 'short' => 'X', + 'help' => __('match.cmd.opt.skipvalidation'), + 'boolean' => false, + 'default' => false + ] + ); + + return $parser; + } + + /** + * Execute the Upgrade Version Command. + * + * @since COmanage Match v1.0.0 + * @param Arguments $args Command Arguments + * @param ConsoleIo $io Console IO + */ + + public function execute(Arguments $args, ConsoleIo $io) { + global $argv; + + $this->io = $io; + + // Determine the (PHP) code version (or use the one passed in) + $targetVersion = $args->getArgument('version'); + + if(!$targetVersion) { + // Read the current release from the VERSION file + $versionFile = CONFIG . DS . "VERSION"; + + $targetVersion = rtrim(file_get_contents($versionFile)); + } + + // Pull the current database version (or use the one passed in) + $Meta = $this->getTableLocator()->get('Meta'); + $currentVersion = $args->getOption('forcecurrent'); + + if(!$currentVersion) { + $currentVersion = $Meta->getUpgradeVersion(); + } + + $io->out(__('match.cmd.ug.current', [$currentVersion])); + $io->out(__('match.cmd.ug.target', [$targetVersion])); + + if(!$args->getOption('skipvalidation')) { + // Validate the version path + try { + $this->validateVersions($currentVersion, $targetVersion); + } + catch(\Exception $e) { + $io->out($e->getMessage()); + $io->out(__('match.er.cmd.ug.fail')); + return; + } + } + + // Run appropriate pre-database steps + + $fromFound = false; + + foreach($this->versions as $version => $params) { + if($version == $currentVersion) { + // Note we don't actually want to run the steps for $currentVersion + $fromFound = true; + continue; + } + + if(!$fromFound) { + // We haven't reached the from version yet + continue; + } + + if(isset($params['pre'])) { + $fn = $params['pre']; + + $io->out(__('match.cmd.ug.post', [$fn])); + $this->$fn(); + } + + if($version == $targetVersion) { + // We're done + break; + } + } + + if(!$args->getOption('skipdatabase')) { + // Call database shell + $this->executeCommand(DatabaseCommand::class); + } + + // Run appropriate post-database steps + + $fromFound = false; + + foreach($this->versions as $version => $params) { + if($version == $currentVersion) { + // Note we don't actually want to run the steps for $currentVersion + $fromFound = true; + continue; + } + + if(!$fromFound) { + // We haven't reached the from version yet + continue; + } + + if(isset($params['post'])) { + $fn = $params['post']; + + $io->out(__('match.cmd.ug.post', [$fn])); + $this->$fn(); + } + + if($version == $targetVersion) { + // We're done + break; + } + } + + // Now that we're done, update the current version + $Meta->setUpgradeVersion($targetVersion); + + $io->out(__('match.cmd.ug.ok')); + + return; + } + + /** + * Process post-upgrade steps for v1.2.0. + * + * @since COmanage Match v1.2.0 + */ + + protected function post120() { + // Set all Systems of Record to operate in Standard Trust Mode, which is + // the effective behavior prior to v1.2.0. + + $this->io->out(__('match.cmd.ug.120.trust_mode')); + $this->setNewDefault('SystemsOfRecord', 'trust_mode', 'S'); + } + + /** + * Set a new value for all rows in a column. $value will replace any null + * entries, but not any entries already set. + * + * @since COmanage Match v1.2.0 + * @param string $table Table name, in StudlyCap format + * @param string $column Column name + * @param string $value New default value + */ + + protected function setNewDefault(string $table, string $column, string $value) { + $Table = $this->getTableLocator()->get($table); + + $Table->query() + ->update() + ->set([$column => $value]) + ->where(["$column IS NULL"]) + ->execute(); + } + + /** + * Validate the requested from and to versions. + * + * @since COmanage Match v1.2.0 + * @param string $from "From" version (current database) + * @param string $to "To" version (current codebase) + * @return bool true if the requested range is valid + * @throws InvalidArgumentException + */ + + protected function validateVersions(string $from, string $to): bool { + // First make sure these are valid versions + + if(!array_key_exists($from, $this->versions)) { + throw new \InvalidArgumentException(__('match.er.cmd.ug.version', [$from])); + } + + if(!array_key_exists($to, $this->versions)) { + throw new \InvalidArgumentException(__('match.er.cmd.ug.version', [$to])); + } + + // If $from and $to are the same, nothing to do. + + if($from == $to) { + throw new \InvalidArgumentException(__('match.er.cmd.ug.same')); + } + + // Walk through the version array and check our version path + + $fromFound = false; + + foreach($this->versions as $version => $params) { + $blocks = $params['block']; + + if($version == $from) { + $fromFound = true; + } elseif($version == $to) { + if(!$fromFound) { + // Can't downgrade ($from must preceed $to) + throw new \InvalidArgumentException(__('match.er.cmd.ug.order')); + } else { + // We're good to go + break; + } + } else { + if($fromFound && $blocks) { + // We can't pass a blocker version + throw new \InvalidArgumentException(__('match.er.cmd.ug.blocked', [$version])); + } + } + } + + return true; + } +} \ No newline at end of file diff --git a/app/src/Controller/AppController.php b/app/src/Controller/AppController.php index ed4ca306e..340e090b3 100644 --- a/app/src/Controller/AppController.php +++ b/app/src/Controller/AppController.php @@ -72,8 +72,6 @@ public function initialize(): void { ], ]); - $this->loadComponent('Paginator'); - /* * Enable the following components for recommended CakePHP security settings. * see https://book.cakephp.org/3.0/en/controllers/components/security.html diff --git a/app/src/Controller/StandardController.php b/app/src/Controller/StandardController.php index 62ed41730..92f2b9806 100644 --- a/app/src/Controller/StandardController.php +++ b/app/src/Controller/StandardController.php @@ -80,6 +80,21 @@ public function add() { $this->render('/Standard/add-edit-view'); } + /** + * Standard operations before the view is rendered. + * + * @since COmanage Match v1.2.0 + * @param EventInterface $event BeforeRender event + * @return \Cake\Http\Response HTTP Response + */ + + public function beforeRender(\Cake\Event\EventInterface $event) { + // Provide some hints to the views + $this->getFieldTypes(); + + return parent::beforeRender($event); + } + /** * Handle a delete action for a Standard object. * @@ -294,6 +309,29 @@ public function generateRedirect() { return $this->redirect($redirect); } + /** + * Make a list of fields types suitable for FieldHelper + * + * @since COmanage Match v1.2.0 + */ + + protected function getFieldTypes() { + // $this->name = Models (ie: from ModelsTable) + $modelsName = $this->name; + // $table = the actual table object + $table = $this->$modelsName; + + $schema = $table->getSchema(); + + // We don't pass the schema object as is, partly because cake might change it + // and partly to simplify access to the parts the views (FieldHelper, really) + // actually need. + + // Note the schema does have field lengths for strings, but typeMap + // doesn't return them and we're not doing anything with them at the moment. + $this->set('vv_field_types', $schema->typeMap()); + } + /** * Generate an index for a set of Standard Objects. * @@ -367,7 +405,7 @@ public function index() { // but it doesn't seem to work in Cake 3/4. So we just use $this->pagination // ourselves here. - $this->set($tableName, $this->Paginator->paginate($query, $this->pagination)); + $this->set($tableName, $this->paginate($query, $this->pagination)); $this->set('vv_tablename', $tableName); $this->set('vv_modelname', $modelsName); diff --git a/app/src/Lib/Enum/SearchTypeEnum.php b/app/src/Lib/Enum/SearchTypeEnum.php index 5e97df6a1..11f802990 100644 --- a/app/src/Lib/Enum/SearchTypeEnum.php +++ b/app/src/Lib/Enum/SearchTypeEnum.php @@ -30,9 +30,10 @@ namespace App\Lib\Enum; class SearchTypeEnum extends StandardEnum { - const Distance = 'D'; - const Exact = 'E'; - const Mapping = 'M'; - const Skip = 'X'; - const Substring = 'S'; + const Distance = 'D'; + const Exact = 'E'; + const Invalidate = "IN"; + const Mapping = 'M'; + const Skip = 'X'; + const Substring = 'S'; } \ No newline at end of file diff --git a/app/src/Lib/Enum/StandardEnum.php b/app/src/Lib/Enum/StandardEnum.php index 7cd256aae..43a48218a 100644 --- a/app/src/Lib/Enum/StandardEnum.php +++ b/app/src/Lib/Enum/StandardEnum.php @@ -55,4 +55,20 @@ public static function getLocalizedConsts() { return $ret; } + + /** + * Get the values for the constants in the Enumeration. + * + * @since COmanage Match v1.2.0 + * @return array Array of enumeration values + */ + + public static function getConstValues() : array { + // Get the keys for this enum + $reflect = new ReflectionClass(get_called_class()); + + $consts = $reflect->getConstants(); + + return array_values($consts); + } } \ No newline at end of file diff --git a/app/src/Lib/Enum/TrustModeEnum.php b/app/src/Lib/Enum/TrustModeEnum.php new file mode 100644 index 000000000..8544a7f5b --- /dev/null +++ b/app/src/Lib/Enum/TrustModeEnum.php @@ -0,0 +1,36 @@ +setConfidenceMode($mode); @@ -622,7 +625,9 @@ protected function search(string $mode, ]; foreach($rule->rule_attributes as $ruleattr) { - if($ruleattr->search_type == SearchTypeEnum::Skip) { + if($ruleattr->search_type == SearchTypeEnum::Skip + // We skip invalidate rules as well, these are handled in searchReferenceId() + || $ruleattr->search_type == SearchTypeEnum::Invalidate) { continue; } @@ -757,6 +762,11 @@ protected function search(string $mode, $vals = []; + if($skipSor) { + $sql .= " AND sor <> ?"; + $vals[] = $sor; + } + foreach(array_keys($attrSql['sql']) as $attrId) { if(count($attrSql['sql'][$attrId]) > 1) { // We OR together all of the clauses @@ -821,14 +831,119 @@ protected function search(string $mode, */ public function searchReferenceId(string $sor, string $sorid, AttributeManager $attributes) { + // Before we start, pull the SystemOfRecord configuration. + + $SystemsOfRecord = TableRegistry::getTableLocator()->get('SystemsOfRecord'); + + $trustMode = $SystemsOfRecord->getTrustMode($this->mgConfig->id, $sor); + $sorMatch = null; // Only used if TrustMode == Potential + + if($trustMode == TrustModeEnum::Trust) { + Log::write('debug', $sor . "/" . $sorid . " Trust Mode enabled, ignoring existing records in the same SOR"); + } + // First try canonical matches - $canonicalMatches = $this->search(ConfidenceModeEnum::Canonical, $sor, $sorid, $attributes); - -// XXX add some logging on match candidates? or maybe in search() + $canonicalMatches = $this->search( + mode: ConfidenceModeEnum::Canonical, + sor: $sor, + sorid: $sorid, + attributes: $attributes, + skipSor: $trustMode == TrustModeEnum::Trust + ); + + // Was a canonical match downgraded? + $downgraded = false; + switch($canonicalMatches->count()) { case 1: - // Exact match, return - return $canonicalMatches; + // Before returning this canonical match, we need to perform some checks that + // might demote the result to potential. Note that $results may have more than + // one row even for a canonical match, since there may be multiple matchgrid + // entries that point to the same Reference ID. + + $results = $canonicalMatches->getRawResults(); + + // First, check if any Attribute Rules in "Invalidate" mode will demote this result. + + foreach($results as $rowId => $attrs) { + // Find the rule that generated this match. + + $rulename = $canonicalMatches->getRuleForResult($rowId); + + foreach($this->mgConfig->canonical_rules as $rule) { + if($rule->name == $rulename) { + // This is the correct rule, check the Rule Attributes. Note there could + // be more than one Rule Attribute with Search Type "Invalidate". + + foreach($rule->rule_attributes as $ruleAttribute) { + if($ruleAttribute->search_type == SearchTypeEnum::Invalidate) { + // The name of the attribute for this Rule Attribute, eg "dob". + // This is the column name, not the API name. + $ruleAttributeName = $ruleAttribute->attribute->name; + + // The value in the search request + $searchValue = $attributes->getValueByAttribute($ruleAttribute->attribute); + // The value in the matched row + $rowValue = $results[$rowId][$ruleAttributeName]; + + // We only perform the validation check if both values are not empty. + if(!empty($searchValue) + && !empty($rowValue) + && ($searchValue !== $rowValue)) { + // The returned value does not match, invalidate the request and drop + // the result to potential + + Log::write('debug', $sor . "/" . $sorid . " Invalidate mode for $ruleAttributeName ($rulename) downgrading result to Potential"); + + $downgraded = [ + 'rule' => "_invalidate", + 'attrs' => $attrs + ]; + + // No need to continue with any loop + break 3; + } + } + } + + // We found the rule we're looking for, no need to continue with the loop + break; + } + } + + // If we have multiple rows, we should have the same rule for each row, + // so we can stop after the first. + break; + } + + if(!$downgraded) { + // Next we need to handle Potential Trust Mode, check to see if any result row + // matched the SOR. + + if($trustMode != TrustModeEnum::Potential) { + // Exact match, return + return $canonicalMatches; + } + + foreach($results as $rowId => $attrs) { + if($attrs['sor'] == $sor) { + $sorMatch = $attrs; + break; + } + } + + if(!$sorMatch) { + // We matched against a _different_ SOR, so return a canonical match + + return $canonicalMatches; + } + + $downgraded = [ + 'rule' => "_trustmode", + 'attrs' => $sorMatch + ]; + Log::write('debug', $sor . "/" . $sorid . " Trust Mode downgrading result to Potential"); + } break; case 0: // Fall through and try potential matches @@ -843,7 +958,20 @@ public function searchReferenceId(string $sor, string $sorid, AttributeManager $ } // Next try potential matches - $potentialMatches = $this->search(ConfidenceModeEnum::Potential, $sor, $sorid, $attributes); + $potentialMatches = $this->search( + mode: ConfidenceModeEnum::Potential, + sor: $sor, + sorid: $sorid, + attributes: $attributes, + skipSor: $trustMode == TrustModeEnum::Trust + ); + + // Add in the downgraded potential match from above, if configured + + if($downgraded !== false) { + // We use a psuedo-rule name + $potentialMatches->add($downgraded['attrs'], $downgraded['rule']); + } // The calling code generally checks to see if any rules successfully ran, // since if there were no valid attributes or rules we treat that as an error. diff --git a/app/src/Lib/Match/ResultManager.php b/app/src/Lib/Match/ResultManager.php index 00a709793..313e15ccf 100644 --- a/app/src/Lib/Match/ResultManager.php +++ b/app/src/Lib/Match/ResultManager.php @@ -39,12 +39,16 @@ class ResultManager { // for the same referenceId). Attributes are stored in the same format as AttributeManager // to faciliate wire representation. protected $results = []; + // Track which rule created which results. This will only be populated for rules + // that generated results. + protected $resultRules = []; // Keep the raw results as well, to facilitate UI representation. protected $rawResults = []; // "canonical" or "potential" protected $confidenceMode = null; protected $attrconfig = []; - // We track which rules ran successfully as a way of validating the inbound request + // We track which rules ran successfully as a way of validating the inbound request. + // This includes rules that did not generate any results. protected $successfulRules = []; /** @@ -97,6 +101,8 @@ public function add(array $attributes, string $rule=null) { } $this->results[$referenceId][$rowId] = $parsed; + + $this->resultRules[$rowId] = $rule; $this->rawResults[$rowId] = $attributes; } @@ -274,6 +280,18 @@ public function getResultsForJson($mode="search") { return $ret; } + /** + * Get the name of the rule that generated the result for the specified row ID. + * + * @since COmanage Match v1.2.0 + * @param int $rowId Row to return rule for + * @return string Rule name (if found) or false + */ + + public function getRuleForResult(int $rowId) { + return $this->resultRules[$rowId] ?? false; + } + /** * Obtain an array of successfully executed rules as reported to the ResultManager. * Note that successful rules may have generated no matches. diff --git a/app/src/Model/Table/AttributesTable.php b/app/src/Model/Table/AttributesTable.php index 37507df61..57b5dd44c 100644 --- a/app/src/Model/Table/AttributesTable.php +++ b/app/src/Model/Table/AttributesTable.php @@ -68,12 +68,14 @@ public function initialize(array $config): void { 'attributeGroups' => [ 'type' => 'select', 'model' => 'AttributeGroups', - 'find' => 'filterPrimaryLink' + 'find' => 'filterPrimaryLink', + 'order' => ['name' => 'ASC'] ], 'attributeMaps' => [ 'type' => 'select', 'model' => 'AttributeMaps', - 'find' => 'filterPrimaryLink' + 'find' => 'filterPrimaryLink', + 'order' => ['name' => 'ASC'] ] ]); } diff --git a/app/src/Model/Table/MetaTable.php b/app/src/Model/Table/MetaTable.php index db01b276a..4f30a4538 100644 --- a/app/src/Model/Table/MetaTable.php +++ b/app/src/Model/Table/MetaTable.php @@ -34,18 +34,29 @@ use Cake\Validation\Validator; class MetaTable extends Table { + /** + * Update the current "upgrade" version. + * + * @since COmanage Match v1.2.0 + * @return string Current "upgrade" version, per the database + * @throws RuntimeException + */ + public function getUpgradeVersion(): string { + $meta = $this->get(1); + + return $meta->upgrade_version; + } + /** * Update the current "upgrade" version. * * @since COmanage Match v1.0.0 - * @param String $version New current version - * @return Boolean True on success + * @param string $version New current version + * @return bool True on success * @throws RuntimeException */ - public function setUpgradeVersion($version) { -// XXX log this? print "Setting version to " . $version . "\n"; - + public function setUpgradeVersion(string $version): bool { $meta = $this->newEmptyEntity(); $meta->id = 1; $meta->upgrade_version = $version; diff --git a/app/src/Model/Table/RuleAttributesTable.php b/app/src/Model/Table/RuleAttributesTable.php index 68dee6601..9f671f442 100644 --- a/app/src/Model/Table/RuleAttributesTable.php +++ b/app/src/Model/Table/RuleAttributesTable.php @@ -70,12 +70,14 @@ public function initialize(array $config): void { 'attributes' => [ 'type' => 'select', 'model' => 'Attributes', - 'find' => 'filterMatchgrid' + 'find' => 'filterMatchgrid', + 'order' => ['name' => 'ASC'] ], 'crosscheckAttributes' => [ 'type' => 'select', 'model' => 'Attributes', - 'find' => 'filterMatchgrid' + 'find' => 'filterMatchgrid', + 'order' => ['name' => 'ASC'] ], 'searchTypes' => [ 'type' => 'enum', @@ -120,6 +122,7 @@ public function validationDefault(Validator $validator): Validator { [ 'rule' => [ 'inList', [ SearchTypeEnum::Distance, SearchTypeEnum::Exact, + SearchTypeEnum::Invalidate, SearchTypeEnum::Mapping, SearchTypeEnum::Skip, SearchTypeEnum::Substring diff --git a/app/src/Model/Table/SystemsOfRecordTable.php b/app/src/Model/Table/SystemsOfRecordTable.php index 992e67df7..98bb2693c 100644 --- a/app/src/Model/Table/SystemsOfRecordTable.php +++ b/app/src/Model/Table/SystemsOfRecordTable.php @@ -33,6 +33,7 @@ use Cake\Validation\Validator; use \App\Lib\Enum\ResolutionModeEnum; +use \App\Lib\Enum\TrustModeEnum; class SystemsOfRecordTable extends Table { use \App\Lib\Traits\AutoViewVarsTrait; @@ -63,10 +64,33 @@ public function initialize(array $config): void { 'resolutionModes' => [ 'type' => 'enum', 'class' => 'ResolutionModeEnum' + ], + 'trustModes' => [ + 'type' => 'enum', + 'class' => 'TrustModeEnum' ] ]); } + /** + * Determine the trust mode setting for the requested SOR within the matchgrid. + * + * @since COmanage Match v1.2.0 + * @param int $matchgridId Matchgrid ID + * @param string $sorLabel System of Record Label + */ + + public function getTrustMode(int $matchgridId, string $sorLabel) { + $systemOfRecord = $this->find() + ->where([ + 'matchgrid_id' => $matchgridId, + 'label' => $sorLabel + ]) + ->firstOrFail(); + + return $systemOfRecord->trust_mode; + } + /** * Set validation rules. * @@ -91,13 +115,17 @@ public function validationDefault(Validator $validator): Validator { ); $validator->notBlank('matchgrid_id'); + $validator->add( + 'trust_mode', + 'content', + [ 'rule' => [ 'inList', TrustModeEnum::getConstValues() ] ] + ); + $validator->notEmptyString('trust_mode'); + $validator->add( 'resolution_mode', 'content', - [ 'rule' => [ 'inList', [ - ResolutionModeEnum::External, - ResolutionModeEnum::Interactive - ] ] ] + [ 'rule' => [ 'inList', ResolutionModeEnum::getConstValues() ] ] ); $validator->notEmptyString('resolution_mode'); diff --git a/app/src/View/Helper/FieldHelper.php b/app/src/View/Helper/FieldHelper.php index 9855fb0c7..9509da7e5 100644 --- a/app/src/View/Helper/FieldHelper.php +++ b/app/src/View/Helper/FieldHelper.php @@ -69,6 +69,17 @@ public function control(string $fieldName, $label = null; $desc = null; + + // Get the field type from the map of fields (e.g. 'boolean', 'string', 'timestamp') + $fieldMap = $this->getView()->get('vv_field_types'); + + // $vv_field_types holds the table schema as introspected by Cake. + // For viewing Matchgrid Records (/match/matchgrid-records/edit/X), + // $fieldName is the API label, but $labelText is the database column + // name, so we have to check both locations. + $fieldType = (!empty($fieldMap[$fieldName]) + ? $fieldMap[$fieldName] + : (!empty($fieldMap[$labelText]) ? $fieldMap[$labelText] : "")); if($labelText) { $label = $labelText; @@ -114,7 +125,15 @@ public function control(string $fieldName, // This is a read-only timestamp, use the field to render itself $control = $this->viewObj->$fieldName->nice(); $isRequired = false; + } elseif(!$this->editable) { + // Just output the field value. + $control = $this->viewObj->$fieldName; } else { + if($fieldType == 'boolean') { + // A boolean field is a checkbox. Include the label with the field. + $coptions['label'] = $label; + $coptions['class'] = 'form-check-input'; + } $control = $this->Form->control($fieldName, $coptions); } @@ -140,7 +159,7 @@ public function control(string $fieldName, return '
  • - ' . ($this->editable + ' . ($this->editable && !($fieldType == 'boolean') ? $this->Form->label($fieldName, $label) : $label) . ($isRequired ? ' *' : '') . ' diff --git a/app/templates/Attributes/fields.inc b/app/templates/Attributes/fields.inc index e412c5c62..9fb5c8f3f 100644 --- a/app/templates/Attributes/fields.inc +++ b/app/templates/Attributes/fields.inc @@ -37,8 +37,6 @@ if($action == 'add' || $action == 'edit') { print $this->Field->control('alphanumeric', [], false); print $this->Field->control('case_sensitive', [], false); -// CO-1762 -// print $this->Field->control('invalidates', [], false); print $this->Field->control('null_equivalents', [], false); print $this->Field->control('search_distance', [], false); diff --git a/app/templates/Matchgrids/reconcile.php b/app/templates/Matchgrids/reconcile.php index 98672707e..03f09913f 100644 --- a/app/templates/Matchgrids/reconcile.php +++ b/app/templates/Matchgrids/reconcile.php @@ -58,7 +58,6 @@ // String: attribute field name | Array of arrays: [attribute value, candidate id, different?1:0] $canAttr = array(); for($i = 0; $i < count($fieldNames); $i++) { - // Put the field name in the first column. $canAttr[$i][0] = $fieldNames[$i]; @@ -68,7 +67,7 @@ foreach($c as $key => $val) { if($key == $fieldNames[$i]) { $id = $c['id']; - $diff = in_array($key,$vv_candidate_diff[$id]) ? 1 : 0; + $diff = (isset($vv_candidate_diff[$id]) && in_array($key,$vv_candidate_diff[$id])) ? 1 : 0; $canAttr[$i][1][] = [$val, $id, $diff]; } } diff --git a/app/templates/SystemsOfRecord/columns.inc b/app/templates/SystemsOfRecord/columns.inc index ae9da8f7e..edc9a7119 100644 --- a/app/templates/SystemsOfRecord/columns.inc +++ b/app/templates/SystemsOfRecord/columns.inc @@ -33,5 +33,9 @@ $indexColumns = [ 'resolution_mode' => [ 'type' => 'enum', 'class' => 'ResolutionModeEnum' + ], + 'trust_mode' => [ + 'type' => 'enum', + 'class' => 'TrustModeEnum' ] ]; \ No newline at end of file diff --git a/app/templates/SystemsOfRecord/fields.inc b/app/templates/SystemsOfRecord/fields.inc index 56e2684b2..202e41c38 100644 --- a/app/templates/SystemsOfRecord/fields.inc +++ b/app/templates/SystemsOfRecord/fields.inc @@ -26,6 +26,7 @@ */ use \App\Lib\Enum\ResolutionModeEnum; +use \App\Lib\Enum\TrustModeEnum; ?> ', + '', $row->id, $url, - Router::url($this->getToolbarUrl()) + Router::url($this->getToolbarUrl()), + $nonce ); $contents = substr($contents, 0, $pos) . $script . substr($contents, $pos); $body->rewind(); diff --git a/app/vendor/cakephp/debug_kit/src/View/AjaxView.php b/app/vendor/cakephp/debug_kit/src/View/AjaxView.php index 911a0b6f2..c2844efdc 100644 --- a/app/vendor/cakephp/debug_kit/src/View/AjaxView.php +++ b/app/vendor/cakephp/debug_kit/src/View/AjaxView.php @@ -2,17 +2,17 @@ declare(strict_types=1); /** - * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * CakePHP(tm) : Rapid Development Framework (https://cakephp.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project * @since 3.2.8 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace DebugKit\View; diff --git a/app/vendor/cakephp/debug_kit/src/View/Helper/CredentialsHelper.php b/app/vendor/cakephp/debug_kit/src/View/Helper/CredentialsHelper.php index 253fabd85..86b017cc9 100644 --- a/app/vendor/cakephp/debug_kit/src/View/Helper/CredentialsHelper.php +++ b/app/vendor/cakephp/debug_kit/src/View/Helper/CredentialsHelper.php @@ -2,16 +2,16 @@ declare(strict_types=1); /** - * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * CakePHP(tm) : Rapid Development Framework (https://cakephp.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project * @since 3.3.7 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace DebugKit\View\Helper; @@ -39,7 +39,7 @@ class CredentialsHelper extends Helper * Replace credentials in url's by ***** * Example mysql://username:password@localhost/my_db -> mysql://******@localhost/my_db * - * @param string $in variable to filter + * @param mixed $in variable to filter * @return string */ public function filter($in) diff --git a/app/vendor/cakephp/debug_kit/src/View/Helper/SimpleGraphHelper.php b/app/vendor/cakephp/debug_kit/src/View/Helper/SimpleGraphHelper.php index 340ad1cda..3a06bd005 100644 --- a/app/vendor/cakephp/debug_kit/src/View/Helper/SimpleGraphHelper.php +++ b/app/vendor/cakephp/debug_kit/src/View/Helper/SimpleGraphHelper.php @@ -2,16 +2,16 @@ declare(strict_types=1); /** - * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * CakePHP(tm) : Rapid Development Framework (https://cakephp.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project * @since 1.0.0 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace DebugKit\View\Helper; @@ -70,10 +70,10 @@ public function bar($value, $offset, $options = []) } return sprintf( - '
    ', + '
    ', "width: {$width}px", "margin-left: {$graphOffset}px; width: {$graphValue}px", - __d('debug_kit', 'Starting {0}ms into the request, taking {1}ms', $offset, $value) + "Starting {$offset}ms into the request, taking {$value}ms" ); } } diff --git a/app/vendor/cakephp/debug_kit/src/View/Helper/ToolbarHelper.php b/app/vendor/cakephp/debug_kit/src/View/Helper/ToolbarHelper.php index d59a8e12e..0574ec143 100644 --- a/app/vendor/cakephp/debug_kit/src/View/Helper/ToolbarHelper.php +++ b/app/vendor/cakephp/debug_kit/src/View/Helper/ToolbarHelper.php @@ -2,28 +2,25 @@ declare(strict_types=1); /** - * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * CakePHP(tm) : Rapid Development Framework (https://cakephp.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project * @since 0.1 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace DebugKit\View\Helper; -use ArrayAccess; use Cake\Error\Debug\ArrayItemNode; use Cake\Error\Debug\ArrayNode; use Cake\Error\Debug\HtmlFormatter; use Cake\Error\Debug\ScalarNode; use Cake\Error\Debugger; use Cake\View\Helper; -use Closure; -use Iterator; /** * Provides Base methods for content specific debug toolbar helpers. @@ -119,101 +116,4 @@ public function dump($value) '
    ', ]); } - - /** - * Recursively goes through an array and makes neat HTML out of it. - * - * @param mixed $values Array to make pretty. - * @param int $openDepth Depth to add open class - * @param int $currentDepth current depth. - * @param bool $doubleEncode Whether or not to double encode. - * @param \SplObjectStorage $currentAncestors Object references found down - * the path. - * @return string - * @deprecated 4.4.0 Use ToolbarHelper::dump() instead. - */ - public function makeNeatArray( - $values, - $openDepth = 0, - $currentDepth = 0, - $doubleEncode = false, - ?\SplObjectStorage $currentAncestors = null - ) { - if ($currentAncestors === null) { - $ancestors = new \SplObjectStorage(); - } elseif (is_object($values)) { - $ancestors = new \SplObjectStorage(); - $ancestors->addAll($currentAncestors); - $ancestors->attach($values); - } else { - $ancestors = $currentAncestors; - } - $className = "neat-array depth-$currentDepth"; - if ($openDepth > $currentDepth) { - $className .= ' expanded'; - } - $nextDepth = $currentDepth + 1; - $out = "'; - - return $out; - } } diff --git a/app/vendor/cakephp/debug_kit/templates/Dashboard/index.php b/app/vendor/cakephp/debug_kit/templates/Dashboard/index.php index ee3566fd5..d7468e1f2 100644 --- a/app/vendor/cakephp/debug_kit/templates/Dashboard/index.php +++ b/app/vendor/cakephp/debug_kit/templates/Dashboard/index.php @@ -3,18 +3,18 @@ * @var \App\View\AppView $this */ ?> -

    +

    Debug Kit Dashboard

    -

    +

    Database

    Form->postLink( - __d('debug_kit', 'Reset database'), + 'Reset database', ['_method' => 'POST', 'action' => 'reset'], ['confirm' => 'Are you sure?'] ); ?> @@ -22,5 +22,5 @@

    Actions

    diff --git a/app/vendor/cakephp/debug_kit/templates/MailPreview/email.php b/app/vendor/cakephp/debug_kit/templates/MailPreview/email.php index 622089681..2529d93e1 100644 --- a/app/vendor/cakephp/debug_kit/templates/MailPreview/email.php +++ b/app/vendor/cakephp/debug_kit/templates/MailPreview/email.php @@ -1,4 +1,4 @@ - @@ -60,7 +81,7 @@ final class HtmlResultPrinter extends ResultPrinter */ private const CLASS_HEADER = <<<'EOT' -

    %s

    +

    %s

    + + + + + + +{{< /example >}} + +{{< js-docs name="varying-modal-content" file="site/assets/js/snippets.js" >}} + +### Toggle between modals + +Toggle between multiple modals with some clever placement of the `data-bs-target` and `data-bs-toggle` attributes. For example, you could toggle a password reset modal from within an already open sign in modal. **Please note multiple modals cannot be open at the same time**—this method simply toggles between two separate modals. + +{{< example >}} + + + +{{< /example >}} + +### Change animation + +The `$modal-fade-transform` variable determines the transform state of `.modal-dialog` before the modal fade-in animation, the `$modal-show-transform` variable determines the transform of `.modal-dialog` at the end of the modal fade-in animation. + +If you want for example a zoom-in animation, you can set `$modal-fade-transform: scale(.8)`. + +### Remove animation + +For modals that simply appear rather than fade in to view, remove the `.fade` class from your modal markup. + +```html + +``` + +### Dynamic heights + +If the height of a modal changes while it is open, you should call `myModal.handleUpdate()` to readjust the modal's position in case a scrollbar appears. + +### Accessibility + +Be sure to add `aria-labelledby="..."`, referencing the modal title, to `.modal`. Additionally, you may give a description of your modal dialog with `aria-describedby` on `.modal`. Note that you don't need to add `role="dialog"` since we already add it via JavaScript. + +### Embedding YouTube videos + +Embedding YouTube videos in modals requires additional JavaScript not in Bootstrap to automatically stop playback and more. [See this helpful Stack Overflow post](https://stackoverflow.com/questions/18622508/bootstrap-3-and-youtube-in-modal) for more information. + +## Optional sizes + +Modals have three optional sizes, available via modifier classes to be placed on a `.modal-dialog`. These sizes kick in at certain breakpoints to avoid horizontal scrollbars on narrower viewports. + +{{< bs-table "table" >}} +| Size | Class | Modal max-width +| --- | --- | --- | +| Small | `.modal-sm` | `300px` | +| Default | None | `500px` | +| Large | `.modal-lg` | `800px` | +| Extra large | `.modal-xl` | `1140px` | +{{< /bs-table >}} + +Our default modal without modifier class constitutes the "medium" size modal. + +
    + + + +
    + +```html + + + +``` + + + + + + + +## Fullscreen Modal + +Another override is the option to pop up a modal that covers the user viewport, available via modifier classes that are placed on a `.modal-dialog`. + +{{< bs-table >}} +| Class | Availability | +| --- | --- | +| `.modal-fullscreen` | Always | +| `.modal-fullscreen-sm-down` | `576px` | +| `.modal-fullscreen-md-down` | `768px` | +| `.modal-fullscreen-lg-down` | `992px` | +| `.modal-fullscreen-xl-down` | `1200px` | +| `.modal-fullscreen-xxl-down` | `1400px` | +{{< /bs-table >}} + +
    + + + + + + +
    + +```html + + +``` + + + + + + + + + + + + + +## CSS + +### Variables + +{{< added-in "5.2.0" >}} + +As part of Bootstrap's evolving CSS variables approach, modals now use local CSS variables on `.modal` and `.modal-backdrop` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too. + +{{< scss-docs name="modal-css-vars" file="scss/_modal.scss" >}} + +{{< scss-docs name="modal-backdrop-css-vars" file="scss/_modal.scss" >}} + +### Sass variables + +{{< scss-docs name="modal-variables" file="scss/_variables.scss" >}} + +### Sass loops + +[Responsive fullscreen modals](#fullscreen-modal) are generated via the `$breakpoints` map and a loop in `scss/_modal.scss`. + +{{< scss-docs name="modal-fullscreen-loop" file="scss/_modal.scss" >}} + +## Usage + +The modal plugin toggles your hidden content on demand, via data attributes or JavaScript. It also overrides default scrolling behavior and generates a `.modal-backdrop` to provide a click area for dismissing shown modals when clicking outside the modal. + +### Via data attributes + +#### Toggle + +Activate a modal without writing JavaScript. Set `data-bs-toggle="modal"` on a controller element, like a button, along with a `data-bs-target="#foo"` or `href="#foo"` to target a specific modal to toggle. + +```html + +``` + +#### Dismiss + +{{% js-dismiss "modal" %}} + +{{< callout warning >}} +While both ways to dismiss a modal are supported, keep in mind that dismissing from outside a modal does not match the [ARIA Authoring Practices Guide dialog (modal) pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/). Do this at your own risk. +{{< /callout >}} + +### Via JavaScript + +Create a modal with a single line of JavaScript: + +```js +const myModal = new bootstrap.Modal(document.getElementById('myModal'), options) +// or +const myModalAlternative = new bootstrap.Modal('#myModal', options) +``` + +### Options + +{{< markdown >}} +{{< partial "js-data-attributes.md" >}} +{{< /markdown >}} + +{{< bs-table "table" >}} +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `backdrop` | boolean, `'static'` | `true` | Includes a modal-backdrop element. Alternatively, specify `static` for a backdrop which doesn't close the modal when clicked. | +| `focus` | boolean | `true` | Puts the focus on the modal when initialized. | +| `keyboard` | boolean | `true` | Closes the modal when escape key is pressed. | +{{< /bs-table >}} + +### Methods + +{{< callout danger >}} +{{< partial "callouts/danger-async-methods.md" >}} +{{< /callout >}} + +#### Passing options + +Activates your content as a modal. Accepts an optional options `object`. + +```js +const myModal = new bootstrap.Modal('#myModal', { + keyboard: false +}) +``` + +{{< bs-table "table" >}} +| Method | Description | +| --- | --- | +| `dispose` | Destroys an element's modal. (Removes stored data on the DOM element) | +| `getInstance` | _Static_ method which allows you to get the modal instance associated with a DOM element. | +| `getOrCreateInstance` | _Static_ method which allows you to get the modal instance associated with a DOM element, or create a new one in case it wasn't initialized. | +| `handleUpdate` | Manually readjust the modal's position if the height of a modal changes while it is open (i.e. in case a scrollbar appears). | +| `hide` | Manually hides a modal. **Returns to the caller before the modal has actually been hidden** (i.e. before the `hidden.bs.modal` event occurs). | +| `show` | Manually opens a modal. **Returns to the caller before the modal has actually been shown** (i.e. before the `shown.bs.modal` event occurs). Also, you can pass a DOM element as an argument that can be received in the modal events (as the `relatedTarget` property). (i.e. `const modalToggle = document.getElementById('toggleMyModal'); myModal.show(modalToggle)`. | +| `toggle` | Manually toggles a modal. **Returns to the caller before the modal has actually been shown or hidden** (i.e. before the `shown.bs.modal` or `hidden.bs.modal` event occurs). | +{{< /bs-table >}} + +### Events + +Bootstrap's modal class exposes a few events for hooking into modal functionality. All modal events are fired at the modal itself (i.e. at the ` @@ -66,7 +67,7 @@ In the example below, we take a typical card component and recreate it with plac

    - + ``` @@ -82,7 +83,7 @@ We apply additional styling to `.btn`s via `::before` to ensure the `height` is

    - + {{< /example >}} {{< callout info >}} @@ -125,7 +126,7 @@ The size of `.placeholder`s are based on the typographic style of the parent ele ### Animation -Animate placeholders with `.placeholder-glow` or `.placeholder-wave` to better convey the perception of something being _actively_ loaded. +Animate placeholders with `.placeholder-glow` or `.placeholder-wave` to better convey the perception of something being *actively* loaded. {{< example >}}

    @@ -137,8 +138,8 @@ Animate placeholders with `.placeholder-glow` or `.placeholder-wave` to better c

    {{< /example >}} -## Sass +## CSS -### Variables +### Sass variables {{< scss-docs name="placeholders" file="scss/_variables.scss" >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/popovers.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/popovers.md new file mode 100644 index 000000000..685d2c3c6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/popovers.md @@ -0,0 +1,280 @@ +--- +layout: docs +title: Popovers +description: Documentation and examples for adding Bootstrap popovers, like those found in iOS, to any element on your site. +group: components +toc: true +--- + +## Overview + +Things to know when using the popover plugin: + +- Popovers rely on the third party library [Popper](https://popper.js.org/) for positioning. You must include [popper.min.js]({{< param "cdn.popper" >}}) before `bootstrap.js`, or use one `bootstrap.bundle.min.js` which contains Popper. +- Popovers require the [popover plugin]({{< docsref "/components/popovers" >}}) as a dependency. +- Popovers are opt-in for performance reasons, so **you must initialize them yourself**. +- Zero-length `title` and `content` values will never show a popover. +- Specify `container: 'body'` to avoid rendering problems in more complex components (like our input groups, button groups, etc). +- Triggering popovers on hidden elements will not work. +- Popovers for `.disabled` or `disabled` elements must be triggered on a wrapper element. +- When triggered from anchors that wrap across multiple lines, popovers will be centered between the anchors' overall width. Use `.text-nowrap` on your ``s to avoid this behavior. +- Popovers must be hidden before their corresponding elements have been removed from the DOM. +- Popovers can be triggered thanks to an element inside a shadow DOM. + +{{< callout info >}} +{{< partial "callouts/info-sanitizer.md" >}} +{{< /callout >}} + +{{< callout info >}} +{{< partial "callouts/info-prefersreducedmotion.md" >}} +{{< /callout >}} + +Keep reading to see how popovers work with some examples. + +## Examples + +### Enable popovers + +As mentioned above, you must initialize popovers before they can be used. One way to initialize all popovers on a page would be to select them by their `data-bs-toggle` attribute, like so: + +```js +const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]') +const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)) +``` + +### Live demo + +We use JavaScript similar to the snippet above to render the following live popover. Titles are set via `data-bs-title` and body content is set via `data-bs-content`. + +{{< callout warning >}} +{{< partial "callouts/warning-data-bs-title-vs-title.md" >}} +{{< /callout >}} + +{{< example stackblitz_add_js="true" >}} + +{{< /example >}} + +### Four directions + +Four options are available: top, right, bottom, and left. Directions are mirrored when using Bootstrap in RTL. Set `data-bs-placement` to change the direction. + +{{< example stackblitz_add_js="true" >}} + + + + +{{< /example >}} + +### Custom `container` + +When you have some styles on a parent element that interfere with a popover, you'll want to specify a custom `container` so that the popover's HTML appears within that element instead. This is common in responsive tables, input groups, and the like. + +```js +const popover = new bootstrap.Popover('.example-popover', { + container: 'body' +}) +``` + +Another situation where you'll want to set an explicit custom `container` are popovers inside a [modal dialog]({{< docsref "/components/modal" >}}), to make sure that the popover itself is appended to the modal. This is particularly important for popovers that contain interactive elements – modal dialogs will trap focus, so unless the popover is a child element of the modal, users won't be able to focus or activate these interactive elements. + +```js +const popover = new bootstrap.Popover('.example-popover', { + container: '.modal-body' +}) +``` + +### Custom popovers + +{{< added-in "5.2.0" >}} + +You can customize the appearance of popovers using [CSS variables](#variables). We set a custom class with `data-bs-custom-class="custom-popover"` to scope our custom appearance and use it to override some of the local CSS variables. + +{{< scss-docs name="custom-popovers" file="site/assets/scss/_component-examples.scss" >}} + +{{< example class="custom-popover-demo" stackblitz_add_js="true" >}} + +{{< /example >}} + +### Dismiss on next click + +Use the `focus` trigger to dismiss popovers on the user's next click of an element other than the toggle element. + +{{< callout danger >}} +**Dismissing on next click requires specific HTML for proper cross-browser and cross-platform behavior.** You can only use `` elements, not ` + +{{< /example >}} + +## CSS + +### Variables + +{{< added-in "5.2.0" >}} + +As part of Bootstrap’s evolving CSS variables approach, popovers now use local CSS variables on `.popover` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too. + +{{< scss-docs name="popover-css-vars" file="scss/_popover.scss" >}} + +### Sass variables + +{{< scss-docs name="popover-variables" file="scss/_variables.scss" >}} + +## Usage + +Enable popovers via JavaScript: + +```js +const exampleEl = document.getElementById('example') +const popover = new bootstrap.Popover(exampleEl, options) +``` + +{{< callout warning >}} +**Keep popovers accessible to keyboard and assistive technology users** by only adding them to HTML elements that are traditionally keyboard-focusable and interactive (such as links or form controls). While other HTML elements can be made focusable by adding `tabindex="0"`, this can create annoying and confusing tab stops on non-interactive elements for keyboard users, and most assistive technologies currently do not announce popovers in this situation. Additionally, do not rely solely on `hover` as the trigger for your popovers as this will make them impossible to trigger for keyboard users. + +Avoid adding an excessive amount of content in popovers with the `html` option. Once popovers are displayed, their content is tied to the trigger element with the `aria-describedby` attribute, causing all of the popover's content to be announced to assistive technology users as one long, uninterrupted stream. + +Popovers do not manage keyboard focus order, and their placement can be random in the DOM, so be careful when adding interactive elements (like forms or links), as it may lead to an illogical focus order or make the popover content itself completely unreachable for keyboard users. In cases where you must use these elements, consider using a modal dialog instead. +{{< /callout >}} + +### Options + +{{< markdown >}} +{{< partial "js-data-attributes.md" >}} +{{< /markdown >}} + +{{< callout warning >}} +Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` options cannot be supplied using data attributes. +{{< /callout >}} + +{{< bs-table "table" >}} +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `allowList` | object | [Default value]({{< docsref "/getting-started/javascript#sanitizer" >}}) | Object which contains allowed attributes and tags. | +| `animation` | boolean | `true` | Apply a CSS fade transition to the popover. | +| `boundary` | string, element | `'clippingParents'` | Overflow constraint boundary of the popover (applies only to Popper's preventOverflow modifier). By default, it's `'clippingParents'` and can accept an HTMLElement reference (via JavaScript only). For more information refer to Popper's [detectOverflow docs](https://popper.js.org/docs/v2/utils/detect-overflow/#boundary). | +| `container` | string, element, false | `false` | Appends the popover to a specific element. Example: `container: 'body'`. This option is particularly useful in that it allows you to position the popover in the flow of the document near the triggering element - which will prevent the popover from floating away from the triggering element during a window resize. | +| `content` | string, element, function | `''` | The popover's text content. If a function is given, it will be called with its `this` reference set to the element that the popover is attached to. | +| `customClass` | string, function | `''` | Add classes to the popover when it is shown. Note that these classes will be added in addition to any classes specified in the template. To add multiple classes, separate them with spaces: `'class-1 class-2'`. You can also pass a function that should return a single string containing additional class names. | +| `delay` | number, object | `0` | Delay showing and hiding the popover (ms)—doesn't apply to manual trigger type. If a number is supplied, delay is applied to both hide/show. Object structure is: `delay: { "show": 500, "hide": 100 }`. | +| `fallbackPlacements` | string, array | `['top', 'right', 'bottom', 'left']` | Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to Popper's [behavior docs](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements). | +| `html` | boolean | `false` | Allow HTML in the popover. If true, HTML tags in the popover's `title` will be rendered in the popover. If false, `innerText` property will be used to insert content into the DOM. Use text if you're worried about XSS attacks. | +| `offset` | number, string, function | `[0, 0]` | Offset of the popover relative to its target. You can pass a string in data attributes with comma separated values like: `data-bs-offset="10,20"`. When a function is used to determine the offset, it is called with an object containing the popper placement, the reference, and popper rects as its first argument. The triggering element DOM node is passed as the second argument. The function must return an array with two numbers: [skidding](https://popper.js.org/docs/v2/modifiers/offset/#skidding-1), [distance](https://popper.js.org/docs/v2/modifiers/offset/#distance-1). For more information refer to Popper's [offset docs](https://popper.js.org/docs/v2/modifiers/offset/#options). | +| `placement` | string, function | `'top'` | How to position the popover: auto, top, bottom, left, right. When `auto` is specified, it will dynamically reorient the popover. When a function is used to determine the placement, it is called with the popover DOM node as its first argument and the triggering element DOM node as its second. The `this` context is set to the popover instance. | +| `popperConfig` | null, object, function | `null` | To change Bootstrap's default Popper config, see [Popper's configuration](https://popper.js.org/docs/v2/constructors/#options). When a function is used to create the Popper configuration, it's called with an object that contains the Bootstrap's default Popper configuration. It helps you use and merge the default with your own configuration. The function must return a configuration object for Popper. | +| `sanitize` | boolean | `true` | Enable or disable the sanitization. If activated `'template'`, `'content'` and `'title'` options will be sanitized. | +| `sanitizeFn` | null, function | `null` | Here you can supply your own sanitize function. This can be useful if you prefer to use a dedicated library to perform sanitization. | +| `selector` | string, false | `false` | If a selector is provided, popover objects will be delegated to the specified targets. In practice, this is used to also apply popovers to dynamically added DOM elements (`jQuery.on` support). See [this issue]({{< param repo >}}/issues/4215) and [an informative example](https://codepen.io/Johann-S/pen/djJYPb). **Note**: `title` attribute must not be used as a selector. | +| `template` | string | `''` | Base HTML to use when creating the popover. The popover's `title` will be injected into the `.popover-inner`. `.popover-arrow` will become the popover's arrow. The outermost wrapper element should have the `.popover` class and `role="tooltip"`. | +| `title` | string, element, function | `''` | The popover title. If a function is given, it will be called with its `this` reference set to the element that the popover is attached to. | +| `trigger` | string | `'hover focus'` | How popover is triggered: click, hover, focus, manual. You may pass multiple triggers; separate them with a space. `'manual'` indicates that the popover will be triggered programmatically via the `.popover('show')`, `.popover('hide')` and `.popover('toggle')` methods; this value cannot be combined with any other trigger. `'hover'` on its own will result in popovers that cannot be triggered via the keyboard, and should only be used if alternative methods for conveying the same information for keyboard users is present. | +{{< /bs-table >}} + +{{< callout info >}} +#### Data attributes for individual popovers + +Options for individual popovers can alternatively be specified through the use of data attributes, as explained above. +{{< /callout >}} + +#### Using function with `popperConfig` + +```js +const popover = new bootstrap.Popover(element, { + popperConfig(defaultBsPopperConfig) { + // const newPopperConfig = {...} + // use defaultBsPopperConfig if needed... + // return newPopperConfig + } +}) +``` + +### Methods + +{{< callout danger >}} +{{< partial "callouts/danger-async-methods.md" >}} +{{< /callout >}} + +{{< bs-table "table" >}} +| Method | Description | +| --- | --- | +| `disable` | Removes the ability for an element's popover to be shown. The popover will only be able to be shown if it is re-enabled. | +| `dispose` | Hides and destroys an element's popover (Removes stored data on the DOM element). Popovers that use delegation (which are created using [the `selector` option](#options)) cannot be individually destroyed on descendant trigger elements. | +| `enable` | Gives an element's popover the ability to be shown. **Popovers are enabled by default.** | +| `getInstance` | _Static_ method which allows you to get the popover instance associated with a DOM element. | +| `getOrCreateInstance` | _Static_ method which allows you to get the popover instance associated with a DOM element, or create a new one in case it wasn't initialized. | +| `hide` | Hides an element's popover. **Returns to the caller before the popover has actually been hidden** (i.e. before the `hidden.bs.popover` event occurs). This is considered a "manual" triggering of the popover. | +| `setContent` | Gives a way to change the popover's content after its initialization. | +| `show` | Reveals an element's popover. **Returns to the caller before the popover has actually been shown** (i.e. before the `shown.bs.popover` event occurs). This is considered a "manual" triggering of the popover. Popovers whose title and content are both zero-length are never displayed. | +| `toggle` | Toggles an element's popover. **Returns to the caller before the popover has actually been shown or hidden** (i.e. before the `shown.bs.popover` or `hidden.bs.popover` event occurs). This is considered a "manual" triggering of the popover. | +| `toggleEnabled` | Toggles the ability for an element's popover to be shown or hidden. | +| `update` | Updates the position of an element's popover. | +{{< /bs-table >}} + + +```js +// getOrCreateInstance example +const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance + +// setContent example +myPopover.setContent({ + '.popover-header': 'another title', + '.popover-body': 'another content' +}) + +``` + +{{< callout info >}} +The `setContent` method accepts an `object` argument, where each property-key is a valid `string` selector within the popover template, and each related property-value can be `string` | `element` | `function` | `null` +{{< /callout >}} + +### Events + +{{< bs-table >}} +| Event | Description | +| --- | --- | +| `hide.bs.popover` | This event is fired immediately when the `hide` instance method has been called. | +| `hidden.bs.popover` | This event is fired when the popover has finished being hidden from the user (will wait for CSS transitions to complete). | +| `inserted.bs.popover` | This event is fired after the `show.bs.popover` event when the popover template has been added to the DOM. | +| `show.bs.popover` | This event fires immediately when the `show` instance method is called. | +| `shown.bs.popover` | This event is fired when the popover has been made visible to the user (will wait for CSS transitions to complete). | +{{< /bs-table >}} + +```js +const myPopoverTrigger = document.getElementById('myPopover') +myPopoverTrigger.addEventListener('hidden.bs.popover', () => { + // do something... +}) +``` diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/progress.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/progress.md new file mode 100644 index 000000000..73f131589 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/progress.md @@ -0,0 +1,202 @@ +--- +layout: docs +title: Progress +description: Documentation and examples for using Bootstrap custom progress bars featuring support for stacked bars, animated backgrounds, and text labels. +group: components +toc: true +--- + +{{< callout info >}} +**New markup in v5.3.0 —** We've deprecated the previous HTML structure for progress bars and replaced it with a more accessible one. The previous structure will continue to work until v6. [See what's changed in our migration guide.]({{< docsref "/migration#improved-markup-for-progress-bars" >}}) +{{< /callout >}} + +## How it works + +Progress components are built with two HTML elements, some CSS to set the width, and a few attributes. We don't use [the HTML5 `` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress), ensuring you can stack progress bars, animate them, and place text labels over them. + +- We use the `.progress` as a wrapper to indicate the max value of the progress bar. +- The `.progress` wrapper also requires a `role="progressbar"` and `aria` attributes to make it accessible, including an accessible name (using `aria-label`, `aria-labelledby`, or similar). +- We use the inner `.progress-bar` purely for the visual bar and label. +- The `.progress-bar` requires an inline style, utility class, or custom CSS to set its width. +- We provide a special `.progress-stacked` class to create multiple/stacked progress bars. + +Put that all together, and you have the following examples. + +{{< example >}} +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +{{< /example >}} + +## Bar sizing + +### Width + +Bootstrap provides a handful of [utilities for setting width]({{< docsref "/utilities/sizing" >}}). Depending on your needs, these may help with quickly configuring the width of the `.progress-bar`. + +{{< example >}} +
    +
    +
    +{{< /example >}} + +### Height + +You only set a `height` value on the `.progress` container, so if you change that value, the inner `.progress-bar` will automatically resize accordingly. + +{{< example >}} +
    +
    +
    +
    +
    +
    +{{< /example >}} + +## Labels + +Add labels to your progress bars by placing text within the `.progress-bar`. + +{{< example >}} +
    +
    25%
    +
    +{{< /example >}} + +Note that by default, the content inside the `.progress-bar` is controlled with `overflow: hidden`, so it doesn't bleed out of the bar. If your progress bar is shorter than its label, the content will be capped and may become unreadable. To change this behavior, you can use `.overflow-visible` from the [overflow utilities]({{< docsref "/utilities/overflow" >}}), but make sure to also define an explicit [text color]({{< docsref "/utilities/colors#colors" >}}) so the text remains readable. Be aware though that currently this approach does not take into account [color modes]({{< docsref "/customize/color-modes" >}}). + +{{< example >}} +
    +
    Long label text for the progress bar, set to a dark color
    +
    +{{< /example >}} + +## Backgrounds + +Use background utility classes to change the appearance of individual progress bars. + +{{< example >}} +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +{{< /example >}} + +{{< callout info >}} +{{< partial "callouts/warning-color-assistive-technologies.md" >}} +{{< /callout >}} + +If you're adding labels to progress bars with a custom background color, make sure to also set an appropriate [text color]({{< docsref "/utilities/colors#colors" >}}), so the labels remain readable and have sufficient contrast. + +{{< example >}} +
    +
    25%
    +
    +
    +
    50%
    +
    +
    +
    75%
    +
    +
    +
    100%
    +
    +{{< /example >}} + +Alternatively, you can use the new combined [color and background]({{< docsref "/helpers/color-background" >}}) helper classes. + +{{< example >}} +
    +
    75%
    +
    +{{< /example >}} + +## Multiple bars + +You can include multiple progress components inside a container with `.progress-stacked` to create a single stacked progress bar. Note that in this case, the styling to set the visual width of the progress bar *must* be applied to the `.progress` elements, rather than the `.progress-bar`s. + +{{< example >}} +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +{{< /example >}} + +## Striped + +Add `.progress-bar-striped` to any `.progress-bar` to apply a stripe via CSS gradient over the progress bar's background color. + +{{< example >}} +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +{{< /example >}} + +## Animated stripes + +The striped gradient can also be animated. Add `.progress-bar-animated` to `.progress-bar` to animate the stripes right to left via CSS3 animations. + +{{< example >}} +
    +
    +
    +{{< /example >}} + +## CSS + +### Variables + +{{< added-in "5.2.0" >}} + +As part of Bootstrap's evolving CSS variables approach, progress bars now use local CSS variables on `.progress` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too. + +{{< scss-docs name="progress-css-vars" file="scss/_progress.scss" >}} + +### Sass variables + +{{< scss-docs name="progress-variables" file="scss/_variables.scss" >}} + +### Keyframes + +Used for creating the CSS animations for `.progress-bar-animated`. Included in `scss/_progress-bar.scss`. + +{{< scss-docs name="progress-keyframes" file="scss/_progress.scss" >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/scrollspy.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/scrollspy.md new file mode 100644 index 000000000..d1abf75e3 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/scrollspy.md @@ -0,0 +1,427 @@ +--- +layout: docs +title: Scrollspy +description: Automatically update Bootstrap navigation or list group components based on scroll position to indicate which link is currently active in the viewport. +group: components +toc: true +--- + +## How it works + +Scrollspy toggles the `.active` class on anchor (``) elements when the element with the `id` referenced by the anchor's `href` is scrolled into view. Scrollspy is best used in conjunction with a Bootstrap [nav component]({{< docsref "/components/navs-tabs" >}}) or [list group]({{< docsref "/components/list-group" >}}), but it will also work with any anchor elements in the current page. Here's how it works. + +- To start, scrollspy requires two things: a navigation, list group, or a simple set of links, plus a scrollable container. The scrollable container can be the `` or a custom element with a set `height` and `overflow-y: scroll`. + +- On the scrollable container, add `data-bs-spy="scroll"` and `data-bs-target="#navId"` where `navId` is the unique `id` of the associated navigation. If there is no focusable element inside the element, be sure to also include a `tabindex="0"` to ensure keyboard access. + +- As you scroll the "spied" container, an `.active` class is added and removed from anchor links within the associated navigation. Links must have resolvable `id` targets, otherwise they're ignored. For example, a `home` must correspond to something in the DOM like `
    ` + +- Target elements that are not visible will be ignored. See the [Non-visible elements](#non-visible-elements) section below. + +## Examples + +### Navbar + +Scroll the area below the navbar and watch the active class change. Open the dropdown menu and watch the dropdown items be highlighted as well. + +
    + +
    +

    First heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Second heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Third heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Fourth heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Fifth heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +
    +
    + +```html + +
    +

    First heading

    +

    ...

    +

    Second heading

    +

    ...

    +

    Third heading

    +

    ...

    +

    Fourth heading

    +

    ...

    +

    Fifth heading

    +

    ...

    +
    +``` + +### Nested nav + +Scrollspy also works with nested `.nav`s. If a nested `.nav` is `.active`, its parents will also be `.active`. Scroll the area next to the navbar and watch the active class change. + +
    +
    +
    + +
    +
    +
    +
    +

    Item 1

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +
    Item 1-1
    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +
    Item 1-2
    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +

    Item 2

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +

    Item 3

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +
    Item 3-1
    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +
    Item 3-2
    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.

    +
    +
    +
    +
    +
    + +```html +
    +
    + +
    + +
    +
    +
    +

    Item 1

    +

    ...

    +
    +
    +
    Item 1-1
    +

    ...

    +
    +
    +
    Item 1-2
    +

    ...

    +
    +
    +

    Item 2

    +

    ...

    +
    +
    +

    Item 3

    +

    ...

    +
    +
    +
    Item 3-1
    +

    ...

    +
    +
    +
    Item 3-2
    +

    ...

    +
    +
    +
    +
    +``` + +### List group + +Scrollspy also works with `.list-group`s. Scroll the area next to the list group and watch the active class change. + +
    +
    +
    + +
    +
    +
    +

    Item 1

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 2

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 3

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 4

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +
    +
    +
    +
    + +```html +
    +
    + +
    +
    +
    +

    Item 1

    +

    ...

    +

    Item 2

    +

    ...

    +

    Item 3

    +

    ...

    +

    Item 4

    +

    ...

    +
    +
    +
    +``` + +### Simple anchors + +Scrollspy is not limited to nav components and list groups, so it will work on any `` anchor elements in the current document. Scroll the area and watch the `.active` class change. + +
    +
    + +
    +
    +

    Item 1

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 2

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 3

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 4

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Item 5

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +
    +
    +
    +
    + +```html +
    +
    + +
    +
    +
    +

    Item 1

    +

    ...

    +

    Item 2

    +

    ...

    +

    Item 3

    +

    ...

    +

    Item 4

    +

    ...

    +

    Item 5

    +

    ...

    +
    +
    +
    +``` + +## Non-visible elements + +Target elements that aren’t visible will be ignored and their corresponding nav items won't receive an `.active` class. Scrollspy instances initialized in a non-visible wrapper will ignore all target elements. Use the `refresh` method to check for observable elements once the wrapper becomes visible. + +```js +document.querySelectorAll('#nav-tab>[data-bs-toggle="tab"]').forEach(el => { + el.addEventListener('shown.bs.tab', () => { + const target = el.getAttribute('data-bs-target') + const scrollElem = document.querySelector(`${target} [data-bs-spy="scroll"]`) + bootstrap.ScrollSpy.getOrCreateInstance(scrollElem).refresh() + }) +}) +``` + +## Usage + +### Via data attributes + +To easily add scrollspy behavior to your topbar navigation, add `data-bs-spy="scroll"` to the element you want to spy on (most typically this would be the ``). Then add the `data-bs-target` attribute with the `id` or class name of the parent element of any Bootstrap `.nav` component. + +```html + + ... + + ... + +``` + +### Via JavaScript + +```js +const scrollSpy = new bootstrap.ScrollSpy(document.body, { + target: '#navbar-example' +}) +``` + +### Options + +{{< markdown >}} +{{< partial "js-data-attributes.md" >}} +{{< /markdown >}} + +{{< bs-table "table" >}} +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `rootMargin` | string | `0px 0px -25%` | Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin) valid units, when calculating scroll position. | +| `smoothScroll` | boolean | `false` | Enables smooth scrolling when a user clicks on a link that refers to ScrollSpy observables. | +| `target` | string, DOM element | `null` | Specifies element to apply Scrollspy plugin. | +| `threshold` | array | `[0.1, 0.5, 1]` | `IntersectionObserver` [threshold](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#threshold) valid input, when calculating scroll position. | + +{{< /bs-table >}} + +{{< callout warning >}} +**Deprecated Options** + +Up until v5.1.3 we were using `offset` & `method` options, which are now deprecated and replaced by `rootMargin`. +To keep backwards compatibility, we will continue to parse a given `offset` to `rootMargin`, but this feature will be removed in **v6**. +{{< /callout >}} + +### Methods + +{{< bs-table "table" >}} +| Method | Description | +| --- | --- | +| `dispose` | Destroys an element's scrollspy. (Removes stored data on the DOM element) | +| `getInstance` | *Static* method to get the scrollspy instance associated with a DOM element. | +| `getOrCreateInstance` | *Static* method to get the scrollspy instance associated with a DOM element, or to create a new one in case it wasn't initialized. | +| `refresh` | When adding or removing elements in the DOM, you'll need to call the refresh method. | +{{< /bs-table >}} + +Here's an example using the refresh method: + +```js +const dataSpyList = document.querySelectorAll('[data-bs-spy="scroll"]') +dataSpyList.forEach(dataSpyEl => { + bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh() +}) +``` + +### Events + +{{< bs-table "table" >}} +| Event | Description | +| --- | --- | +| `activate.bs.scrollspy` | This event fires on the scroll element whenever an anchor is activated by the scrollspy. | +{{< /bs-table >}} + +```js +const firstScrollSpyEl = document.querySelector('[data-bs-spy="scroll"]') +firstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => { + // do something... +}) +``` diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/components/spinners.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/spinners.md similarity index 78% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/components/spinners.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/components/spinners.md index ef7efaf58..977257dd0 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/components/spinners.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/spinners.md @@ -13,7 +13,7 @@ Bootstrap "spinners" can be used to show the loading state in your projects. The For accessibility purposes, each loader here includes `role="status"` and a nested `Loading...`. {{< callout info >}} -{{< partial "callout-info-prefersreducedmotion.md" >}} +{{< partial "callouts/info-prefersreducedmotion.md" >}} {{< /callout >}} ## Border spinner @@ -96,8 +96,8 @@ Use [flexbox utilities][flex], [float utilities][float], or [text alignment][tex {{< example >}}
    - Loading... - + Loading... +
    {{< /example >}} @@ -151,30 +151,48 @@ Use spinners within buttons to indicate an action is currently processing or tak {{< example >}} {{< /example >}} {{< example >}} {{< /example >}} -## Sass +## CSS ### Variables +{{< added-in "5.2.0" >}} + +As part of Bootstrap's evolving CSS variables approach, spinners now use local CSS variables on `.spinner-border` and `.spinner-grow` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too. + +Border spinner variables: + +{{< scss-docs name="spinner-border-css-vars" file="scss/_spinners.scss" >}} + +Growing spinner variables: + +{{< scss-docs name="spinner-grow-css-vars" file="scss/_spinners.scss" >}} + +For both spinners, small spinner modifier classes are used to update the values of these CSS variables as needed. For example, the `.spinner-border-sm` class does the following: + +{{< scss-docs name="spinner-border-sm-css-vars" file="scss/_spinners.scss" >}} + +### Sass variables + {{< scss-docs name="spinner-variables" file="scss/_variables.scss" >}} ### Keyframes @@ -187,9 +205,7 @@ Used for creating the CSS animations for our spinners. Included in `scss/_spinne [color]: {{< docsref "/utilities/colors" >}} -[display]: {{< docsref "/utilities/display" >}} [flex]: {{< docsref "/utilities/flex" >}} [float]: {{< docsref "/utilities/float" >}} [margin]: {{< docsref "/utilities/spacing" >}} -[sizing]: {{< docsref "/utilities/sizing" >}} [text]: {{< docsref "/utilities/text" >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/toasts.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/toasts.md new file mode 100644 index 000000000..a7d1cb713 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/toasts.md @@ -0,0 +1,391 @@ +--- +layout: docs +title: Toasts +description: Push notifications to your visitors with a toast, a lightweight and easily customizable alert message. +group: components +toc: true +--- + +Toasts are lightweight notifications designed to mimic the push notifications that have been popularized by mobile and desktop operating systems. They're built with flexbox, so they're easy to align and position. + +## Overview + +Things to know when using the toast plugin: + +- Toasts are opt-in for performance reasons, so **you must initialize them yourself**. +- Toasts will automatically hide if you do not specify `autohide: false`. + +{{< callout info >}} +{{< partial "callouts/info-prefersreducedmotion.md" >}} +{{< /callout >}} + +## Examples + +### Basic + +To encourage extensible and predictable toasts, we recommend a header and body. Toast headers use `display: flex`, allowing easy alignment of content thanks to our margin and flexbox utilities. + +Toasts are as flexible as you need and have very little required markup. At a minimum, we require a single element to contain your "toasted" content and strongly encourage a dismiss button. + +{{< example >}} + +{{< /example >}} + +{{< callout warning >}} +Previously, our scripts dynamically added the `.hide` class to completely hide a toast (with `display:none`, rather than just with `opacity:0`). This is now not necessary anymore. However, for backwards compatibility, our script will continue to toggle the class (even though there is no practical need for it) until the next major version. +{{< /callout >}} + +### Live example + +Click the button below to show a toast (positioned with our utilities in the lower right corner) that has been hidden by default. + +
    + +
    + +
    + +
    + +```html + + +
    + +
    +``` + +We use the following JavaScript to trigger our live toast demo: + +{{< js-docs name="live-toast" file="site/assets/js/snippets.js" >}} + +### Translucent + +Toasts are slightly translucent to blend in with what's below them. + +{{< example class="bg-dark" >}} + +{{< /example >}} + +### Stacking + +You can stack toasts by wrapping them in a toast container, which will vertically add some spacing. + +{{< example >}} +
    + + + +
    +{{< /example >}} + +### Custom content + +Customize your toasts by removing sub-components, tweaking them with [utilities]({{< docsref "/utilities/api" >}}), or by adding your own markup. Here we've created a simpler toast by removing the default `.toast-header`, adding a custom hide icon from [Bootstrap Icons]({{< param icons >}}), and using some [flexbox utilities]({{< docsref "/utilities/flex" >}}) to adjust the layout. + +{{< example >}} + +{{< /example >}} + +Alternatively, you can also add additional controls and components to toasts. + +{{< example >}} + +{{< /example >}} + +### Color schemes + +Building on the above example, you can create different toast color schemes with our [color]({{< docsref "/utilities/colors" >}}) and [background]({{< docsref "/utilities/background" >}}) utilities. Here we've added `.text-bg-primary` to the `.toast`, and then added `.btn-close-white` to our close button. For a crisp edge, we remove the default border with `.border-0`. + +{{< example >}} + +{{< /example >}} + +## Placement + +Place toasts with custom CSS as you need them. The top right is often used for notifications, as is the top middle. If you're only ever going to show one toast at a time, put the positioning styles right on the `.toast`. + +{{< example stackblitz_add_js="true" >}} +
    +
    + + +
    +
    +
    +
    +
    +
    + {{< placeholder width="20" height="20" background="#007aff" class="rounded me-2" text="false" title="false" >}} + Bootstrap + 11 mins ago +
    +
    + Hello, world! This is a toast message. +
    +
    +
    +
    +{{< /example >}} + +For systems that generate more notifications, consider using a wrapping element so they can easily stack. + +{{< example class="bd-example-toasts p-0" >}} +
    + + + + +
    + + + + + +
    +
    +{{< /example >}} + +You can also get fancy with flexbox utilities to align toasts horizontally and/or vertically. + +{{< example class="bd-example-toasts d-flex" >}} + +
    + + + +
    +{{< /example >}} + +## Accessibility + +Toasts are intended to be small interruptions to your visitors or users, so to help those with screen readers and similar assistive technologies, you should wrap your toasts in an [`aria-live` region](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions). Changes to live regions (such as injecting/updating a toast component) are automatically announced by screen readers without needing to move the user's focus or otherwise interrupt the user. Additionally, include `aria-atomic="true"` to ensure that the entire toast is always announced as a single (atomic) unit, rather than just announcing what was changed (which could lead to problems if you only update part of the toast's content, or if displaying the same toast content at a later point in time). If the information needed is important for the process, e.g. for a list of errors in a form, then use the [alert component]({{< docsref "/components/alerts" >}}) instead of toast. + +Note that the live region needs to be present in the markup *before* the toast is generated or updated. If you dynamically generate both at the same time and inject them into the page, they will generally not be announced by assistive technologies. + +You also need to adapt the `role` and `aria-live` level depending on the content. If it's an important message like an error, use `role="alert" aria-live="assertive"`, otherwise use `role="status" aria-live="polite"` attributes. + +As the content you're displaying changes, be sure to update the [`delay` timeout](#options) so that users have enough time to read the toast. + +```html + +``` + +When using `autohide: false`, you must add a close button to allow users to dismiss the toast. + +{{< example >}} + +{{< /example >}} + +While technically it's possible to add focusable/actionable controls (such as additional buttons or links) in your toast, you should avoid doing this for autohiding toasts. Even if you give the toast a long [`delay` timeout](#options), keyboard and assistive technology users may find it difficult to reach the toast in time to take action (since toasts don't receive focus when they are displayed). If you absolutely must have further controls, we recommend using a toast with `autohide: false`. + +## CSS + +### Variables + +{{< added-in "5.2.0" >}} + +As part of Bootstrap's evolving CSS variables approach, toasts now use local CSS variables on `.toast` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too. + +{{< scss-docs name="toast-css-vars" file="scss/_toasts.scss" >}} + +### Sass variables + +{{< scss-docs name="toast-variables" file="scss/_variables.scss" >}} + +## Usage + +Initialize toasts via JavaScript: + +```js +const toastElList = document.querySelectorAll('.toast') +const toastList = [...toastElList].map(toastEl => new bootstrap.Toast(toastEl, option)) +``` + +### Triggers + +{{% js-dismiss "toast" %}} + +### Options + +{{< markdown >}} +{{< partial "js-data-attributes.md" >}} +{{< /markdown >}} + +{{< bs-table "table" >}} +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `animation` | boolean | `true` | Apply a CSS fade transition to the toast. | +| `autohide` | boolean | `true` | Automatically hide the toast after the delay. | +| `delay` | number | `5000` | Delay in milliseconds before hiding the toast. | +{{< /bs-table >}} + +### Methods + +{{< callout danger >}} +{{< partial "callouts/danger-async-methods.md" >}} +{{< /callout >}} + +{{< bs-table "table" >}} +| Method | Description | +| --- | --- | +| `dispose` | Hides an element's toast. Your toast will remain on the DOM but won't show anymore. | +| `getInstance` | *Static* method which allows you to get the toast instance associated with a DOM element.
    For example: `const myToastEl = document.getElementById('myToastEl')` `const myToast = bootstrap.Toast.getInstance(myToastEl)` Returns a Bootstrap toast instance. | +| `getOrCreateInstance` | *Static* method which allows you to get the toast instance associated with a DOM element, or create a new one, in case it wasn't initialized.
    `const myToastEl = document.getElementById('myToastEl')` `const myToast = bootstrap.Toast.getOrCreateInstance(myToastEl)` Returns a Bootstrap toast instance. | +| `hide` | Hides an element's toast. **Returns to the caller before the toast has actually been hidden** (i.e. before the `hidden.bs.toast` event occurs). You have to manually call this method if you made `autohide` to `false`. | +| `isShown` | Returns a boolean according to toast's visibility state. | +| `show` | Reveals an element's toast. **Returns to the caller before the toast has actually been shown** (i.e. before the `shown.bs.toast` event occurs). You have to manually call this method, instead your toast won't show. | +{{< /bs-table >}} + +### Events + +{{< bs-table "table" >}} +| Event | Description | +| --- | --- | +| `hide.bs.toast` | This event is fired immediately when the `hide` instance method has been called. | +| `hidden.bs.toast` | This event is fired when the toast has finished being hidden from the user. | +| `show.bs.toast` | This event fires immediately when the `show` instance method is called. | +| `shown.bs.toast` | This event is fired when the toast has been made visible to the user. | +{{< /bs-table >}} + +```js +const myToastEl = document.getElementById('myToast') +myToastEl.addEventListener('hidden.bs.toast', () => { + // do something... +}) +``` diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/tooltips.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/tooltips.md new file mode 100644 index 000000000..91adacc7f --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/components/tooltips.md @@ -0,0 +1,292 @@ +--- +layout: docs +title: Tooltips +description: Documentation and examples for adding custom Bootstrap tooltips with CSS and JavaScript using CSS3 for animations and data-bs-attributes for local title storage. +group: components +toc: true +--- + +## Overview + +Things to know when using the tooltip plugin: + +- Tooltips rely on the third party library [Popper](https://popper.js.org/) for positioning. You must include [popper.min.js]({{< param "cdn.popper" >}}) before `bootstrap.js`, or use one `bootstrap.bundle.min.js` which contains Popper. +- Tooltips are opt-in for performance reasons, so **you must initialize them yourself**. +- Tooltips with zero-length titles are never displayed. +- Specify `container: 'body'` to avoid rendering problems in more complex components (like our input groups, button groups, etc). +- Triggering tooltips on hidden elements will not work. +- Tooltips for `.disabled` or `disabled` elements must be triggered on a wrapper element. +- When triggered from hyperlinks that span multiple lines, tooltips will be centered. Use `white-space: nowrap;` on your ``s to avoid this behavior. +- Tooltips must be hidden before their corresponding elements have been removed from the DOM. +- Tooltips can be triggered thanks to an element inside a shadow DOM. + +Got all that? Great, let's see how they work with some examples. + +{{< callout info >}} +{{< partial "callouts/info-sanitizer.md" >}} +{{< /callout >}} + +{{< callout info >}} +{{< partial "callouts/info-prefersreducedmotion.md" >}} +{{< /callout >}} + +## Examples + +### Enable tooltips + +As mentioned above, you must initialize tooltips before they can be used. One way to initialize all tooltips on a page would be to select them by their `data-bs-toggle` attribute, like so: + +```js +const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') +const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) +``` + +### Tooltips on links + +Hover over the links below to see tooltips: + +{{< example class="tooltip-demo" stackblitz_add_js="true" >}} +

    Placeholder text to demonstrate some inline links with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of real text. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how these tooltips on links can work in practice, once you use them on your own site or project.

    +{{< /example >}} + +{{< callout warning >}} +{{< partial "callouts/warning-data-bs-title-vs-title.md" >}} +{{< /callout >}} + +### Custom tooltips + +{{< added-in "5.2.0" >}} + +You can customize the appearance of tooltips using [CSS variables](#variables). We set a custom class with `data-bs-custom-class="custom-tooltip"` to scope our custom appearance and use it to override a local CSS variable. + +{{< scss-docs name="custom-tooltip" file="site/assets/scss/_component-examples.scss" >}} + + +{{< example class="tooltip-demo" stackblitz_add_js="true" >}} + +{{< /example >}} + +### Directions + +Hover over the buttons below to see the four tooltips directions: top, right, bottom, and left. Directions are mirrored when using Bootstrap in RTL. + +
    +
    + + + + + +
    +
    + +```html + + + + +``` + +And with custom HTML added: + +```html + +``` + +With an SVG: + + + +## CSS + +### Variables + +{{< added-in "5.2.0" >}} + +As part of Bootstrap’s evolving CSS variables approach, tooltips now use local CSS variables on `.tooltip` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too. + +{{< scss-docs name="tooltip-css-vars" file="scss/_tooltip.scss" >}} + +### Sass variables + +{{< scss-docs name="tooltip-variables" file="scss/_variables.scss" >}} + +## Usage + +The tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element. Trigger the tooltip via JavaScript: + +```js +const exampleEl = document.getElementById('example') +const tooltip = new bootstrap.Tooltip(exampleEl, options) +``` + +{{< callout warning >}} +Tooltips automatically attempt to change positions when a parent container has `overflow: auto` or `overflow: scroll`, but still keeps the original placement's positioning. Set the [`boundary` option](https://popper.js.org/docs/v2/modifiers/flip/#boundary) (for the flip modifier using the `popperConfig` option) to any HTMLElement to override the default value, `'clippingParents'`, such as `document.body`: + +```js +const tooltip = new bootstrap.Tooltip('#example', { + boundary: document.body // or document.querySelector('#boundary') +}) +``` +{{< /callout >}} + +### Markup + +The required markup for a tooltip is only a `data` attribute and `title` on the HTML element you wish to have a tooltip. The generated markup of a tooltip is rather simple, though it does require a position (by default, set to `top` by the plugin). + +{{< callout warning >}} +**Keep tooltips accessible to keyboard and assistive technology users** by only adding them to HTML elements that are traditionally keyboard-focusable and interactive (such as links or form controls). While other HTML elements can be made focusable by adding `tabindex="0"`, this can create annoying and confusing tab stops on non-interactive elements for keyboard users, and most assistive technologies currently do not announce tooltips in this situation. Additionally, do not rely solely on `hover` as the trigger for your tooltips as this will make them impossible to trigger for keyboard users. +{{< /callout >}} + +```html + +Hover over me + + + +``` + +### Disabled elements + +Elements with the `disabled` attribute aren't interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you'll want to trigger the tooltip from a wrapper `
    ` or ``, ideally made keyboard-focusable using `tabindex="0"`. + +{{< example class="tooltip-demo" stackblitz_add_js="true" >}} + + + +{{< /example >}} + +### Options + +{{< markdown >}} +{{< partial "js-data-attributes.md" >}} +{{< /markdown >}} + +{{< callout warning >}} +Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` options cannot be supplied using data attributes. +{{< /callout >}} + + +{{< bs-table "table" >}} +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `allowList` | object | [Default value]({{< docsref "/getting-started/javascript#sanitizer" >}}) | Object which contains allowed attributes and tags. | +| `animation` | boolean | `true` | Apply a CSS fade transition to the tooltip. | +| `boundary` | string, element | `'clippingParents'` | Overflow constraint boundary of the tooltip (applies only to Popper's preventOverflow modifier). By default, it's `'clippingParents'` and can accept an HTMLElement reference (via JavaScript only). For more information refer to Popper's [detectOverflow docs](https://popper.js.org/docs/v2/utils/detect-overflow/#boundary). | +| `container` | string, element, false | `false` | Appends the tooltip to a specific element. Example: `container: 'body'`. This option is particularly useful in that it allows you to position the tooltip in the flow of the document near the triggering element - which will prevent the tooltip from floating away from the triggering element during a window resize. | +| `customClass` | string, function | `''` | Add classes to the tooltip when it is shown. Note that these classes will be added in addition to any classes specified in the template. To add multiple classes, separate them with spaces: `'class-1 class-2'`. You can also pass a function that should return a single string containing additional class names. | +| `delay` | number, object | `0` | Delay showing and hiding the tooltip (ms)—doesn't apply to manual trigger type. If a number is supplied, delay is applied to both hide/show. Object structure is: `delay: { "show": 500, "hide": 100 }`. | +| `fallbackPlacements` | array | `['top', 'right', 'bottom', 'left']` | Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to Popper's [behavior docs](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements). | +| `html` | boolean | `false` | Allow HTML in the tooltip. If true, HTML tags in the tooltip's `title` will be rendered in the tooltip. If false, `innerText` property will be used to insert content into the DOM. Use text if you're worried about XSS attacks. | +| `offset` | array, string, function | `[0, 0]` | Offset of the tooltip relative to its target. You can pass a string in data attributes with comma separated values like: `data-bs-offset="10,20"`. When a function is used to determine the offset, it is called with an object containing the popper placement, the reference, and popper rects as its first argument. The triggering element DOM node is passed as the second argument. The function must return an array with two numbers: [skidding](https://popper.js.org/docs/v2/modifiers/offset/#skidding-1), [distance](https://popper.js.org/docs/v2/modifiers/offset/#distance-1). For more information refer to Popper's [offset docs](https://popper.js.org/docs/v2/modifiers/offset/#options). | +| `placement` | string, function | `'top'` | How to position the tooltip: auto, top, bottom, left, right. When `auto` is specified, it will dynamically reorient the tooltip. When a function is used to determine the placement, it is called with the tooltip DOM node as its first argument and the triggering element DOM node as its second. The `this` context is set to the tooltip instance. | +| `popperConfig` | null, object, function | `null` | To change Bootstrap's default Popper config, see [Popper's configuration](https://popper.js.org/docs/v2/constructors/#options). When a function is used to create the Popper configuration, it's called with an object that contains the Bootstrap's default Popper configuration. It helps you use and merge the default with your own configuration. The function must return a configuration object for Popper. | +| `sanitize` | boolean | `true` | Enable or disable the sanitization. If activated `'template'`, `'content'` and `'title'` options will be sanitized. | +| `sanitizeFn` | null, function | `null` | Here you can supply your own sanitize function. This can be useful if you prefer to use a dedicated library to perform sanitization. | +| `selector` | string, false | `false` | If a selector is provided, tooltip objects will be delegated to the specified targets. In practice, this is used to also apply tooltips to dynamically added DOM elements (`jQuery.on` support). See [this issue]({{< param repo >}}/issues/4215) and [an informative example](https://codepen.io/Johann-S/pen/djJYPb). **Note**: `title` attribute must not be used as a selector. | +| `template` | string | `''` | Base HTML to use when creating the tooltip. The tooltip's `title` will be injected into the `.tooltip-inner`. `.tooltip-arrow` will become the tooltip's arrow. The outermost wrapper element should have the `.tooltip` class and `role="tooltip"`. | +| `title` | string, element, function | `''` | The tooltip title. If a function is given, it will be called with its `this` reference set to the element that the popover is attached to. | +| `trigger` | string | `'hover focus'` | How tooltip is triggered: click, hover, focus, manual. You may pass multiple triggers; separate them with a space. `'manual'` indicates that the tooltip will be triggered programmatically via the `.tooltip('show')`, `.tooltip('hide')` and `.tooltip('toggle')` methods; this value cannot be combined with any other trigger. `'hover'` on its own will result in tooltips that cannot be triggered via the keyboard, and should only be used if alternative methods for conveying the same information for keyboard users is present. | +{{< /bs-table >}} + +{{< callout info >}} +#### Data attributes for individual tooltips + +Options for individual tooltips can alternatively be specified through the use of data attributes, as explained above. +{{< /callout >}} + +#### Using function with `popperConfig` + +```js +const tooltip = new bootstrap.Tooltip(element, { + popperConfig(defaultBsPopperConfig) { + // const newPopperConfig = {...} + // use defaultBsPopperConfig if needed... + // return newPopperConfig + } +}) +``` + +### Methods + +{{< callout danger >}} +{{< partial "callouts/danger-async-methods.md" >}} +{{< /callout >}} + +{{< bs-table "table" >}} +| Method | Description | +| --- | --- | +| `disable` | Removes the ability for an element's tooltip to be shown. The tooltip will only be able to be shown if it is re-enabled. | +| `dispose` | Hides and destroys an element's tooltip (Removes stored data on the DOM element). Tooltips that use delegation (which are created using [the `selector` option](#options)) cannot be individually destroyed on descendant trigger elements. | +| `enable` | Gives an element's tooltip the ability to be shown. **Tooltips are enabled by default.** | +| `getInstance` | *Static* method which allows you to get the tooltip instance associated with a DOM element, or create a new one in case it wasn't initialized. | +| `getOrCreateInstance` | *Static* method which allows you to get the tooltip instance associated with a DOM element, or create a new one in case it wasn't initialized. | +| `hide` | Hides an element's tooltip. **Returns to the caller before the tooltip has actually been hidden** (i.e. before the `hidden.bs.tooltip` event occurs). This is considered a "manual" triggering of the tooltip. | +| `setContent` | Gives a way to change the tooltip's content after its initialization. | +| `show` | Reveals an element's tooltip. **Returns to the caller before the tooltip has actually been shown** (i.e. before the `shown.bs.tooltip` event occurs). This is considered a "manual" triggering of the tooltip. Tooltips with zero-length titles are never displayed. | +| `toggle` | Toggles an element's tooltip. **Returns to the caller before the tooltip has actually been shown or hidden** (i.e. before the `shown.bs.tooltip` or `hidden.bs.tooltip` event occurs). This is considered a "manual" triggering of the tooltip. | +| `toggleEnabled` | Toggles the ability for an element's tooltip to be shown or hidden. | +| `update` | Updates the position of an element's tooltip. | +{{< /bs-table >}} + +```js +const tooltip = bootstrap.Tooltip.getInstance('#example') // Returns a Bootstrap tooltip instance + +// setContent example +tooltip.setContent({ '.tooltip-inner': 'another title' }) + +``` + +{{< callout info >}} +The `setContent` method accepts an `object` argument, where each property-key is a valid `string` selector within the tooltip template, and each related property-value can be `string` | `element` | `function` | `null` +{{< /callout >}} + +### Events + +{{< bs-table >}} +| Event | Description | +| --- | --- | +| `hide.bs.tooltip` | This event is fired immediately when the `hide` instance method has been called. | +| `hidden.bs.tooltip` | This event is fired when the tooltip has finished being hidden from the user (will wait for CSS transitions to complete). | +| `inserted.bs.tooltip` | This event is fired after the `show.bs.tooltip` event when the tooltip template has been added to the DOM. | +| `show.bs.tooltip` | This event fires immediately when the `show` instance method is called. | +| `shown.bs.tooltip` | This event is fired when the tooltip has been made visible to the user (will wait for CSS transitions to complete). | +{{< /bs-table >}} + +```js +const myTooltipEl = document.getElementById('myTooltip') +const tooltip = bootstrap.Tooltip.getOrCreateInstance(myTooltipEl) + +myTooltipEl.addEventListener('hidden.bs.tooltip', () => { + // do something... +}) + +tooltip.hide() +``` diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/content/figures.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/content/figures.md similarity index 97% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/content/figures.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/content/figures.md index 29a38d723..985113709 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/content/figures.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/content/figures.md @@ -26,8 +26,8 @@ Aligning the figure's caption is easy with our [text utilities]({{< docsref "/ut {{< /example >}} -## Sass +## CSS -### Variables +### Sass variables {{< scss-docs name="figure-variables" file="scss/_variables.scss" >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/content/images.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/content/images.md similarity index 98% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/content/images.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/content/images.md index 9d13ef4fb..02795617f 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/content/images.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/content/images.md @@ -48,15 +48,15 @@ Align images with the [helper float classes]({{< docsref "/utilities/float" >}}) If you are using the `` element to specify multiple `` elements for a specific ``, make sure to add the `.img-*` classes to the `` and not to the `` tag. ```html -​ + ... ``` -## Sass +## CSS -### Variables +### Sass variables Variables are available for image thumbnails. diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/content/reboot.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/content/reboot.md similarity index 77% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/content/reboot.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/content/reboot.md index 63f892de2..ef2bd13bc 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/content/reboot.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/content/reboot.md @@ -3,7 +3,7 @@ layout: docs title: Reboot description: Reboot, a collection of element-specific CSS changes in a single file, kickstart Bootstrap to provide an elegant, consistent, and simple baseline to build upon. group: content -aliases: "/docs/5.1/content/" +aliases: "/docs/5.3/content/" toc: true --- @@ -20,9 +20,25 @@ Here are our guidelines and reasons for choosing what to override in Reboot: ## CSS variables -Added in v5.1.1 +{{< added-in "5.2.0" >}} -With v5.1.1, we standardized our required `@import`s across all our CSS bundles (including `bootstrap.css`, `bootstrap-reboot.css`, and `bootstrap-grid.css` to include `_root.scss` . This adds `:root` level CSS variables to all bundles, regardless of how many of them are used in that bundle. Ultimately Bootstrap 5 will continue to see more CSS variables added over time. +With v5.1.1, we standardized our required `@import`s across all our CSS bundles (including `bootstrap.css`, `bootstrap-reboot.css`, and `bootstrap-grid.css`) to include `_root.scss`. This adds `:root` level CSS variables to all bundles, regardless of how many of them are used in that bundle. Ultimately Bootstrap 5 will continue to see more [CSS variables]({{< docsref "/customize/css-variables" >}}) added over time, in order to provide more real-time customization without the need to always recompile Sass. Our approach is to take our source Sass variables and transform them into CSS variables. That way, even if you don't use CSS variables, you still have all the power of Sass. **This is still in-progress and will take time to fully implement.** + +For example, consider these `:root` CSS variables for common `` styles: + +{{< scss-docs name="root-body-variables" file="scss/_root.scss" >}} + +In practice, those variables are then applied in Reboot like so: + +{{< scss-docs name="reboot-body-rules" file="scss/_reboot.scss" >}} + +Which allows you to make real-time customizations however you like: + +```html + + + +``` ## Page defaults @@ -47,91 +63,81 @@ $font-family-sans-serif: "Segoe UI", // Android Roboto, - // Basic web fallback - "Helvetica Neue", Arial, + // older macOS and iOS + "Helvetica Neue" // Linux "Noto Sans", "Liberation Sans", + // Basic web fallback + Arial, // Sans serif fallback sans-serif, // Emoji fonts "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; ``` -Note that because the font stack includes emoji fonts, many common symbol/dingbat unicode characters will be rendered as multi-colored pictographs. Their appearance will vary, depending on the style used in the browser/platform's native emoji font, and they won't be affected by any CSS `color` styles. +Note that because the font stack includes emoji fonts, many common symbol/dingbat Unicode characters will be rendered as multicolored pictographs. Their appearance will vary, depending on the style used in the browser/platform's native emoji font, and they won't be affected by any CSS `color` styles. This `font-family` is applied to the `` and automatically inherited globally throughout Bootstrap. To switch the global `font-family`, update `$font-family-base` and recompile Bootstrap. -## CSS variables +## Headings -As Bootstrap 5 continues to mature, more and more styles will be built with [CSS variables]({{< docsref "/customize/css-variables" >}}) as a means to provide more real-time customization without the need to always recompile Sass. Our approach is to take our source Sass variables and transform them into CSS variables. That way, even if you don't use CSS variables, you still have all the power of Sass. **This is still in-progress and will take time to fully implement.** +All heading elements—`

    `—`

    ` have their `margin-top` removed, `margin-bottom: .5rem` set, and `line-height` tightened. While headings inherit their `color` by default, you can also override it via optional CSS variable, `--bs-heading-color`. -For example, consider these `:root` CSS variables for common `` styles: +{{< bs-table "table" >}} +| Heading | Example | +| --- | --- | +| `

    ` | h1. Bootstrap heading | +| `

    ` | h2. Bootstrap heading | +| `

    ` | h3. Bootstrap heading | +| `

    ` | h4. Bootstrap heading | +| `
    ` | h5. Bootstrap heading | +| `
    ` | h6. Bootstrap heading | +{{< /bs-table >}} -{{< scss-docs name="root-body-variables" file="scss/_root.scss" >}} +## Paragraphs -In practice, those variables are then applied in Reboot like so: +All `

    ` elements have their `margin-top` removed and `margin-bottom: 1rem` set for easy spacing. -{{< scss-docs name="reboot-body-rules" file="scss/_reboot.scss" >}} +{{< example >}} +

    This is an example paragraph.

    +{{< /example >}} -Which allows you to make real-time customizations however you like: +## Links -```html - - - -``` +Links have a default `color` and underline applied. While links change on `:hover`, they don't change based on whether someone `:visited` the link. They also receive no special `:focus` styles. -## Headings and paragraphs +{{< example >}} +This is an example link +{{< /example >}} -All heading elements—e.g., `

    `—and `

    ` are reset to have their `margin-top` removed. Headings have `margin-bottom: .5rem` added and paragraphs `margin-bottom: 1rem` for easy spacing. +As of v5.3.x, link `color` is set using `rgba()` and new `-rgb` CSS variables, allowing for easy customization of link color opacity. Change the link color opacity with the `--bs-link-opacity` CSS variable: + +{{< example >}} +This is an example link +{{< /example >}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    HeadingExample
    - {{< markdown >}}`

    `{{< /markdown >}} -
    h1. Bootstrap heading
    - {{< markdown >}}`

    `{{< /markdown >}} -
    h2. Bootstrap heading
    - {{< markdown >}}`

    `{{< /markdown >}} -
    h3. Bootstrap heading
    - {{< markdown >}}`

    `{{< /markdown >}} -
    h4. Bootstrap heading
    - {{< markdown >}}`
    `{{< /markdown >}} -
    h5. Bootstrap heading
    - {{< markdown >}}`
    `{{< /markdown >}} -
    h6. Bootstrap heading
    + +Placeholder links—those without an `href`—are targeted with a more specific selector and have their `color` and `text-decoration` reset to their default values. + +{{< example >}} +This is a placeholder link +{{< /example >}} + +## Horizontal rules + +The `


    ` element has been simplified. Similar to browser defaults, `
    `s are styled via `border-top`, have a default `opacity: .25`, and automatically inherit their `border-color` via `color`, including when `color` is set via the parent. They can be modified with text, border, and opacity utilities. + +{{< example >}} +
    + +
    +
    +
    + +
    +
    +{{< /example >}} ## Lists @@ -199,7 +205,7 @@ Use the `` to indicate input that is typically entered via keyboard. {{< example >}} To switch directories, type cd followed by the name of the directory.
    -To edit settings, press ctrl + , +To edit settings, press Ctrl + , {{< /example >}} ## Sample output @@ -214,41 +220,41 @@ For indicating sample output from a program use the `` tag. Tables are slightly adjusted to style ``s, collapse borders, and ensure consistent `text-align` throughout. Additional changes for borders, padding, and more come with [the `.table` class]({{< docsref "/content/tables" >}}). -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - This is an example table, and this is its caption to describe the contents. -
    Table headingTable headingTable headingTable heading
    Table cellTable cellTable cellTable cell
    Table cellTable cellTable cellTable cell
    Table cellTable cellTable cellTable cell
    -
    +{{< example >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + This is an example table, and this is its caption to describe the contents. +
    Table headingTable headingTable headingTable heading
    Table cellTable cellTable cellTable cell
    Table cellTable cellTable cellTable cell
    Table cellTable cellTable cellTable cell
    +{{< /example >}} ## Forms @@ -263,6 +269,10 @@ Various form elements have been rebooted for simpler base styles. Here are some These changes, and more, are demonstrated below. +{{< callout warning >}} +{{< partial "callouts/warning-input-support.md" >}} +{{< /callout >}} +
    Example legend @@ -385,10 +395,6 @@ These changes, and more, are demonstrated below.
    -{{< callout warning >}} -{{< partial "callout-warning-input-support.md" >}} -{{< /callout >}} - ### Pointers on buttons Reboot includes an enhancement for `role="button"` to change the default cursor to `pointer`. Add this attribute to elements to help indicate elements are interactive. This role isn't necessary for ` + +

    + + +{{< /example >}} + +## How it works + +- As shown above, color mode styles are controlled by the `data-bs-theme` attribute. This attribute can be applied to the `` element, or to any other element or Bootstrap component. If applied to the `` element, it will apply to everything. If applied to a component or element, it will be scoped to that specific component or element. + +- For each color mode you wish to support, you'll need to add new overrides for the shared global CSS variables. We do this already in our `_root.scss` stylesheet for dark mode, with light mode being the default values. In writing color mode specific styles, use the mixin: + + ```scss + // Color mode variables in _root.scss + @include color-mode(dark) { + // CSS variable overrides here... + } + ``` + +- We use a custom `_variables-dark.scss` to power those shared global CSS variable overrides for dark mode. This file isn't required for your own custom color modes, but it's required for our dark mode for two reasons. First, it's better to have a single place to reset global colors. Second, some Sass variables had to be overridden for background images embedded in our CSS for accordions, form components, and more. + +## Usage + +### Enable dark mode + +Enable the built in dark color mode across your entire project by adding the `data-bs-theme="dark"` attribute to the `` element. This will apply the dark color mode to all components and elements, other than those with a specific `data-bs-theme` attribute applied. Building on the [quick start template]({{< docsref "/getting-started/introduction#quick-start" >}}): + +```html + + + + + + Bootstrap demo + }}" rel="stylesheet" integrity="{{< param "cdn.css_hash" >}}" crossorigin="anonymous"> + + +

    Hello, world!

    + + + +``` + +Bootstrap does not yet ship with a built-in color mode picker, but you can use the one from our own documentation if you like. [Learn more in the JavaScript section.](#javascript) + +### Building with Sass + +Our new dark mode option is available to use for all users of Bootstrap, but it's controlled via data attributes instead of media queries and does not automatically toggle your project's color mode. You can disable our dark mode entirely via Sass by changing `$enable-dark-mode` to `false`. + +We use a custom Sass mixin, `color-mode()`, to help you control _how_ color modes are applied. By default, we use a `data` attribute approach, allowing you to create more user-friendly experiences where your visitors can choose to have an automatic dark mode or control their preference (like in our own docs here). This is also an easy and scalable way to add different themes and more custom color modes beyond light and dark. + +In case you want to use media queries and only make color modes automatic, you can change the mixin's default type via Sass variable. Consider the following snippet and its compiled CSS output. + +```scss +$color-mode-type: data; + +@include color-mode(dark) { + .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } +} +``` + +Outputs to: + +```css +[data-bs-theme=dark] .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); +} +``` + +And when setting to `media-query`: + +```scss +$color-mode-type: media-query; + +@include color-mode(dark) { + .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } +} +``` + +Outputs to: + +```css +@media (prefers-color-scheme: dark) { + .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } +} +``` + +## Custom color modes + +While the primary use case for color modes is light and dark mode, custom color modes are also possible. Create your own `data-bs-theme` selector with a custom value as the name of your color mode, then modify our Sass and CSS variables as needed. We opted to create a separate `_variables-dark.scss` stylesheet to house Bootstrap's dark mode specific Sass variables, but that's not required for you. + +For example, you can create a "blue theme" with the selector `data-bs-theme="blue"`. In your custom Sass or CSS file, add the new selector and override any global or component CSS variables as needed. If you're using Sass, you can also use Sass's functions within your CSS variable overrides. + +{{< scss-docs name="custom-color-mode" file="site/assets/scss/_content.scss" >}} + +
    +
    Example blue theme
    +

    Some paragraph text to show how the blue theme might look with written copy.

    + +
    + + +
    + +```html +
    + ... +
    +``` + +## JavaScript + +To allow visitors or users to toggle color modes, you'll need to create a toggle element to control the `data-bs-theme` attribute on the root element, ``. We've built a toggler in our documentation that initially defers to a user's current system color mode, but provides an option to override that and pick a specific color mode. + +Here's a look at the JavaScript that powers it. Feel free to inspect our own documentation navbar to see how it's implemented using HTML and CSS from our own components. It is suggested to include the JavaScript at the top of your page to reduce potential screen flickering during reloading of your site. Note that if you decide to use media queries for your color modes, your JavaScript may need to be modified or removed if you prefer an implicit control. + +{{< example lang="js" show_preview="false" >}} +{{< js.inline >}} +{{- readFile (path.Join "site/static/docs" .Site.Params.docs_version "assets/js/color-modes.js") -}} +{{< /js.inline >}} +{{< /example >}} + +## Adding theme colors + +Adding a new color in `$theme-colors` is not enough for some of our components like [alerts]({{< docsref "/components/alerts" >}}) and [list groups]({{< docsref "/components/list-group" >}}). New colors must also be defined in `$theme-colors-text`, `$theme-colors-bg-subtle`, and `$theme-colors-border-subtle` for light theme; but also in `$theme-colors-text-dark`, `$theme-colors-bg-subtle-dark`, and `$theme-colors-border-subtle-dark` for dark theme. + +This is a manual process because Sass cannot generate its own Sass variables from an existing variable or map. In future versions of Bootstrap, we'll revisit this setup to reduce the duplication. + +```scss +// Required +@import "functions"; +@import "variables"; +@import "variables-dark"; + +// Add a custom color to $theme-colors +$custom-colors: ( + "custom-color": #712cf9 +); +$theme-colors: map-merge($theme-colors, $custom-colors); + +@import "maps"; +@import "mixins"; +@import "utilities"; + +// Add a custom color to new theme maps + +// Light mode +$custom-colors-text: ("custom-color": #712cf9); +$custom-colors-bg-subtle: ("custom-color": #e1d2fe); +$custom-colors-border-subtle: ("custom-color": #bfa1fc); + +$theme-colors-text: map-merge($theme-colors-text, $custom-colors-text); +$theme-colors-bg-subtle: map-merge($theme-colors-bg-subtle, $custom-colors-bg-subtle); +$theme-colors-border-subtle: map-merge($theme-colors-border-subtle, $custom-colors-border-subtle); + +// Dark mode +$custom-colors-text-dark: ("custom-color": #e1d2f2); +$custom-colors-bg-subtle-dark: ("custom-color": #8951fa); +$custom-colors-border-subtle-dark: ("custom-color": #e1d2f2); + +$theme-colors-text-dark: map-merge($theme-colors-text-dark, $custom-colors-text-dark); +$theme-colors-bg-subtle-dark: map-merge($theme-colors-bg-subtle-dark, $custom-colors-bg-subtle-dark); +$theme-colors-border-subtle-dark: map-merge($theme-colors-border-subtle-dark, $custom-colors-border-subtle-dark); + +// Remainder of Bootstrap imports +@import "root"; +@import "reboot"; +// etc +``` + +## CSS + +### Variables + +Dozens of root level CSS variables are repeated as overrides for dark mode. These are scoped to the color mode selector, which defaults to `data-bs-theme` but [can be configured](#building-with-sass) to use a `prefers-color-scheme` media query. Use these variables as a guideline for generating your own new color modes. + +{{< scss-docs name="root-dark-mode-vars" file="scss/_root.scss" >}} + +### Sass variables + +CSS variables for our dark color mode are partially generated from dark mode specific Sass variables in `_variables-dark.scss`. This also includes some custom overrides for changing the colors of embedded SVGs used throughout our components. + +{{< scss-docs name="sass-dark-mode-vars" file="scss/_variables-dark.scss" >}} + +### Sass mixins + +Styles for dark mode, and any custom color modes you create, can be scoped appropriately to the `data-bs-theme` attribute selector or media query with the customizable `color-mode()` mixin. See the [Sass usage section](#building-with-sass) for more details. + +{{< scss-docs name="color-mode-mixin" file="scss/mixins/_color-mode.scss" >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/color.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/color.md new file mode 100644 index 000000000..6a3c323b0 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/color.md @@ -0,0 +1,510 @@ +--- +layout: docs +title: Color +description: Bootstrap is supported by an extensive color system that themes our styles and components. This enables more comprehensive customization and extension for any project. +group: customize +toc: true +--- + +## Colors + +{{< added-in "5.3.0" >}} + +Bootstrap's color palette has continued to expand and become more nuanced in v5.3.0. We've added new variables for `secondary` and `tertiary` text and background colors, plus `{color}-bg-subtle`, `{color}-border-subtle`, and `{color}-text-emphasis` for our theme colors. These new colors are available through Sass and CSS variables (but not our color maps or utility classes) with the express goal of making it easier to customize across multiple colors modes like light and dark. These new variables are globally set on `:root` and are adapted for our new dark color mode while our original theme colors remain unchanged. + +Colors ending in `-rgb` provide the `red, green, blue` values for use in `rgb()` and `rgba()` color modes. For example, `rgba(var(--bs-secondary-bg-rgb), .5)`. + +{{< callout warning>}} +**Heads up!** There's some potential confusion with our new secondary and tertiary colors, and our existing secondary theme color, as well as our light and dark theme colors. Expect this to be ironed out in v6. +{{< /callout >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DescriptionSwatchVariables
    + {{< markdown >}}**Body —** Default foreground (color) and background, including components.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-body-color`
    `--bs-body-color-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-body-bg`
    `--bs-body-bg-rgb`{{< /markdown >}} +
    + {{< markdown >}}**Secondary —** Use the `color` option for lighter text. Use the `bg` option for dividers and to indicate disabled component states.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-secondary-color`
    `--bs-secondary-color-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-secondary-bg`
    `--bs-secondary-bg-rgb`{{< /markdown >}} +
    + {{< markdown >}}**Tertiary —** Use the `color` option for even lighter text. Use the `bg` option to style backgrounds for hover states, accents, and wells.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-tertiary-color`
    `--bs-tertiary-color-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-tertiary-bg`
    `--bs-tertiary-bg-rgb`{{< /markdown >}} +
    + {{< markdown >}}**Emphasis —** For higher contrast text. Not applicable for backgrounds.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-emphasis-color`
    `--bs-emphasis-color-rgb`{{< /markdown >}} +
    + {{< markdown >}}**Border —** For component borders, dividers, and rules. Use `--bs-border-color-translucent` to blend with backgrounds with an `rgba()` value.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-border-color`
    `--bs-border-color-rgb`{{< /markdown >}} +
    + {{< markdown >}}**Primary —** Main theme color, used for hyperlinks, focus styles, and component and form active states.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-primary`
    `--bs-primary-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-primary-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-primary-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-primary-text-emphasis`{{< /markdown >}} +
    + {{< markdown >}}**Success —** Theme color used for positive or successful actions and information.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-success`
    `--bs-success-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-success-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-success-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-success-text-emphasis`{{< /markdown >}} +
    + {{< markdown >}}**Danger —** Theme color used for errors and dangerous actions.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-danger`
    `--bs-danger-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-danger-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-danger-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-danger-text-emphasis`{{< /markdown >}} +
    + {{< markdown >}}**Warning —** Theme color used for non-destructive warning messages.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-warning`
    `--bs-warning-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-warning-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-warning-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-warning-text-emphasis`{{< /markdown >}} +
    + {{< markdown >}}**Info —** Theme color used for neutral and informative content.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-info`
    `--bs-info-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-info-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-info-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-info-text-emphasis`{{< /markdown >}} +
    + {{< markdown >}}**Light —** Additional theme option for less contrasting colors.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-light`
    `--bs-light-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-light-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-light-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-light-text-emphasis`{{< /markdown >}} +
    + {{< markdown >}}**Dark —** Additional theme option for higher contrasting colors.{{< /markdown >}} + +
     
    +
    + {{< markdown >}}`--bs-dark`
    `--bs-dark-rgb`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-dark-bg-subtle`{{< /markdown >}} +
    +
     
    +
    + {{< markdown >}}`--bs-dark-border-subtle`{{< /markdown >}} +
    +
    Text
    +
    + {{< markdown >}}`--bs-dark-text-emphasis`{{< /markdown >}} +
    + +### Using the new colors + +These new colors are accessible via CSS variables and utility classes—like `--bs-primary-bg-subtle` and `.bg-primary-subtle`—allowing you to compose your own CSS rules with the variables, or to quickly apply styles via classes. The utilities are built with the color's associated CSS variables, and since we customize those CSS variables for dark mode, they are also adaptive to color mode by default. + +{{< example >}} +
    + Example element with utilities +
    +{{< /example >}} + +### Theme colors + +We use a subset of all colors to create a smaller color palette for generating color schemes, also available as Sass variables and a Sass map in Bootstrap's `scss/_variables.scss` file. + +
    + {{< theme-colors.inline >}} + {{- range (index $.Site.Data "theme-colors") }} +
    +
    {{ .name | title }}
    +
    + {{ end -}} + {{< /theme-colors.inline >}} +
    + +All these colors are available as a Sass map, `$theme-colors`. + +{{< scss-docs name="theme-colors-map" file="scss/_variables.scss" >}} + +Check out [our Sass maps and loops docs]({{< docsref "/customize/sass#maps-and-loops" >}}) for how to modify these colors. + +### All colors + +All Bootstrap colors are available as Sass variables and a Sass map in `scss/_variables.scss` file. To avoid increased file sizes, we don't create text or background color classes for each of these variables. Instead, we choose a subset of these colors for a [theme palette](#theme-colors). + +Be sure to monitor contrast ratios as you customize colors. As shown below, we've added three contrast ratios to each of the main colors—one for the swatch's current colors, one for against white, and one for against black. + +
    + {{< theme-colors.inline >}} + {{- range $color := $.Site.Data.colors }} + {{- if (and (not (eq $color.name "white")) (not (eq $color.name "gray")) (not (eq $color.name "gray-dark"))) }} +
    +
    + ${{ $color.name }} + {{ $color.hex }} +
    + {{ range (seq 100 100 900) }} +
    ${{ $color.name }}-{{ . }}
    + {{ end }} +
    + {{ end -}} + {{ end -}} + +
    +
    + $gray-500 + #adb5bd +
    + {{- range $.Site.Data.grays }} +
    $gray-{{ .name }}
    + {{ end -}} +
    + {{< /theme-colors.inline >}} + +
    +
    + $black + #000 +
    +
    + $white + #fff +
    +
    +
    + +### Notes on Sass + +Sass cannot programmatically generate variables, so we manually created variables for every tint and shade ourselves. We specify the midpoint value (e.g., `$blue-500`) and use custom color functions to tint (lighten) or shade (darken) our colors via Sass's `mix()` color function. + +Using `mix()` is not the same as `lighten()` and `darken()`—the former blends the specified color with white or black, while the latter only adjusts the lightness value of each color. The result is a much more complete suite of colors, as [shown in this CodePen demo](https://codepen.io/emdeoh/pen/zYOQOPB). + +Our `tint-color()` and `shade-color()` functions use `mix()` alongside our `$theme-color-interval` variable, which specifies a stepped percentage value for each mixed color we produce. See the `scss/_functions.scss` and `scss/_variables.scss` files for the full source code. + +## Color Sass maps + +Bootstrap's source Sass files include three maps to help you quickly and easily loop over a list of colors and their hex values. + +- `$colors` lists all our available base (`500`) colors +- `$theme-colors` lists all semantically named theme colors (shown below) +- `$grays` lists all tints and shades of gray + +Within `scss/_variables.scss`, you'll find Bootstrap's color variables and Sass map. Here's an example of the `$colors` Sass map: + +{{< scss-docs name="colors-map" file="scss/_variables.scss" >}} + +Add, remove, or modify values within the map to update how they're used in many other components. Unfortunately at this time, not _every_ component utilizes this Sass map. Future updates will strive to improve upon this. Until then, plan on making use of the `${color}` variables and this Sass map. + +### Example + +Here's how you can use these in your Sass: + +```scss +.alpha { color: $purple; } +.beta { + color: $yellow-300; + background-color: $indigo-900; +} +``` + +[Color]({{< docsref "/utilities/colors" >}}) and [background]({{< docsref "/utilities/background" >}}) utility classes are also available for setting `color` and `background-color` using the `500` color values. + +## Generating utilities + +{{< added-in "5.1.0" >}} + +Bootstrap doesn't include `color` and `background-color` utilities for every color variable, but you can generate these yourself with our [utility API]({{< docsref "/utilities/api" >}}) and our extended Sass maps added in v5.1.0. + +1. To start, make sure you've imported our functions, variables, mixins, and utilities. +2. Use our `map-merge-multiple()` function to quickly merge multiple Sass maps together in a new map. +3. Merge this new combined map to extend any utility with a `{color}-{level}` class name. + +Here's an example that generates text color utilities (e.g., `.text-purple-500`) using the above steps. + +```scss +@import "bootstrap/scss/functions"; +@import "bootstrap/scss/variables"; +@import "bootstrap/scss/variables-dark"; +@import "bootstrap/scss/maps"; +@import "bootstrap/scss/mixins"; +@import "bootstrap/scss/utilities"; + +$all-colors: map-merge-multiple($blues, $indigos, $purples, $pinks, $reds, $oranges, $yellows, $greens, $teals, $cyans); + +$utilities: map-merge( + $utilities, + ( + "color": map-merge( + map-get($utilities, "color"), + ( + values: map-merge( + map-get(map-get($utilities, "color"), "values"), + ( + $all-colors + ), + ), + ), + ), + ) +); + +@import "bootstrap/scss/utilities/api"; +``` + +This will generate new `.text-{color}-{level}` utilities for every color and level. You can do the same for any other utility and property as well. diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/components.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/components.md similarity index 96% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/components.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/components.md index b512a9036..262c8d8c6 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/components.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/components.md @@ -34,7 +34,7 @@ Should you modify your `$grid-breakpoints`, your changes will apply to all the l {{< scss-docs name="grid-breakpoints" file="scss/_variables.scss" >}} -For more information and examples on how to modify our Sass maps and variables, please refer to [the Sass section of the Grid documentation]({{< docsref "/layout/grid#sass" >}}). +For more information and examples on how to modify our Sass maps and variables, please refer to [the CSS section of the Grid documentation]({{< docsref "/layout/grid#css" >}}). ## Creating your own diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/css-variables.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/css-variables.md new file mode 100644 index 000000000..ffb40c0c4 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/css-variables.md @@ -0,0 +1,93 @@ +--- +layout: docs +title: CSS variables +description: Use Bootstrap's CSS custom properties for fast and forward-looking design and development. +group: customize +toc: true +--- + +Bootstrap includes many [CSS custom properties (variables)](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties) in its compiled CSS for real-time customization without the need to recompile Sass. These provide easy access to commonly used values like our theme colors, breakpoints, and primary font stacks when working in your browser's inspector, a code sandbox, or general prototyping. + +**All our custom properties are prefixed with `bs-`** to avoid conflicts with third party CSS. + +## Root variables + +Here are the variables we include (note that the `:root` is required) that can be accessed anywhere Bootstrap's CSS is loaded. They're located in our `_root.scss` file and included in our compiled dist files. + +### Default + +These CSS variables are available everywhere, regardless of color mode. + +```css +{{< root.inline >}} +{{- $css := readFile "dist/css/bootstrap.css" -}} +{{- $match := findRE `:root,\n\[data-bs-theme=light\] {([^}]*)}` $css 1 -}} + +{{- if (eq (len $match) 0) -}} +{{- errorf "Got no matches for :root in %q!" $.Page.Path -}} +{{- end -}} + +{{- index $match 0 -}} + +{{< /root.inline >}} +``` + +### Dark mode + +These variables are scoped to our built-in dark mode. + +```css +{{< root.inline >}} +{{- $css := readFile "dist/css/bootstrap.css" -}} +{{- $match := findRE `\[data-bs-theme=dark\] {([^}]*)}` $css 1 -}} +{{- if (eq (len $match) 0) -}} +{{- errorf "Got no matches for [data-bs-theme=dark] in %q!" $.Page.Path -}} +{{- end -}} +{{- index $match 0 -}} +{{< /root.inline >}} +``` + +## Component variables + +Bootstrap 5 is increasingly making use of custom properties as local variables for various components. This way we reduce our compiled CSS, ensure styles aren't inherited in places like nested tables, and allow some basic restyling and extending of Bootstrap components after Sass compilation. + +Have a look at our table documentation for some [insight into how we're using CSS variables]({{< docsref "/content/tables#how-do-the-variants-and-accented-tables-work" >}}). Our [navbars also use CSS variables]({{< docsref "/components/navbar#css" >}}) as of v5.2.0. We're also using CSS variables across our grids—primarily for gutters the [new opt-in CSS grid]({{< docsref "/layout/css-grid" >}})—with more component usage coming in the future. + +Whenever possible, we'll assign CSS variables at the base component level (e.g., `.navbar` for navbar and its sub-components). This reduces guessing on where and how to customize, and allows for easy modifications by our team in future updates. + +## Prefix + +Most CSS variables use a prefix to avoid collisions with your own codebase. This prefix is in addition to the `--` that's required on every CSS variable. + +Customize the prefix via the `$prefix` Sass variable. By default, it's set to `bs-` (note the trailing dash). + +## Examples + +CSS variables offer similar flexibility to Sass's variables, but without the need for compilation before being served to the browser. For example, here we're resetting our page's font and link styles with CSS variables. + +```css +body { + font: 1rem/1.5 var(--bs-font-sans-serif); +} +a { + color: var(--bs-blue); +} +``` + +## Focus variables + +{{< added-in "5.3.0" >}} + +Bootstrap provides custom `:focus` styles using a combination of Sass and CSS variables that can be optionally added to specific components and elements. We do not yet globally override all `:focus` styles. + +In our Sass, we set default values that can be customized before compiling. + +{{< scss-docs name="focus-ring-variables" file="scss/_variables.scss" >}} + +Those variables are then reassigned to `:root` level CSS variables that can be customized in real-time, including with options for `x` and `y` offsets (which default to their fallback value of `0`). + +{{< scss-docs name="root-focus-variables" file="scss/_root.scss" >}} + +## Grid breakpoints + +While we include our grid breakpoints as CSS variables (except for `xs`), be aware that **CSS variables do not work in media queries**. This is by design in the CSS spec for variables, but may change in coming years with support for `env()` variables. Check out [this Stack Overflow answer](https://stackoverflow.com/a/47212942) for some helpful links. In the meantime, you can use these variables in other CSS situations, as well as in your JavaScript. diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/optimize.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/optimize.md similarity index 89% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/optimize.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/optimize.md index fc61728ce..2622f88db 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/optimize.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/optimize.md @@ -19,8 +19,9 @@ If you're not using a component, comment it out or delete it entirely. For examp Bootstrap's JavaScript includes every component in our primary dist files (`bootstrap.js` and `bootstrap.min.js`), and even our primary dependency (Popper) with our bundle files (`bootstrap.bundle.js` and `bootstrap.bundle.min.js`). While you're customizing via Sass, be sure to remove related JavaScript. -For instance, assuming you're using your own JavaScript bundler like Webpack or Rollup, you'd only import the JavaScript you plan on using. In the example below, we show how to just include our modal JavaScript: +For instance, assuming you're using your own JavaScript bundler like Webpack, Parcel, or Vite, you'd only import the JavaScript you plan on using. In the example below, we show how to just include our modal JavaScript: + ```js // Import just what we need @@ -41,13 +42,11 @@ import 'bootstrap/js/dist/modal'; This way, you're not including any JavaScript you don't intend to use for components like buttons, carousels, and tooltips. If you're importing dropdowns, tooltips or popovers, be sure to list the Popper dependency in your `package.json` file. {{< callout info >}} -### Default Exports - -Files in `bootstrap/js/dist` use the **default export**, so if you want to use one of them you have to do the following: +**Heads up!** Files in `bootstrap/js/dist` use the **default export**. To use them, do the following: + ```js import Modal from 'bootstrap/js/dist/modal' - const modal = new Modal(document.getElementById('myModal')) ``` {{< /callout >}} @@ -75,7 +74,7 @@ Whenever possible, be sure to compress all the code you serve to your visitors. While minifying and using compression might seem like enough, making your files non-blocking ones is also a big step in making your site well-optimized and fast enough. -If you are using a [Lighthouse](https://developers.google.com/web/tools/lighthouse/) plugin in Google Chrome, you may have stumbled over FCP. [The First Contentful Paint](https://web.dev/fcp/) metric measures the time from when the page starts loading to when any part of the page's content is rendered on the screen. +If you are using a [Lighthouse](https://developer.chrome.com/docs/lighthouse/overview/) plugin in Google Chrome, you may have stumbled over FCP. [The First Contentful Paint](https://web.dev/fcp/) metric measures the time from when the page starts loading to when any part of the page's content is rendered on the screen. You can improve FCP by deferring non-critical JavaScript or CSS. What does that mean? Simply, JavaScript or stylesheets that don't need to be present on the first paint of your page should be marked with `async` or `defer` attributes. diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/options.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/options.md similarity index 89% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/options.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/options.md index c819e6e84..b5c4fc392 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/customize/options.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/options.md @@ -9,16 +9,18 @@ Customize Bootstrap with our built-in custom variables file and easily toggle gl You can find and customize these variables for key global options in Bootstrap's `scss/_variables.scss` file. -{{< bs-table "table text-start" >}} +{{< bs-table "table table-options" >}} | Variable | Values | Description | | ------------------------------ | ---------------------------------- | -------------------------------------------------------------------------------------- | | `$spacer` | `1rem` (default), or any value > 0 | Specifies the default spacer value to programmatically generate our [spacer utilities]({{< docsref "/utilities/spacing" >}}). | +| `$enable-dark-mode` | `true` (default) or `false` | Enables built-in [dark mode support]({{< docsref "/customize/color-modes#dark-mode" >}}) across the project and its components. | | `$enable-rounded` | `true` (default) or `false` | Enables predefined `border-radius` styles on various components. | | `$enable-shadows` | `true` or `false` (default) | Enables predefined decorative `box-shadow` styles on various components. Does not affect `box-shadow`s used for focus states. | | `$enable-gradients` | `true` or `false` (default) | Enables predefined gradients via `background-image` styles on various components. | | `$enable-transitions` | `true` (default) or `false` | Enables predefined `transition`s on various components. | | `$enable-reduced-motion` | `true` (default) or `false` | Enables the [`prefers-reduced-motion` media query]({{< docsref "/getting-started/accessibility#reduced-motion" >}}), which suppresses certain animations/transitions based on the users' browser/operating system preferences. | | `$enable-grid-classes` | `true` (default) or `false` | Enables the generation of CSS classes for the grid system (e.g. `.row`, `.col-md-1`, etc.). | +| `$enable-container-classes` | `true` (default) or `false` | Enables the generation of CSS classes for layout containers. (New in v5.2.0) | | `$enable-caret` | `true` (default) or `false` | Enables pseudo element caret on `.dropdown-toggle`. | | `$enable-button-pointers` | `true` (default) or `false` | Add "hand" cursor to non-disabled button elements. | | `$enable-rfs` | `true` (default) or `false` | Globally enables [RFS]({{< docsref "/getting-started/rfs" >}}). | diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/overview.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/overview.md new file mode 100644 index 000000000..ed890acd0 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/overview.md @@ -0,0 +1,53 @@ +--- +layout: docs +title: Customize +description: Learn how to theme, customize, and extend Bootstrap with Sass, a boatload of global options, an expansive color system, and more. +group: customize +toc: false +aliases: "/docs/5.3/customize/" +sections: + - title: Sass + description: Utilize our source Sass files to take advantage of variables, maps, mixins, and functions. + - title: Options + description: Customize Bootstrap with built-in variables to easily toggle global CSS preferences. + - title: Color + description: Learn about and customize the color systems that support the entire toolkit. + - title: Color modes + description: Explore our default light mode and the new dark mode, or create custom color modes yourself. + - title: Components + description: Learn how we build nearly all our components responsively and with base and modifier classes. + - title: CSS variables + description: Use Bootstrap's CSS custom properties for fast and forward-looking design and development. + - title: Optimize + description: Keep your projects lean, responsive, and maintainable so you can deliver the best experience. +--- + +## Overview + +There are multiple ways to customize Bootstrap. Your best path can depend on your project, the complexity of your build tools, the version of Bootstrap you're using, browser support, and more. + +Our two preferred methods are: + +1. Using Bootstrap [via package manager]({{< docsref "/getting-started/download#package-managers" >}}) so you can use and extend our source files. +2. Using Bootstrap's compiled distribution files or [jsDelivr]({{< docsref "/getting-started/download#cdn-via-jsdelivr" >}}) so you can add onto or override Bootstrap's styles. + +While we cannot go into details here on how to use every package manager, we can give some guidance on [using Bootstrap with your own Sass compiler]({{< docsref "/customize/sass" >}}). + +For those who want to use the distribution files, review the [getting started page]({{< docsref "/getting-started/introduction" >}}) for how to include those files and an example HTML page. From there, consult the docs for the layout, components, and behaviors you'd like to use. + +As you familiarize yourself with Bootstrap, continue exploring this section for more details on how to utilize our global options, making use of and changing our color system, how we build our components, how to use our growing list of CSS custom properties, and how to optimize your code when building with Bootstrap. + +## CSPs and embedded SVGs + +Several Bootstrap components include embedded SVGs in our CSS to style components consistently and easily across browsers and devices. **For organizations with more strict CSP configurations**, we've documented all instances of our embedded SVGs (all of which are applied via `background-image`) so you can more thoroughly review your options. + +- [Accordion]({{< docsref "/components/accordion" >}}) +- [Carousel controls]({{< docsref "/components/carousel#with-controls" >}}) +- [Close button]({{< docsref "/components/close-button" >}}) (used in alerts and modals) +- [Form checkboxes and radio buttons]({{< docsref "/forms/checks-radios" >}}) +- [Form switches]({{< docsref "/forms/checks-radios#switches" >}}) +- [Form validation icons]({{< docsref "/forms/validation#server-side" >}}) +- [Navbar toggle buttons]({{< docsref "/components/navbar#responsive-behaviors" >}}) +- [Select menus]({{< docsref "/forms/select" >}}) + +Based on [community conversation](https://github.com/twbs/bootstrap/issues/25394), some options for addressing this in your own codebase include [replacing the URLs with locally hosted assets]({{< docsref "/getting-started/webpack#extracting-svg-files" >}}), removing the images and using inline images (not possible in all components), and modifying your CSP. Our recommendation is to carefully review your own security policies and decide on the best path forward, if necessary. diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/sass.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/sass.md new file mode 100644 index 000000000..ceadf3a98 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/customize/sass.md @@ -0,0 +1,355 @@ +--- +layout: docs +title: Sass +description: Utilize our source Sass files to take advantage of variables, maps, mixins, and functions to help you build faster and customize your project. +group: customize +toc: true +--- + +Utilize our source Sass files to take advantage of variables, maps, mixins, and more. + +## File structure + +Whenever possible, avoid modifying Bootstrap's core files. For Sass, that means creating your own stylesheet that imports Bootstrap so you can modify and extend it. Assuming you're using a package manager like npm, you'll have a file structure that looks like this: + +```text +your-project/ +├── scss/ +│ └── custom.scss +└── node_modules/ +│ └── bootstrap/ +│ ├── js/ +│ └── scss/ +└── index.html +``` + +If you've downloaded our source files and aren't using a package manager, you'll want to manually create something similar to that structure, keeping Bootstrap's source files separate from your own. + +```text +your-project/ +├── scss/ +│ └── custom.scss +├── bootstrap/ +│ ├── js/ +│ └── scss/ +└── index.html +``` + +## Importing + +In your `custom.scss`, you'll import Bootstrap's source Sass files. You have two options: include all of Bootstrap, or pick the parts you need. We encourage the latter, though be aware there are some requirements and dependencies across our components. You also will need to include some JavaScript for our plugins. + +```scss +// Custom.scss +// Option A: Include all of Bootstrap + +// Include any default variable overrides here (though functions won't be available) + +@import "../node_modules/bootstrap/scss/bootstrap"; + +// Then add additional custom code here +``` + +```scss +// Custom.scss +// Option B: Include parts of Bootstrap + +// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc) +@import "../node_modules/bootstrap/scss/functions"; + +// 2. Include any default variable overrides here + +// 3. Include remainder of required Bootstrap stylesheets (including any separate color mode stylesheets) +@import "../node_modules/bootstrap/scss/variables"; +@import "../node_modules/bootstrap/scss/variables-dark"; + +// 4. Include any default map overrides here + +// 5. Include remainder of required parts +@import "../node_modules/bootstrap/scss/maps"; +@import "../node_modules/bootstrap/scss/mixins"; +@import "../node_modules/bootstrap/scss/root"; + +// 6. Optionally include any other parts as needed +@import "../node_modules/bootstrap/scss/utilities"; +@import "../node_modules/bootstrap/scss/reboot"; +@import "../node_modules/bootstrap/scss/type"; +@import "../node_modules/bootstrap/scss/images"; +@import "../node_modules/bootstrap/scss/containers"; +@import "../node_modules/bootstrap/scss/grid"; +@import "../node_modules/bootstrap/scss/helpers"; + +// 7. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss` +@import "../node_modules/bootstrap/scss/utilities/api"; + +// 8. Add additional custom code here +``` + +With that setup in place, you can begin to modify any of the Sass variables and maps in your `custom.scss`. You can also start to add parts of Bootstrap under the `// Optional` section as needed. We suggest using the full import stack from our `bootstrap.scss` file as your starting point. + +## Compiling + +In order to use your custom Sass code as CSS in the browser, you need a Sass compiler. Sass ships as a CLI package, but you can also compile it with other build tools like [Gulp](https://gulpjs.com/) or [Webpack](https://webpack.js.org/), or with a GUI applications. Some IDEs also have Sass compilers built in or as downloadable extensions. + +We like to use the CLI to compile our Sass, but you can use whichever method you prefer. From the command line, run the following: + +```shell +# Install Sass globally +npm install -g sass + +# Watch your custom Sass for changes and compile it to CSS +sass --watch ./scss/custom.scss ./css/custom.css +``` + +Learn more about your options at [sass-lang.com/install](https://sass-lang.com/install) and [compiling with VS Code](https://code.visualstudio.com/docs/languages/css#_transpiling-sass-and-less-into-css). + +{{< callout info >}} +**Using Bootstrap with another build tool?** Consider reading our guides for compiling with [Webpack]({{< docsref "/getting-started/webpack" >}}), [Parcel]({{< docsref "/getting-started/parcel" >}}), or [Vite]({{< docsref "/getting-started/vite" >}}). We also have production-ready demos in [our examples repository on GitHub](https://github.com/twbs/examples). +{{< /callout >}} + +## Including + +Once your CSS is compiled, you can include it in your HTML files. Inside your `index.html` you'll want to include your compiled CSS file. Be sure to update the path to your compiled CSS file if you've changed it. + +```html + + + + + + Custom Bootstrap + + + +

    Hello, world!

    + + +``` + +## Variable defaults + +Every Sass variable in Bootstrap includes the `!default` flag allowing you to override the variable's default value in your own Sass without modifying Bootstrap's source code. Copy and paste variables as needed, modify their values, and remove the `!default` flag. If a variable has already been assigned, then it won't be re-assigned by the default values in Bootstrap. + +You will find the complete list of Bootstrap's variables in `scss/_variables.scss`. Some variables are set to `null`, these variables don't output the property unless they are overridden in your configuration. + +Variable overrides must come after our functions are imported, but before the rest of the imports. + +Here's an example that changes the `background-color` and `color` for the `` when importing and compiling Bootstrap via npm: + +```scss +// Required +@import "../node_modules/bootstrap/scss/functions"; + +// Default variable overrides +$body-bg: #000; +$body-color: #111; + +// Required +@import "../node_modules/bootstrap/scss/variables"; +@import "../node_modules/bootstrap/scss/variables-dark"; +@import "../node_modules/bootstrap/scss/maps"; +@import "../node_modules/bootstrap/scss/mixins"; +@import "../node_modules/bootstrap/scss/root"; + +// Optional Bootstrap components here +@import "../node_modules/bootstrap/scss/reboot"; +@import "../node_modules/bootstrap/scss/type"; +// etc +``` + +Repeat as necessary for any variable in Bootstrap, including the global options below. + +{{< callout info >}} +{{< partial "callouts/info-npm-starter.md" >}} +{{< /callout >}} + +## Maps and loops + +Bootstrap includes a handful of Sass maps, key value pairs that make it easier to generate families of related CSS. We use Sass maps for our colors, grid breakpoints, and more. Just like Sass variables, all Sass maps include the `!default` flag and can be overridden and extended. + +Some of our Sass maps are merged into empty ones by default. This is done to allow easy expansion of a given Sass map, but comes at the cost of making _removing_ items from a map slightly more difficult. + +### Modify map + +All variables in the `$theme-colors` map are defined as standalone variables. To modify an existing color in our `$theme-colors` map, add the following to your custom Sass file: + +```scss +$primary: #0074d9; +$danger: #ff4136; +``` + +Later on, these variables are set in Bootstrap's `$theme-colors` map: + +```scss +$theme-colors: ( + "primary": $primary, + "danger": $danger +); +``` + +### Add to map + +Add new colors to `$theme-colors`, or any other map, by creating a new Sass map with your custom values and merging it with the original map. In this case, we'll create a new `$custom-colors` map and merge it with `$theme-colors`. + +```scss +// Create your own map +$custom-colors: ( + "custom-color": #900 +); + +// Merge the maps +$theme-colors: map-merge($theme-colors, $custom-colors); +``` + +### Remove from map + +To remove colors from `$theme-colors`, or any other map, use `map-remove`. Be aware you must insert `$theme-colors` between our requirements just after its definition in `variables` and before its usage in `maps`: + +```scss +// Required +@import "../node_modules/bootstrap/scss/functions"; +@import "../node_modules/bootstrap/scss/variables"; +@import "../node_modules/bootstrap/scss/variables-dark"; + +$theme-colors: map-remove($theme-colors, "info", "light", "dark"); + +@import "../node_modules/bootstrap/scss/maps"; +@import "../node_modules/bootstrap/scss/mixins"; +@import "../node_modules/bootstrap/scss/root"; + +// Optional +@import "../node_modules/bootstrap/scss/reboot"; +@import "../node_modules/bootstrap/scss/type"; +// etc +``` + +## Required keys + +Bootstrap assumes the presence of some specific keys within Sass maps as we used and extend these ourselves. As you customize the included maps, you may encounter errors where a specific Sass map's key is being used. + +For example, we use the `primary`, `success`, and `danger` keys from `$theme-colors` for links, buttons, and form states. Replacing the values of these keys should present no issues, but removing them may cause Sass compilation issues. In these instances, you'll need to modify the Sass code that makes use of those values. + +## Functions + +### Colors + +Next to the [Sass maps]({{< docsref "/customize/color#color-sass-maps" >}}) we have, theme colors can also be used as standalone variables, like `$primary`. + +```scss +.custom-element { + color: $gray-100; + background-color: $dark; +} +``` + +You can lighten or darken colors with Bootstrap's `tint-color()` and `shade-color()` functions. These functions will mix colors with black or white, unlike Sass' native `lighten()` and `darken()` functions which will change the lightness by a fixed amount, which often doesn't lead to the desired effect. + +{{< scss-docs name="color-functions" file="scss/_functions.scss" >}} + +In practice, you'd call the function and pass in the color and weight parameters. + +```scss +.custom-element { + color: tint-color($primary, 10%); +} + +.custom-element-2 { + color: shade-color($danger, 30%); +} +``` + +### Color contrast + +In order to meet the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/TR/WCAG/) contrast requirements, authors **must** provide a minimum [text color contrast of 4.5:1](https://www.w3.org/TR/WCAG/#contrast-minimum) and a minimum [non-text color contrast of 3:1](https://www.w3.org/TR/WCAG/#non-text-contrast), with very few exceptions. + +To help with this, we included the `color-contrast` function in Bootstrap. It uses the [WCAG contrast ratio algorithm](https://www.w3.org/TR/WCAG/#dfn-contrast-ratio) for calculating contrast thresholds based on [relative luminance](https://www.w3.org/TR/WCAG/#dfn-relative-luminance) in an `sRGB` color space to automatically return a light (`#fff`), dark (`#212529`) or black (`#000`) contrast color based on the specified base color. This function is especially useful for mixins or loops where you're generating multiple classes. + +For example, to generate color swatches from our `$theme-colors` map: + +```scss +@each $color, $value in $theme-colors { + .swatch-#{$color} { + color: color-contrast($value); + } +} +``` + +It can also be used for one-off contrast needs: + +```scss +.custom-element { + color: color-contrast(#000); // returns `color: #fff` +} +``` + +You can also specify a base color with our color map functions: + +```scss +.custom-element { + color: color-contrast($dark); // returns `color: #fff` +} +``` + +### Escape SVG + +We use the `escape-svg` function to escape the `<`, `>` and `#` characters for SVG background images. When using the `escape-svg` function, data URIs must be quoted. + +### Add and Subtract functions + +We use the `add` and `subtract` functions to wrap the CSS `calc` function. The primary purpose of these functions is to avoid errors when a "unitless" `0` value is passed into a `calc` expression. Expressions like `calc(10px - 0)` will return an error in all browsers, despite being mathematically correct. + +Example where the calc is valid: + +```scss +$border-radius: .25rem; +$border-width: 1px; + +.element { + // Output calc(.25rem - 1px) is valid + border-radius: calc($border-radius - $border-width); +} + +.element { + // Output the same calc(.25rem - 1px) as above + border-radius: subtract($border-radius, $border-width); +} +``` + +Example where the calc is invalid: + +```scss +$border-radius: .25rem; +$border-width: 0; + +.element { + // Output calc(.25rem - 0) is invalid + border-radius: calc($border-radius - $border-width); +} + +.element { + // Output .25rem + border-radius: subtract($border-radius, $border-width); +} +``` + +## Mixins + +Our `scss/mixins/` directory has a ton of mixins that power parts of Bootstrap and can also be used across your own project. + +### Color schemes + +A shorthand mixin for the `prefers-color-scheme` media query is available with support for `light`, `dark`, and custom color schemes. See [the color modes documentation]({{< docsref "/customize/color-modes" >}}) for information on our color mode mixin. + +{{< scss-docs name="mixin-color-scheme" file="scss/mixins/_color-scheme.scss" >}} + +```scss +.custom-element { + @include color-scheme(dark) { + // Insert dark mode styles here + } + + @include color-scheme(custom-named-scheme) { + // Insert custom color scheme styles here + } +} +``` diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/docsref.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/docsref.md new file mode 100644 index 000000000..d0fc42f3d --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/docsref.md @@ -0,0 +1,49 @@ +--- +layout: docs +title: Docs reference +description: Examples of Bootstrap's documentation-specific components and styles. +aliases: "/docsref/" +toc: true +robots: noindex,follow +sitemap_exclude: true +--- + +## Buttons + + + + + +## Callouts + +{{< callout >}} + Default callout +{{< /callout >}} + +{{< callout warning >}} + Warning callout +{{< /callout >}} + +{{< callout danger >}} + Danger callout +{{< /callout >}} + +## Code example + +```scss +.test { + --color: blue; +} +``` + +
    + The HTML abbreviation element. +
    + +{{< example >}} +
    This is a test.
    +{{< /example >}} + +{{< scss-docs name="variable-gradient" file="scss/_variables.scss" >}} + +{{< js-docs name="live-toast" file="site/assets/js/snippets.js" >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/_index.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/_index.md new file mode 100644 index 000000000..c3c242312 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/_index.md @@ -0,0 +1,66 @@ +--- +layout: single +title: Examples +description: Quickly get a project started with any of our examples ranging from using parts of the framework to custom components and layouts. +aliases: "/examples/" +--- + +{{< list-examples.inline >}} +{{ range $entry := $.Site.Data.examples -}} +
    +

    {{ $entry.category }}

    +

    {{ $entry.description }}

    + {{ if eq $entry.category "RTL" -}} +
    +

    + RTL is still experimental and will evolve with feedback. Spotted something or have an improvement to suggest? +

    +

    Please open an issue.

    +
    + {{ end -}} + {{ range $i, $example := $entry.examples -}} + {{- $len := len $entry.examples -}} + {{ if (eq $i 0) }}
    {{ end }} + {{ if $entry.external }} +
    + +
    +

    + + {{ $example.name }} + +

    +

    {{ $example.description }}

    +

    + {{- $indexPath := "index.html" -}} + {{- if $example.indexPath -}} + {{- $indexPath = $example.indexPath -}} + {{- end }} + + + Edit in StackBlitz + +

    +
    +
    + {{ else }} +
    + + +

    + {{ $example.name }} +

    +
    +

    {{ $example.description }}

    +
    + {{ end }} + {{ if (eq (add $i 1) $len) }}
    {{ end }} + {{ end -}} +
    +{{ end -}} +{{< /list-examples.inline >}} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/album-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/album-rtl/index.html new file mode 100644 index 000000000..bae47373a --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/album-rtl/index.html @@ -0,0 +1,209 @@ +--- +layout: examples +title: مثال الألبوم +direction: rtl +--- + +
    + + +
    + +
    + +
    +
    +
    +

    مثال الألبوم

    +

    وصف قصير حول الألبوم أدناه (محتوياته ، ومنشؤه ، وما إلى ذلك). اجعله قصير ولطيف، ولكن ليست قصير جدًا حتى لا يتخطى الناس هذا الألبوم تمامًا.

    +

    + الدعوة الرئيسية للعمل + عمل ثانوي +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    + +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    + +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="صورة مصغرة" >}} +
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +
    +
    + + +
    + 9 دقائق +
    +
    +
    +
    +
    +
    +
    + +
    + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/album/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/album/index.html new file mode 100644 index 000000000..54b2c5bde --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/album/index.html @@ -0,0 +1,208 @@ +--- +layout: examples +title: Album example +--- + +
    + + +
    + +
    + +
    +
    +
    +

    Album example

    +

    Something short and leading about the collection below—its contents, the creator, etc. Make it short and sweet, but not too short so folks don’t simply skip over it entirely.

    +

    + Main call to action + Secondary action +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    + +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    + +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="225" background="#55595c" color="#eceeef" class="card-img-top" text="Thumbnail" >}} +
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    + + +
    + 9 mins +
    +
    +
    +
    +
    +
    +
    + +
    + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/badges.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/badges.css new file mode 100644 index 000000000..b6ce0f5b8 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/badges.css @@ -0,0 +1,3 @@ +.badge > a { + color: inherit; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/index.html new file mode 100644 index 000000000..ad9dfbce1 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/index.html @@ -0,0 +1,149 @@ +--- +layout: examples +title: Badges +extra_css: + - "badges.css" +body_class: "" +--- + + + + + + + +
    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + +
    + +
    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + +
    + +
    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + +
    + +
    + + Primary + + + Secondary + + + Success + + + Danger + + + Warning + + + Info + + + Light + + + Dark + +
    + +
    + +
    + + Primary + + + + Primary + + + + Primary + + +
    + +
    + +
    + + + Primary + + + + + + Secondary + + + + + + Success + + + + + + Danger + + + + + + Warning + + + + + + Info + + + + + + Light + + + + + + Dark + + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog-rtl/index.html new file mode 100644 index 000000000..97d991302 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog-rtl/index.html @@ -0,0 +1,257 @@ +--- +layout: examples +title: قالب المدونة +direction: rtl +extra_css: + - "https://fonts.googleapis.com/css?family=Amiri:wght@400;700&display=swap" + - "../blog/blog.rtl.css" +--- + + + + + + + + + + + + + + + + +
    +
    +
    +

    عنوان تدوينة مميزة أطول

    +

    عدة أسطر نصية متعددة تعبر عن التدوية، وذلك لإعلام القراء الجدد بسرعة وكفاءة حول أكثر الأشياء إثارة للاهتمام في محتويات هذه التدوينة.

    +

    أكمل القراءة...

    +
    +
    + +
    +
    +
    +
    + العالم +

    مشاركة مميزة

    +
    نوفمبر 12
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي.

    + + أكمل القراءة + + +
    +
    + {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="صورة مصغرة" >}} +
    +
    +
    +
    +
    +
    + التصميم +

    عنوان الوظيفة

    +
    نوفمبر 11
    +

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي.

    + + أكمل القراءة + + +
    +
    + {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="صورة مصغرة" >}} +
    +
    +
    +
    + +
    +
    +

    + من Firehose +

    + +
    + + + +

    تعرض مشاركة المدونة هذه بضعة أنواع مختلفة من المحتوى الذي يتم دعمه وتصميمه باستخدام Bootstrap. النصوص الأساسية، الصور، والأكواد مدعومة بشكل كامل.

    +
    +

    يشكِّل تأمين الغذاء في المستقبل قضية تؤرِّق حكومات العالَم والعلماء على حدٍّ سواء. فخلال القرن العشرين ازداد عدد سكان الأرض أربعة أضعاف، وتشير التقديرات إلى أن العدد سوف يصل إلى عشرة مليارات إنسان بحلول عام 2050م. وسوف تمثل هذه الزيادة الهائلة تحدياً كبيراً وضغطاً متصاعداً على قدرة الإنتاج الزراعي. الأمر الذي كان ولا بد من أن يدفع إلى تطوير تقنيات مبتكرة في تصنيع الغذاء غير الزراعة، منها تقنية مستقبلية تقوم على تصنيع الغذاء من الهواء.

    +
    +

    تشغل الزراعة مساحات كبيرة من اليابسة، وتستهلك كميات هائلة من المياه، كما أن إنتاج الغذاء بواسطة الزراعة يسهم بنسبة عالية من انبعاثات غازات الاحتباس الحراري العالمية

    +
    +

    تشغل الزراعة مساحات كبيرة من اليابسة، وتستهلك كميات هائلة من المياه. كما أن إنتاج الغذاء بواسطة الزراعة يسهم بنسبة عالية من انبعاثات غازات الاحتباس الحراري العالمية، وللمقارنة فإن هذه النسبة من الانبعاثات هي أكبر مما ينتجه قطاع النقل بكل ما فيه من سيارات وشاحنات وطائرات وقطارات.

    +

    عنوان

    +

    تحصل النباتات على غذائها بواسطة عملية تسمى البناء الضوئي، حيث تقوم النباتات بتحويل ضوء الشمس والماء وثاني أكسيد الكربون الموجود في الغلاف الجوي إلى غذاء وتطلق الأكسجين كمنتج ثانوي لهذا التفاعل الكيميائي. وتحدث هذه العملية في "البلاستيدات الخضراء". فالنباتات تستفيد من طاقة ضوء الشمس في تقسيم الماء إلى هيدروجين وأكسجين، وتحدث تفاعلات كيميائية أخرى ينتج عنها سكر الجلكوز الذي تستخدمه كمصدر للغذاء وينطلق الأكسجين من النباتات إلى الغلاف الجوي. وهذا يعني أن النباتات تحوِّل ثاني أكسيد الكربون إلى غذاء من خلال تفاعلات كيميائية معقَّدة. ويُعد البناء الضوئي من أهم التفاعلات الكيميائية على كوكب الأرض، فقد ساعد في الماضي على تطوُّر كوكبنا وظهور الحياة عليه. فالنباتات تستخدم ثاني أكسيد الكربون لصنع غذائها، وتطلق الأكسجين لتساعد الكائنات الأخرى على التنفس!

    +

    عنوان فرعي

    +

    ألهمت هذه العملية علماء وكالة الفضاء الأمريكية (ناسا) خلال الستينيات من القرن الماضي، لبحث فكرة إطعام روَّاد الفضاء في مهمات الفضاء الطويلة مثل السفر إلى المريخ. وكانت واحدة من الأفكار الواعدة تصنيع الغذاء عن طريق ثاني أكسيد الكربون الذي ينتجه روَّاد الفضاء، لكن ليس بواسطة النباتات بل عن طريق ميكروبات صغيرة وحيدة الخلية قادرة على حصد ثاني أكسيد الكربون لإنتاج كميات وفيرة من البروتين المغذي على شكل مسحوق عديم النكهة، كما يمكن استخدام المادة في صنع الأطعمة المألوفة لدينا.

    +
    Example code block
    +

    وخلافاً لما هو الحال في عالم النبات، فإن هذه الميكروبات لا تستخدم الضوء كما يحدث في عملية البناء الضوئي التي تستخدمها النباتات للحصول على الغذاء، أي لأنها قادرة على النمو في الظلام. تسمى هذه البكتريا "هيدروجينوتروف" (Hydrogenotrophs)، وهي تستخدم الهيدروجين كوقود لإنتاج الغذاء من ثاني أكسيد الكربون. فعندما يُنتج روَّاد الفضاء ثاني أكسيد الكربون، تلتقطه الميكروبات، ويتحوَّل مع مدخلات أخرى إلى غذاء غني بالكربون. وبهذه الطريقة سوف نحصل على دورة كربون مغلقة الحلقة.

    +

    عنوان فرعي

    +

    بعد مرور أكثر من نصف قرن على أبحاث ناسا، تعمل حالياً عدة شركات في قطاع البيولوجيا التركيبية من ضمنها إير بروتين (Air Protein) وسولار فودز (Solar Foods) على تطوير جيل جديد من المنتجات الغذائية المستدامة، من دون وجود بصمة كربونية. ولن تقتصر هذه المنتجات الغذائية على روَّاد الفضاء فحسب، بل سوف تمتد لتشمل جميع سكان الأرض، وسوف تُنتَج في فترة زمنية قصيرة، بدلاً من الشهور، ومن دون الاعتماد على الأراضي الزراعية. وهذا يعني الحصول على منتجات غذائية بشكل سريع جداً. كما سيصبح من الممكن تصنيع الغذاء بطريقة عمودية من خلال هذه الميكروبات، بدلاً من الطريقة الأفقية التقليدية الشبيهة بتقنية الزراعة العمودية الحديثة. وهذا يعني توفير منتجات غذائية أكبر من المساحة نفسها.

    +

    يتكوَّن الغذاء البشري من ثلاثة أنواع رئيسة، هي:

    +
      +
    • البروتينات
    • +
    • الكربوهيدرات
    • +
    • الدهون
    • +
    +

    وتتكوَّن البروتينات من الأحماض الأمينية، وهي مجموعة من المركبات العضوية يبلغ عددها في جسم الإنسان عشرين حمضاً أمينياً، من بينها تسعة أساسية يحصل عليها الجسم من الغذاء. وتتكوَّن الأحماض الأمينية بشكل أساس من:

    +
      +
    1. الكربون
    2. +
    3. الهيدروجين
    4. +
    5. الأكسجين
    6. +
    7. النيتروجين
    8. +
    +

    ومن الملاحظ أن النيتروجين يشكِّل نسبة %78 من الهواء، كما أن الهيدروجين نحصل عليه من خلال التحليل الكهربائي للماء، ومن الممكن نظرياً سحب الكربون من الهواء لتشكيل هذه الأحماض، ذلك أن الكربون هو العمود الفقري للأحماض الأمينية، كما أن الحياة على كوكب الأرض قائمة على الكربون لقدرته على تكوين سلاسل كربونية طويلة، وهذا ما تفعله الميكروبات بتصنيع أحماض أمينية من ثاني أكسيد الكربون من خلال مجموعة من التفاعلات الكيميائية المعقَّدة. وإضافة إلى صنع وجبات غنية بالبروتين، فهذه الميكروبات تنتج منتجات أخرى مثل الزيوت التي لها عديد من الاستخدامات.

    +
    + +
    + + + +

    في الوقت الحالي، تدرس عدَّة شركات هذه الميكروبات بشكل أعمق، وتستزرعها من أجل الحصول على الغذاء. ففي عام 2019م، أعلن باحثون في شركة (Air Protein) الأمريكية نجاحهم في تحويل ثاني أكسيد الكربون الموجود في الهواء إلى لحوم صناعية مصنوعة من البروتين، التي لا تتطلَّب أي أرض زراعية، بل هي معتمدة بشكل أساسي على الهواء.

    +
    +

    تم تصنيع اللحوم بأنواع عديدة

    +
    +

    إذ استخدم هؤلاء الباحثون الهواء والطاقة المتجدِّدة كمدخلات في عملية مشابهة للتخمير، لإنتاج بروتين يحتوي على الأحماض الأمينية التسعة الأساسية وغني بالفيتامينات والمعادن، كما أنه خالٍ من الهرمونات والمضادات الحيوية والمبيدات الحشرية ومبيدات الأعشاب.

    +

    وتم تصنيع اللحوم بأنواع عديدة بما فيها الدواجن والأبقار والمأكولات البحرية، من دون حصول انبعاثات كربونية، على عكس تربية الأبقار التي تسهم في انبعاث غاز الميثان أحد غازات الاحتباس الحراري.

    +
    + +
    + + + +

    كما أن الشركة الفنلندية (Solar Foods) طوَّرت تقنية لإنتاج البروتين من الهواء، حيث تبدأ العملية بتقسيم الماء إلى مكوناته الهيدروجين والأكسجين عن طريق الكهرباء. فالهيدروجين يوفِّر الطاقة للبكتريا لتحويل ثاني أكسيد الكربون والنيتروجين الموجودين في الهواء إلى مادة عضوية غنية بالبروتين بشكل أكفأ من نمو النباتات باستخدام البناء الضوئي. وهذا البروتين يشبه دقيق القمح وقد أطلق عليه اسم "سولين" (Solein).

    +

    وتقوم الشركة حالياً بجمع البيانات حول المنتج الغذائي لتقديمه إلى الاتحاد الأوروبي بهدف الحصول على ترخيص غذائي، كما أنها تخطط لبدء الإنتاج التجاري في العام المقبل 2021م. وقد أوضحت الشركة أنها مهتمة بإنتاج أطعمة صديقة للبيئة من خلال استخدام المواد الأساسية: الكهرباء وثاني أكسيد الكربون، وهذه الأطعمة سوف تجنبنا الأثر السلبي البيئي للزراعة التقليدية الذي يشمل كل شيء من استخدام الأرض والمياه إلى الانبعاثات الناتجة من تسميد المحاصيل أو تربية الحيوانات.

    +

    وعلى هذا، فإن البروتينات المشتقة من الميكروبات سوف:

    +
      +
    • توفر حلاً ممكناً في ظل زيادة الطلب العالمي المستقبلي على الغذاء
    • +
    • تتوسع مصانع الغذاء في المستقبل لتكون أكفأ وأكثر استدامة
    • +
    • تصبح قادرة على توفير الغذاء لروَّاد الفضاء في سفرهم إلى المريخ وجميع سكان كوكب الأرض في عام 2050م
    • +
    +

    فتخيّل أن الميكروبات ستكون مصانع المستقبل، وأن غذاء المستقبل سيكون مصنوعاً من الهواء! وأن عام 2050م سيكون مختلفاً تماماً عن عالمنا اليوم. فهو عالم من دون زراعة ولا تربية حيوانات من أجل الغذاء! قد يبدو ذلك خيالياً لكنه ليس مستحيلاً!

    +
    + + + +
    + +
    +
    +
    +

    حول

    +

    أقبلت، فأقبلت معك الحياة بجميع صنوفها وألوانها: فالنبات ينبت، والأشجار تورق وتزهر، والهرة تموء، والقمري يسجع، والغنم يثغو، والبقر يخور، وكل أليف يدعو أليفه. كل شيء يشعر بالحياة وينسي هموم الحياة، ولا يذكر إلا سعادة الحياة، فإن كان الزمان جسدا فأنت روحه، وإن كان عمرا فأنت شبابه.

    +
    + + + + + +
    +

    في مكان آخر

    +
      +
    1. GitHub
    2. +
    3. Twitter
    4. +
    5. Facebook
    6. +
    +
    +
    +
    +
    + +
    + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.css new file mode 100644 index 000000000..ddbca5a8f --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.css @@ -0,0 +1,39 @@ +/* stylelint-disable stylistic/selector-list-comma-newline-after */ + +.blog-header-logo { + font-family: "Playfair Display", Georgia, "Times New Roman", serif/*rtl:Amiri, Georgia, "Times New Roman", serif*/; + font-size: 2.25rem; +} + +.blog-header-logo:hover { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + font-family: "Playfair Display", Georgia, "Times New Roman", serif/*rtl:Amiri, Georgia, "Times New Roman", serif*/; +} + +.flex-auto { + flex: 0 0 auto; +} + +.h-250 { height: 250px; } +@media (min-width: 768px) { + .h-md-250 { height: 250px; } +} + +/* Pagination */ +.blog-pagination { + margin-bottom: 4rem; +} + +/* + * Blog posts + */ +.blog-post { + margin-bottom: 4rem; +} +.blog-post-meta { + margin-bottom: 1.25rem; + color: #727272; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.rtl.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.rtl.css new file mode 100644 index 000000000..043d4e617 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.rtl.css @@ -0,0 +1,39 @@ +/* stylelint-disable stylistic/selector-list-comma-newline-after */ + +.blog-header-logo { + font-family: Amiri, Georgia, "Times New Roman", serif; + font-size: 2.25rem; +} + +.blog-header-logo:hover { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + font-family: Amiri, Georgia, "Times New Roman", serif; +} + +.flex-auto { + flex: 0 0 auto; +} + +.h-250 { height: 250px; } +@media (min-width: 768px) { + .h-md-250 { height: 250px; } +} + +/* Pagination */ +.blog-pagination { + margin-bottom: 4rem; +} + +/* + * Blog posts + */ +.blog-post { + margin-bottom: 4rem; +} +.blog-post-meta { + margin-bottom: 1.25rem; + color: #727272; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/index.html new file mode 100644 index 000000000..993c84e03 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/index.html @@ -0,0 +1,309 @@ +--- +layout: examples +title: Blog Template +extra_css: + - "https://fonts.googleapis.com/css?family=Playfair+Display:700,900&display=swap" + - "blog.css" +--- + + + + + + + + + + + + + + +
    +
    +
    +
    + Subscribe +
    +
    + +
    + +
    +
    + + +
    + +
    +
    +
    +

    Title of a longer featured blog post

    +

    Multiple lines of text that form the lede, informing new readers quickly and efficiently about what’s most interesting in this post’s contents.

    +

    Continue reading...

    +
    +
    + +
    +
    +
    +
    + World +

    Featured post

    +
    Nov 12
    +

    This is a wider card with supporting text below as a natural lead-in to additional content.

    + + Continue reading + + +
    +
    + {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="Thumbnail" >}} +
    +
    +
    +
    +
    +
    + Design +

    Post title

    +
    Nov 11
    +

    This is a wider card with supporting text below as a natural lead-in to additional content.

    + + Continue reading + + +
    +
    + {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="Thumbnail" >}} +
    +
    +
    +
    + +
    +
    +

    + From the Firehose +

    + +
    + + + +

    This blog post shows a few different types of content that’s supported and styled with Bootstrap. Basic typography, lists, tables, images, code, and more are all supported as expected.

    +
    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +

    Blockquotes

    +

    This is an example blockquote in action:

    +
    +

    Quoted text goes here.

    +
    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +

    Example lists

    +

    This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout. This is an example unordered list:

    +
      +
    • First list item
    • +
    • Second list item with a longer description
    • +
    • Third list item to close it out
    • +
    +

    And this is an ordered list:

    +
      +
    1. First list item
    2. +
    3. Second list item with a longer description
    4. +
    5. Third list item to close it out
    6. +
    +

    And this is a definition list:

    +
    +
    HyperText Markup Language (HTML)
    +
    The language used to describe and define the content of a Web page
    +
    Cascading Style Sheets (CSS)
    +
    Used to describe the appearance of Web content
    +
    JavaScript (JS)
    +
    The programming language used to build advanced Web sites and applications
    +
    +

    Inline HTML elements

    +

    HTML defines a long list of available inline tags, a complete list of which can be found on the Mozilla Developer Network.

    +
      +
    • To bold text, use <strong>.
    • +
    • To italicize text, use <em>.
    • +
    • Abbreviations, like HTML should use <abbr>, with an optional title attribute for the full phrase.
    • +
    • Citations, like — Mark Otto, should use <cite>.
    • +
    • Deleted text should use <del> and inserted text should use <ins>.
    • +
    • Superscript text uses <sup> and subscript text uses <sub>.
    • +
    +

    Most of these elements are styled by browsers with few modifications on our part.

    +

    Heading

    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +

    Sub-heading

    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +
    Example code block
    +

    This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout.

    +
    + +
    + + + +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +
    +

    Longer quote goes here, maybe with some emphasized text in the middle of it.

    +
    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +

    Example table

    +

    And don't forget about tables in these posts:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameUpvotesDownvotes
    Alice1011
    Bob43
    Charlie79
    Totals2123
    + +

    This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout.

    +
    + +
    + + + +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    +
      +
    • First list item
    • +
    • Second list item with a longer description
    • +
    • Third list item to close it out
    • +
    +

    This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout.

    +
    + + + +
    + + +
    + +
    + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/breadcrumbs.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/breadcrumbs.css new file mode 100644 index 000000000..a6be55861 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/breadcrumbs.css @@ -0,0 +1,50 @@ +.breadcrumb-chevron { + --bs-breadcrumb-divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%236c757d'%3E%3Cpath fill-rule='evenodd' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + gap: .5rem; +} +.breadcrumb-chevron .breadcrumb-item { + display: flex; + gap: inherit; + align-items: center; + padding-left: 0; + line-height: 1; +} +.breadcrumb-chevron .breadcrumb-item::before { + gap: inherit; + float: none; + width: 1rem; + height: 1rem; +} + +.breadcrumb-custom .breadcrumb-item { + position: relative; + flex-grow: 1; + padding: .75rem 3rem; +} +.breadcrumb-custom .breadcrumb-item::before { + display: none; +} +.breadcrumb-custom .breadcrumb-item::after { + position: absolute; + top: 50%; + right: -25px; + z-index: 1; + display: inline-block; + width: 50px; + height: 50px; + margin-top: -25px; + content: ""; + background-color: var(--bs-tertiary-bg); + border-top-right-radius: .5rem; + box-shadow: 1px -1px var(--bs-border-color); + transform: scale(.707) rotate(45deg); +} +.breadcrumb-custom .breadcrumb-item:first-child { + padding-left: 1.5rem; +} +.breadcrumb-custom .breadcrumb-item:last-child { + padding-right: 1.5rem; +} +.breadcrumb-custom .breadcrumb-item:last-child::after { + display: none; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/index.html new file mode 100644 index 000000000..74a042bc0 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/index.html @@ -0,0 +1,88 @@ +--- +layout: examples +title: Breadcrumbs +extra_css: + - "breadcrumbs.css" +body_class: "" +--- + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/buttons/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/buttons/index.html new file mode 100644 index 000000000..910c0d85e --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/buttons/index.html @@ -0,0 +1,88 @@ +--- +layout: examples +title: Buttons +body_class: "" +--- + + + + + + + + + + + +
    + + + + + + + + + +
    + +
    + +
    +
    + + +
    +
    + +
    + +
    + + +
    + +
    + +
    + + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel-rtl/index.html new file mode 100644 index 000000000..37d844e6f --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel-rtl/index.html @@ -0,0 +1,167 @@ +--- +layout: examples +title: قالب شرائح العرض +direction: rtl +extra_css: + - "../carousel/carousel.rtl.css" +--- + +
    + +
    + +
    + + + + + + + +
    + + +
    +
    + {{< placeholder width="140" height="140" background="var(--bs-secondary-color)" text="false" class="rounded-circle" >}} +

    عنوان

    +

    تذكر دائماً أن الحاسوب لا يمتلك ذكاءً، ولكنه يكتسب الذكاء الاصطناعي من خلال ثلاثة عناصر وظيفية رئيسة، هي: القدرة على التحليل، والقدرة على التأليف، والاستدلال المنطقي.

    +

    عرض التفاصيل

    +
    +
    + {{< placeholder width="140" height="140" background="var(--bs-secondary-color)" text="false" class="rounded-circle" >}} +

    عنوان آخر

    +

    إذا أردنا استخدام الحاسوب الذكي في معالجة اللغة العربية فإننا نجد أنفسنا أمام تحدٍّ كبير، خاصة وأن لغتنا تمتاز بتماسك منظوماتها وتداخلها، ومع ذلك فإن الذكاء الاصطناعي يمكّننا من الحصول على أربعة أنواع من المعالجة، هي: المعالجة الصوتية، والمعالجة الصرفية، والمعالجة النحوية، والمعالجة الدلالية.

    +

    عرض التفاصيل

    +
    +
    + {{< placeholder width="140" height="140" background="var(--bs-secondary-color)" text="false" class="rounded-circle" >}} +

    عنوان ثالث لتأكيد المعلومة

    +

    بفضل بحوث الذكاء الاصطناعي وتقنياته استطعنا الانتقال من مرحلة التعامل مع الفيزيائي إلى مرحلة التعامل مع المنطقي، وقد انعكس هذا الانتقال بصورة إيجابية على الكيفية التي تتعامل بها الشعوب مع لغاتها الحيَّة، وهذا يعني أنه يجب أن ينعكس بصورة إيجابية على كيفية تعاملنا مع لغتنا العربية.

    +

    عرض التفاصيل

    +
    +
    + + + + +
    + +
    +
    +

    العنوان الأول المميز. سيذهل عقلك.

    +

    وجه الإنسان هو جزء معقَّد ومتميِّز للغاية من جسمه. وفي الواقع، إنه أحد أكثر أنظمة الإشارات المتاحة تعقيداً لدينا؛ فهو يتضمَّن أكثر من 40 عضلة مستقلة هيكلياً ووظيفياً، بحيث يمكن تشغيل كل منها بشكل مستقل عن البعض الآخر؛ وتشكِّل أحد أقوى مؤشرات العواطف.

    +
    +
    + {{< placeholder width="500" height="500" background="var(--bs-secondary-bg)" color="var(--bs-secondary-color)" class="bd-placeholder-img-lg featurette-image img-fluid mx-auto" >}} +
    +
    + +
    + +
    +
    +

    أوه نعم، هذا جيد. شاهد بنفسك.

    +

    عندما نضحك أو نبكي، فإننا نعرض عواطفنا، مما يسمح للآخرين بإلقاء نظرة خاطفة على أذهاننا أثناء "قراءة" وجوهنا بناءً على التغييرات في مكوّنات الوجه الرئيسة، مثل: العينين والحاجبين والجفنين والأنف والشفتين.

    +
    +
    + {{< placeholder width="500" height="500" background="var(--bs-secondary-bg)" color="var(--bs-secondary-color)" class="bd-placeholder-img-lg featurette-image img-fluid mx-auto" >}} +
    +
    + +
    + +
    +
    +

    وأخيرًا، هذا. كش ملك.

    +

    إن جميع العضلات في أجسامنا مدعمة بالأعصاب المتصلة من كافة أنحاء الجسم بالنخاع الشوكي والدماغ. وهذا الاتصال العصبي هو ثنائي الاتجاه، أي إن العصب يتسبَّب في تقلصات العضلات بناءً على إشارات الدماغ، ويقوم في الوقت نفسه بإرسال معلومات عن حالة العضلات إلى الدماغ

    +
    +
    + {{< placeholder width="500" height="500" background="var(--bs-secondary-bg)" color="var(--bs-secondary-color)" class="bd-placeholder-img-lg featurette-image img-fluid mx-auto" >}} +
    +
    + +
    + + + +
    + + + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/carousel/carousel.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/carousel.css similarity index 87% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/carousel/carousel.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/carousel.css index f91faec76..be0af524a 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/carousel/carousel.css +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/carousel.css @@ -5,7 +5,7 @@ body { padding-top: 3rem; padding-bottom: 3rem; - color: #5a5a5a; + color: rgb(var(--bs-tertiary-color-rgb)); } @@ -26,13 +26,6 @@ body { .carousel-item { height: 32rem; } -.carousel-item > img { - position: absolute; - top: 0; - left: 0; - min-width: 100%; - height: 32rem; -} /* MARKETING CONTENT @@ -43,9 +36,6 @@ body { margin-bottom: 1.5rem; text-align: center; } -.marketing h2 { - font-weight: 400; -} /* rtl:begin:ignore */ .marketing .col-lg-4 p { margin-right: .75rem; @@ -62,13 +52,12 @@ body { } /* Thin out the marketing headings */ +/* rtl:begin:remove */ .featurette-heading { - font-weight: 300; - line-height: 1; - /* rtl:remove */ letter-spacing: -.05rem; } +/* rtl:end:remove */ /* RESPONSIVE CSS -------------------------------------------------- */ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/carousel/carousel.rtl.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/carousel.rtl.css similarity index 86% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/carousel/carousel.rtl.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/carousel.rtl.css index 853640b97..9ff275d4e 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/carousel/carousel.rtl.css +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/carousel.rtl.css @@ -5,7 +5,7 @@ body { padding-top: 3rem; padding-bottom: 3rem; - color: #5a5a5a; + color: rgb(var(--bs-tertiary-color-rgb)); } @@ -26,13 +26,6 @@ body { .carousel-item { height: 32rem; } -.carousel-item > img { - position: absolute; - top: 0; - right: 0; - min-width: 100%; - height: 32rem; -} /* MARKETING CONTENT @@ -43,9 +36,6 @@ body { margin-bottom: 1.5rem; text-align: center; } -.marketing h2 { - font-weight: 400; -} .marketing .col-lg-4 p { margin-right: .75rem; margin-left: .75rem; @@ -60,11 +50,6 @@ body { } /* Thin out the marketing headings */ -.featurette-heading { - font-weight: 300; - line-height: 1; -} - /* RESPONSIVE CSS -------------------------------------------------- */ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/index.html new file mode 100644 index 000000000..c76fec220 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel/index.html @@ -0,0 +1,166 @@ +--- +layout: examples +title: Carousel Template +extra_css: + - "carousel.css" +--- + +
    + +
    + +
    + + + + + + + +
    + + +
    +
    + {{< placeholder width="140" height="140" background="var(--bs-secondary-color)" text="false" class="rounded-circle" >}} +

    Heading

    +

    Some representative placeholder content for the three columns of text below the carousel. This is the first column.

    +

    View details »

    +
    +
    + {{< placeholder width="140" height="140" background="var(--bs-secondary-color)" text="false" class="rounded-circle" >}} +

    Heading

    +

    Another exciting bit of representative placeholder content. This time, we've moved on to the second column.

    +

    View details »

    +
    +
    + {{< placeholder width="140" height="140" background="var(--bs-secondary-color)" text="false" class="rounded-circle" >}} +

    Heading

    +

    And lastly this, the third column of representative placeholder content.

    +

    View details »

    +
    +
    + + + + +
    + +
    +
    +

    First featurette heading. It’ll blow your mind.

    +

    Some great placeholder content for the first featurette here. Imagine some exciting prose here.

    +
    +
    + {{< placeholder width="500" height="500" background="var(--bs-secondary-bg)" color="var(--bs-secondary-color)" class="bd-placeholder-img-lg featurette-image img-fluid mx-auto" >}} +
    +
    + +
    + +
    +
    +

    Oh yeah, it’s that good. See for yourself.

    +

    Another featurette? Of course. More placeholder content here to give you an idea of how this layout would work with some actual real-world content in place.

    +
    +
    + {{< placeholder width="500" height="500" background="var(--bs-secondary-bg)" color="var(--bs-secondary-color)" class="bd-placeholder-img-lg featurette-image img-fluid mx-auto" >}} +
    +
    + +
    + +
    +
    +

    And lastly, this one. Checkmate.

    +

    And yes, this is the last block of representative placeholder content. Again, not really intended to be actually read, simply here to give you a better view of what this would look like with some actual content. Your content.

    +
    +
    + {{< placeholder width="500" height="500" background="var(--bs-secondary-bg)" color="var(--bs-secondary-color)" class="bd-placeholder-img-lg featurette-image img-fluid mx-auto" >}} +
    +
    + +
    + + + +
    + + + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet-rtl/index.html new file mode 100644 index 000000000..9fd24e2e0 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet-rtl/index.html @@ -0,0 +1,1622 @@ +--- +layout: examples +title: ورقة الغش +extra_css: + - "../cheatsheet/cheatsheet.rtl.css" +extra_js: + - src: "../cheatsheet/cheatsheet.js" +body_class: "bg-body-tertiary" +direction: rtl +--- + +
    + +
    + +
    +
    +

    المحتوى

    + +
    +
    +

    النصوص

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +

    العرض 1

    +

    العرض 2

    +

    العرض 3

    +

    العرض 4

    +

    العرض 5

    +

    العرض 6

    + {{< /example >}} + + {{< example show_markup="false" >}} +

    عنوان 1

    +

    عنوان 2

    +

    عنوان 3

    +

    عنوان 4

    +

    عنوان 5

    +

    عنوان 6

    + {{< /example >}} + + {{< example show_markup="false" >}} +

    + هذه قطعة إملائية متميزة، فهي مصممة لتكون بارزة من بين القطع الإملائية الأخرى. +

    + {{< /example >}} + + {{< example show_markup="false" >}} +

    يمكنك استخدام تصنيف mark لتحديد نص.

    +

    من المفترض أن يتم التعامل مع هذا السطر كنص محذوف.

    +

    من المفترض أن يتم التعامل مع هذا السطر على أنه لم يعد دقيقًا.

    +

    من المفترض أن يتم التعامل مع هذا السطر كإضافة إلى المستند.

    +

    سيتم عرض النص في هذا السطر كما وتحته خط.

    +

    من المفترض أن يتم التعامل مع هذا السطر على أنه يحوي تفاصيل صغيرة.

    +

    هذا السطر يحوي نص عريض.

    +

    هذا السطر يحوي نص مائل.

    + {{< /example >}} + + {{< example show_markup="false" >}} +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    +

    إقتباس مبهر، موضوع في عنصر blockquote

    +
    شخص مشهور في عنوان المصدر
    +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
      +
    • هذه قائمة عناصر.
    • +
    • بالرغم من أنها مصممة كي لا تظهر كذلك.
    • +
    • إلا أنها مجهزة كـ قائمة خلف الكواليس
    • +
    • هذا التصميم ينطبق فقد على القائمة الرئيسية
    • +
    • القوائم الفرعية +
        +
      • لا تتأثر بهذا التصميم
      • +
      • فهي تظهر عليها علامات الترقيم
      • +
      • وتحتوي على مساحة فارغة بجوارها
      • +
      +
    • +
    • قد يكون هذا التصميم مفيدًا في بعض الأحيان.
    • +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
      +
    • هذا عنصر في قائمة.
    • +
    • وهذا أيضًا.
    • +
    • لكنهم يظهرون متجاورين.
    • +
    + {{< /example >}} +
    +
    +
    + + +
    + {{< example show_markup="false" >}} + {{< placeholder width="100%" height="250" class="bd-placeholder-img-lg img-fluid" text="صورة مستجيبة" >}} + {{< /example >}} + + {{< example show_markup="false" >}} + {{< placeholder width="200" height="200" class="img-thumbnail" title="صورة عنصر نائب مربع عام مع حدود بيضاء حولها ، مما يجعلها تشبه صورة تم التقاطها بكاميرا فورية قديمة" >}} + {{< /example >}} +
    +
    +
    +
    +

    الجداول

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #الاسم الاولالكنيةالاسم المستعار
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #الاسم الاولالكنيةالاسم المستعار
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + {{< table.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + + + + + + {{- end -}} + {{< /table.inline >}} + +
    Classعنوانعنوان
    Defaultخليةخلية
    {{ .name | title }}خليةخلية
    + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #الاسم الاولالكنيةالاسم المستعار
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    + {{< /example >}} +
    +
    +
    +
    +

    النماذج البيانية

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    + {{< placeholder width="400" height="300" class="figure-img img-fluid rounded" >}} +
    شرح للصورة أعلاه.
    +
    + {{< /example >}} +
    +
    +
    + +
    +

    النماذج

    + +
    +
    +

    نظرة عامة

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    + + +
    لن نقوم بمشاركة بريدك الإلكتروني مع أي شخص آخر.
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + أزرار الاختيار الأحادي +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + {{< /example >}} +
    +
    +
    +
    +

    الحقول المعطلة

    + }}#disabled-forms">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + أزرار اختيار أحادي معطلين +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + {{< /example >}} +
    +
    +
    + + +
    + {{< example show_markup="false" >}} +
    + +
    +
    + +
    +
    + +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    + +
    +
    + +
    +
    + +
    + {{< /example >}} +
    +
    +
    +
    +

    مجموعة الإدخال

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    + أنا اسمي + +
    +
    + + وغيرها +
    + +
    + + https://example.com/users/ +
    +
    + .00 + + $ +
    +
    + مع textarea + +
    + {{< /example >}} +
    +
    +
    +
    +

    الحقول ذوي العناوين العائمة

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    + + +
    +
    + + +
    +
    + {{< /example >}} +
    +
    +
    +
    +

    التحقق

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    + + +
    + يبدو صحيحًا! +
    +
    +
    + + +
    + يبدو صحيحًا! +
    +
    +
    + +
    + + @ +
    + يرجى اختيار اسم مستخدم. +
    +
    +
    +
    + + +
    + يرجى إدخال مدينة صحيحة. +
    +
    +
    + + +
    + يرجى اختيار ولاية صحيحة. +
    +
    +
    + + +
    + يرجى إدخال رمز بريدي صحيح. +
    +
    +
    +
    + + +
    + تجب الموافقة قبل إرسال النموذج. +
    +
    +
    +
    + +
    +
    + {{< /example >}} +
    +
    +
    + +
    +

    العناصر

    + +
    +
    +

    المطوية

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    +

    + +

    +
    +
    + هذا هو محتوى عنصر المطوية الأول. سيكون المحتوى مخفيًا بشكل إفتراضي حتى يقوم Bootstrap بإضافة الكلاسات اللازمة لكل عنصر في المطوية. هذه الكلاسات تتحكم بالمظهر العام ووتتحكم أيضا بإظهار وإخفاء أقسام المطوية عبر حركات CSS الإنتقالية. يمكنك تعديل أي من هذه عبر كلاسات CSS خاصة بك، او عبر تغيير القيم الإفتراضية المقدمة من Bootstrap. من الجدير بالذكر أنه يمكن وضع أي كود HTML هنا، ولكن الحركة الإنتقالية قد تحد من الoverflow. +
    +
    +
    +
    +

    + +

    +
    +
    + هذا هو محتوى عنصر المطوية الثاني. سيكون المحتوى مخفيًا بشكل إفتراضي حتى يقوم Bootstrap بإضافة الكلاسات اللازمة لكل عنصر في المطوية. هذه الكلاسات تتحكم بالمظهر العام ووتتحكم أيضا بإظهار وإخفاء أقسام المطوية عبر حركات CSS الإنتقالية. يمكنك تعديل أي من هذه عبر كلاسات CSS خاصة بك، او عبر تغيير القيم الإفتراضية المقدمة من Bootstrap. من الجدير بالذكر أنه يمكن وضع أي كود HTML هنا، ولكن الحركة الإنتقالية قد تحد من الoverflow. +
    +
    +
    +
    +

    + +

    +
    +
    + هذا هو محتوى عنصر المطوية الثالث. سيكون المحتوى مخفيًا بشكل إفتراضي حتى يقوم Bootstrap بإضافة الكلاسات اللازمة لكل عنصر في المطوية. هذه الكلاسات تتحكم بالمظهر العام ووتتحكم أيضا بإظهار وإخفاء أقسام المطوية عبر حركات CSS الإنتقالية. يمكنك تعديل أي من هذه عبر كلاسات CSS خاصة بك، او عبر تغيير القيم الإفتراضية المقدمة من Bootstrap. من الجدير بالذكر أنه يمكن وضع أي كود HTML هنا، ولكن الحركة الإنتقالية قد تحد من الoverflow. +
    +
    +
    +
    + {{< /example >}} +
    +
    +
    +
    +

    الإنذارات

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} + {{< alerts.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + {{ end -}} + {{< /alerts.inline >}} + {{< /example >}} + + {{< example show_markup="false" >}} + + {{< /example >}} +
    +
    +
    +
    +

    الشارة

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    +

    مثال على عنوان جديد

    + {{< /example >}} + + {{< example show_markup="false" >}} + {{< badge.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + {{ .name | title }}{{- end -}} + {{< /badge.inline >}} + {{< /example >}} +
    +
    + +
    +
    +

    الأزرار

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} + {{< buttons.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + + {{- end -}} + {{< /buttons.inline >}} + + + {{< /example >}} + + {{< example show_markup="false" >}} + {{< buttons.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + + {{- end -}} + {{< /buttons.inline >}} + {{< /example >}} + + {{< example show_markup="false" >}} + + + + {{< /example >}} +
    +
    +
    +
    +

    مجموعة الأزرار

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} + + {{< /example >}} +
    +
    +
    +
    +

    البطاقة

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    +
    + {{< placeholder width="100%" height="180" class="card-img-top" text="غطاء الصورة" >}} +
    +
    عنوان البطاقة
    +

    بعض الأمثلة السريعة للنصوص للبناء على عنوان البطاقة وتشكيل الجزء الأكبر من محتوى البطاقة.

    + اذهب لمكان ما +
    +
    +
    +
    +
    +
    + متميز +
    +
    +
    عنوان البطاقة
    +

    بعض الأمثلة السريعة للنصوص للبناء على عنوان البطاقة وتشكيل الجزء الأكبر من محتوى البطاقة.

    + اذهب لمكان ما +
    + +
    +
    +
    +
    +
    +
    عنوان البطاقة
    +

    بعض الأمثلة السريعة للنصوص للبناء على عنوان البطاقة وتشكيل الجزء الأكبر من محتوى البطاقة.

    +
    +
      +
    • عنصر
    • +
    • عنصر آخر
    • +
    • عنصر ثالث
    • +
    + +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="250" text="صورة" >}} +
    +
    +
    +
    عنوان البطاقة
    +

    هذه بطاقة أعرض مع نص داعم تحتها كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.

    +

    آخر تحديث منذ 3 دقائق

    +
    +
    +
    +
    +
    +
    + {{< /example >}} +
    +
    + + +
    +
    +

    مجموعة العناصر

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
      +
    • عنصر معطل
    • +
    • عنصر ثاني
    • +
    • عنصر ثالث
    • +
    • عنصر رابع
    • +
    • وعنصر خامس أيضًا
    • +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
      +
    • عنصر
    • +
    • عنصر ثاني
    • +
    • عنصر ثالث
    • +
    • عنصر رابع
    • +
    • وعنصر خامس أيضًا
    • +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    + عنصر مجموعة قائمة default بسيط + {{< list.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + عنصر مجموعة قائمة {{ .name }} بسيط + {{- end -}} + {{< /list.inline >}} +
    + {{< /example >}} +
    +
    + + + + +
    +
    +

    الصناديق المنبثقة

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} + + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + {{< /example >}} +
    +
    +
    +
    +

    شريط التقدم

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} +
    +
    0%
    +
    +
    +
    25%
    +
    +
    +
    50%
    +
    +
    +
    75%
    +
    +
    +
    100%
    +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    +
    +
    +
    +
    +
    +
    +
    + {{< /example >}} +
    +
    +
    +
    +

    المخطوطة

    + }}">دليل الإستخدام +
    + +
    +
    + +
    +

    @fat

    +

    محتوى لتوضيح كيف تعمل المخطوطة. ببساطة، المخطوطة عبارة عن منشور طويل يحتوي على عدة أقسام، ولديه شريط تنقل يسهل الوصول إلى هذه الأقسام الفرعية.

    +

    @mdo

    +

    بصرف النظر عن تحسيننا جدوى المكيّفات أو عدم تحسينها، فإن الطلب على الطاقة سيزداد. وطبقاً لما جاء في مقالة معهد ماساشوستس للتكنولوجيا، السالف ذكره، ثمَّة أمر يجب عدم إغفاله، وهو كيف أن هذا الطلب سيضغط على نظم توفير الطاقة الحالية. إذ لا بد من إعادة تأهيل كل شبكات الكهرباء، وتوسيعها لتلبية طلب الطاقة في زمن الذروة، خلال موجات الحرارة المتزايدة. فحين يكون الحر شديداً يجنح الناس إلى البقاء في الداخل، وإلى زيادة تشغيل المكيّفات، سعياً إلى جو لطيف وهم يستخدمون أدوات وأجهزة مختلفة أخرى.

    +

    واحد

    +

    وكل هذه الأمور المتزامنة من تشغيل الأجهزة، يزيد الضغط على شبكات الطاقة، كما أسلفنا. لكن مجرد زيادة سعة الشبكة ليس كافياً. إذ لا بد من تطوير الشبكات الذكية التي تستخدم الجسّاسات، ونظم المراقبة، والبرامج الإلكترونية، لتحديد متى يكون الشاغلون في المبنى، ومتى يكون ثمَّة حاجة إلى الطاقة، ومتى تكون الحرارة منخفضة، وبذلك يخرج الناس، فلا يستخدمون كثيراً من الكهرباء.

    +

    اثنان

    +

    مع الأسف، كل هذه الحلول المبتكرة مكلِّفة، وهذا ما يجعلها عديمة الجدوى في نظر بعض الشركات الخاصة والمواطن المتقشّف. إن بعض الأفراد الواعين بيئياً يبذلون قصارى جهدهم في تقليص استهلاكهم من الطاقة، ويعون جيداً أهمية أجهزة التكييف المجدية والأرفق بالبيئة. ولكن جهات كثيرة لن تتحرّك لمجرد حافز سلامة المناخ ووقف هدر الطاقة، ما دامت لا تحركها حوافز قانونية. وعلى الحكومات أن تُقدِم عند الاهتمام بالتغيّر المناخي، على وضع التشريعات المناسبة. فبالنظم والحوافز والدعم، يمكن دفع الشركات إلى اعتماد الحلول الأجدى في مكاتبها.

    +

    ثلاثة

    +

    وكما يتبيّن لنا، من عدد الحلول الملطِّفة للمشكلة، ومن تنوّعها، وهي الحلول التي أسلفنا الحديث عنها، فإن التكنولوجيا التي نحتاج إليها من أجل معالجة هذه التحديات، هي في مدى قدرتنا، لكنها ربما تتطلّب بعض التحسين، ودعماً استثمارياً أكبر!

    +

    ولا مانع من إضافة محتوى آخر ليس تحت أي قسم معين.

    +
    +
    +
    +
    +
    +
    +

    الدوائر المتحركة

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" >}} + {{< spinner.inline >}} + {{- range (index $.Site.Data "theme-colors") }} +
    + جار التحميل... +
    + {{- end -}} + {{< /spinner.inline >}} + {{< /example >}} + + {{< example show_markup="false" >}} + {{< spinner.inline >}} + {{- range (index $.Site.Data "theme-colors") }} +
    + جار التحميل... +
    + {{- end -}} + {{< /spinner.inline >}} + {{< /example >}} +
    +
    +
    +
    +

    الإشعارات

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" class="bg-dark p-5 align-items-center" >}} + + {{< /example >}} +
    +
    +
    +
    +

    التلميحات

    + }}">دليل الإستخدام +
    + +
    + {{< example show_markup="false" class="tooltip-demo" >}} + + + + + + {{< /example >}} +
    +
    +
    +
    + + + + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.css new file mode 100644 index 000000000..5721a028e --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.css @@ -0,0 +1,163 @@ +body { + scroll-behavior: smooth; +} + +/** + * Bootstrap "Journal code" icon + * @link https://icons.getbootstrap.com/icons/journal-code/ + */ +.bd-heading a::before { + display: inline-block; + width: 1em; + height: 1em; + margin-right: .25rem; + content: ""; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 16 16'%3E%3Cpath d='M4 1h8a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2h1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1H2a2 2 0 0 1 2-2z'/%3E%3Cpath d='M2 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2z'/%3E%3Cpath fill-rule='evenodd' d='M8.646 5.646a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L10.293 8 8.646 6.354a.5.5 0 0 1 0-.708zm-1.292 0a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0 0 .708l2 2a.5.5 0 0 0 .708-.708L5.707 8l1.647-1.646a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E"); + background-size: 1em; +} + +/* stylelint-disable-next-line selector-max-universal */ +.bd-heading + div > * + * { + margin-top: 3rem; +} + +/* Table of contents */ +.bd-aside a { + padding: .1875rem .5rem; + margin-top: .125rem; + margin-left: .3125rem; + color: var(--bs-body-color); +} + +.bd-aside a:hover, +.bd-aside a:focus { + color: var(--bs-body-color); + background-color: rgba(121, 82, 179, .1); +} + +.bd-aside .active { + font-weight: 600; + color: var(--bs-body-color); +} + +.bd-aside .btn { + padding: .25rem .5rem; + font-weight: 600; + color: var(--bs-body-color); +} + +.bd-aside .btn:hover, +.bd-aside .btn:focus { + color: var(--bs-body-color); + background-color: rgba(121, 82, 179, .1); +} + +.bd-aside .btn:focus { + box-shadow: 0 0 0 1px rgba(121, 82, 179, .7); +} + +.bd-aside .btn::before { + width: 1.25em; + line-height: 0; + content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ccc' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e"); + transition: transform .35s ease; + + /* rtl:raw: + transform: rotate(180deg) translateX(-2px); + */ + transform-origin: .5em 50%; +} + +.bd-aside .btn[aria-expanded="true"]::before { + transform: rotate(90deg)/* rtl:ignore */; +} + + +/* Examples */ +.scrollspy-example { + height: 200px; +} + +[id="modal"] .bd-example .btn, +[id="buttons"] .bd-example .btn, +[id="tooltips"] .bd-example .btn, +[id="popovers"] .bd-example .btn, +[id="dropdowns"] .bd-example .btn-group, +[id="dropdowns"] .bd-example .dropdown, +[id="dropdowns"] .bd-example .dropup, +[id="dropdowns"] .bd-example .dropend, +[id="dropdowns"] .bd-example .dropstart { + margin: 0 1rem 1rem 0; +} + +/* Layout */ +@media (min-width: 1200px) { + body { + display: grid; + grid-template-rows: auto; + grid-template-columns: 1fr 4fr 1fr; + gap: 1rem; + } + + .bd-header { + position: fixed; + top: 0; + /* rtl:begin:ignore */ + right: 0; + left: 0; + /* rtl:end:ignore */ + z-index: 1030; + grid-column: 1 / span 3; + } + + .bd-aside, + .bd-cheatsheet { + padding-top: 4rem; + } + + /** + * 1. Too bad only Firefox supports subgrids ATM + */ + .bd-cheatsheet, + .bd-cheatsheet section, + .bd-cheatsheet article { + display: inherit; /* 1 */ + grid-template-rows: auto; + grid-template-columns: 1fr 4fr; + grid-column: 1 / span 2; + gap: inherit; /* 1 */ + } + + .bd-aside { + grid-area: 1 / 3; + scroll-margin-top: 4rem; + } + + .bd-cheatsheet section, + .bd-cheatsheet section > h2 { + top: 2rem; + scroll-margin-top: 2rem; + } + + .bd-cheatsheet section > h2::before { + position: absolute; + /* rtl:begin:ignore */ + top: 0; + right: 0; + bottom: -2rem; + left: 0; + /* rtl:end:ignore */ + z-index: -1; + content: ""; + } + + .bd-cheatsheet article, + .bd-cheatsheet .bd-heading { + top: 8rem; + scroll-margin-top: 8rem; + } + + .bd-cheatsheet .bd-heading { + z-index: 1; + } +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.js b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.js new file mode 100644 index 000000000..e25a89e75 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.js @@ -0,0 +1,73 @@ +/* global bootstrap: false */ + +(() => { + 'use strict' + + // Tooltip and popover demos + document.querySelectorAll('.tooltip-demo') + .forEach(tooltip => { + new bootstrap.Tooltip(tooltip, { + selector: '[data-bs-toggle="tooltip"]' + }) + }) + + document.querySelectorAll('[data-bs-toggle="popover"]') + .forEach(popover => { + new bootstrap.Popover(popover) + }) + + document.querySelectorAll('.toast') + .forEach(toastNode => { + const toast = new bootstrap.Toast(toastNode, { + autohide: false + }) + + toast.show() + }) + + // Disable empty links and submit buttons + document.querySelectorAll('[href="#"], [type="submit"]') + .forEach(link => { + link.addEventListener('click', event => { + event.preventDefault() + }) + }) + + function setActiveItem() { + const { hash } = window.location + + if (hash === '') { + return + } + + const link = document.querySelector(`.bd-aside a[href="${hash}"]`) + + if (!link) { + return + } + + const active = document.querySelector('.bd-aside .active') + const parent = link.parentNode.parentNode.previousElementSibling + + link.classList.add('active') + + if (parent.classList.contains('collapsed')) { + parent.click() + } + + if (!active) { + return + } + + const expanded = active.parentNode.parentNode.previousElementSibling + + active.classList.remove('active') + + if (expanded && parent !== expanded) { + expanded.click() + } + } + + setActiveItem() + window.addEventListener('hashchange', setActiveItem) +})() diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.rtl.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.rtl.css new file mode 100644 index 000000000..416e39fca --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/cheatsheet.rtl.css @@ -0,0 +1,156 @@ +body { + scroll-behavior: smooth; +} + +/** + * Bootstrap "Journal code" icon + * @link https://icons.getbootstrap.com/icons/journal-code/ + */ +.bd-heading a::before { + display: inline-block; + width: 1em; + height: 1em; + margin-left: .25rem; + content: ""; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 16 16'%3E%3Cpath d='M4 1h8a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2h1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1H2a2 2 0 0 1 2-2z'/%3E%3Cpath d='M2 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2z'/%3E%3Cpath fill-rule='evenodd' d='M8.646 5.646a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L10.293 8 8.646 6.354a.5.5 0 0 1 0-.708zm-1.292 0a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0 0 .708l2 2a.5.5 0 0 0 .708-.708L5.707 8l1.647-1.646a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E"); + background-size: 1em; +} + +/* stylelint-disable-next-line selector-max-universal */ +.bd-heading + div > * + * { + margin-top: 3rem; +} + +/* Table of contents */ +.bd-aside a { + padding: .1875rem .5rem; + margin-top: .125rem; + margin-right: .3125rem; + color: var(--bs-body-color); +} + +.bd-aside a:hover, +.bd-aside a:focus { + color: var(--bs-body-color); + background-color: rgba(121, 82, 179, .1); +} + +.bd-aside .active { + font-weight: 600; + color: var(--bs-body-color); +} + +.bd-aside .btn { + padding: .25rem .5rem; + font-weight: 600; + color: var(--bs-body-color); +} + +.bd-aside .btn:hover, +.bd-aside .btn:focus { + color: var(--bs-body-color); + background-color: rgba(121, 82, 179, .1); +} + +.bd-aside .btn:focus { + box-shadow: 0 0 0 1px rgba(121, 82, 179, .7); +} + +.bd-aside .btn::before { + width: 1.25em; + line-height: 0; + content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ccc' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e"); + transition: transform .35s ease; + transform: rotate(180deg) translateX(-2px); + transform-origin: .5em 50%; +} + +.bd-aside .btn[aria-expanded="true"]::before { + transform: rotate(90deg); +} + + +/* Examples */ +.scrollspy-example { + height: 200px; +} + +[id="modal"] .bd-example .btn, +[id="buttons"] .bd-example .btn, +[id="tooltips"] .bd-example .btn, +[id="popovers"] .bd-example .btn, +[id="dropdowns"] .bd-example .btn-group, +[id="dropdowns"] .bd-example .dropdown, +[id="dropdowns"] .bd-example .dropup, +[id="dropdowns"] .bd-example .dropend, +[id="dropdowns"] .bd-example .dropstart { + margin: 0 0 1rem 1rem; +} + +/* Layout */ +@media (min-width: 1200px) { + body { + display: grid; + grid-template-rows: auto; + grid-template-columns: 1fr 4fr 1fr; + gap: 1rem; + } + + .bd-header { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; + grid-column: 1 / span 3; + } + + .bd-aside, + .bd-cheatsheet { + padding-top: 4rem; + } + + /** + * 1. Too bad only Firefox supports subgrids ATM + */ + .bd-cheatsheet, + .bd-cheatsheet section, + .bd-cheatsheet article { + display: inherit; /* 1 */ + grid-template-rows: auto; + grid-template-columns: 1fr 4fr; + grid-column: 1 / span 2; + gap: inherit; /* 1 */ + } + + .bd-aside { + grid-area: 1 / 3; + scroll-margin-top: 4rem; + } + + .bd-cheatsheet section, + .bd-cheatsheet section > h2 { + top: 2rem; + scroll-margin-top: 2rem; + } + + .bd-cheatsheet section > h2::before { + position: absolute; + top: 0; + right: 0; + bottom: -2rem; + left: 0; + z-index: -1; + content: ""; + } + + .bd-cheatsheet article, + .bd-cheatsheet .bd-heading { + top: 8rem; + scroll-margin-top: 8rem; + } + + .bd-cheatsheet .bd-heading { + z-index: 1; + } +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/index.html new file mode 100644 index 000000000..4c96bc0ae --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cheatsheet/index.html @@ -0,0 +1,1606 @@ +--- +layout: examples +title: Cheatsheet +extra_css: + - "cheatsheet.css" +extra_js: + - src: "cheatsheet.js" +body_class: "bg-body-tertiary" +--- + +
    + +
    + +
    +
    +

    Contents

    + +
    +
    +

    Typography

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +

    Display 1

    +

    Display 2

    +

    Display 3

    +

    Display 4

    +

    Display 5

    +

    Display 6

    + {{< /example >}} + + {{< example show_markup="false" >}} +

    Heading 1

    +

    Heading 2

    +

    Heading 3

    +

    Heading 4

    +

    Heading 5

    +

    Heading 6

    + {{< /example >}} + + {{< example show_markup="false" >}} +

    + This is a lead paragraph. It stands out from regular paragraphs. +

    + {{< /example >}} + + {{< example show_markup="false" >}} +

    You can use the mark tag to highlight text.

    +

    This line of text is meant to be treated as deleted text.

    +

    This line of text is meant to be treated as no longer accurate.

    +

    This line of text is meant to be treated as an addition to the document.

    +

    This line of text will render as underlined.

    +

    This line of text is meant to be treated as fine print.

    +

    This line rendered as bold text.

    +

    This line rendered as italicized text.

    + {{< /example >}} + + {{< example show_markup="false" >}} +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    +

    A well-known quote, contained in a blockquote element.

    +
    Someone famous in Source Title
    +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
      +
    • This is a list.
    • +
    • It appears completely unstyled.
    • +
    • Structurally, it's still a list.
    • +
    • However, this style only applies to immediate child elements.
    • +
    • Nested lists: +
        +
      • are unaffected by this style
      • +
      • will still show a bullet
      • +
      • and have appropriate left margin
      • +
      +
    • +
    • This may still come in handy in some situations.
    • +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
      +
    • This is a list item.
    • +
    • And another one.
    • +
    • But they're displayed inline.
    • +
    + {{< /example >}} +
    +
    +
    +
    +

    Images

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + {{< placeholder width="100%" height="250" class="bd-placeholder-img-lg img-fluid" text="Responsive image" >}} + {{< /example >}} + + {{< example show_markup="false" >}} + {{< placeholder width="200" height="200" class="img-thumbnail" title="A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera" >}} + {{< /example >}} +
    +
    +
    +
    +

    Tables

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #FirstLastHandle
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #FirstLastHandle
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + {{< table.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + + + + + + {{- end -}} + {{< /table.inline >}} + +
    ClassHeadingHeading
    DefaultCellCell
    {{ .name | title }}CellCell
    + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #FirstLastHandle
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    + {{< /example >}} +
    +
    +
    +
    +

    Figures

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    + {{< placeholder width="400" height="300" class="figure-img img-fluid rounded" >}} +
    A caption for the above image.
    +
    + {{< /example >}} +
    +
    +
    + +
    +

    Forms

    + +
    +
    +

    Overview

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    + + +
    We'll never share your email with anyone else.
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + Radios buttons +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + {{< /example >}} +
    +
    +
    +
    +

    Disabled forms

    + }}#disabled-forms">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + Disabled radios buttons +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + {{< /example >}} +
    +
    +
    + + +
    + {{< example show_markup="false" >}} +
    + +
    +
    + +
    +
    + +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    + +
    +
    + +
    +
    + +
    + {{< /example >}} +
    +
    +
    +
    +

    Input group

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    + @ + +
    +
    + + @example.com +
    + +
    + https://example.com/users/ + +
    +
    + $ + + .00 +
    +
    + With textarea + +
    + {{< /example >}} +
    +
    +
    +
    +

    Floating labels

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    + + +
    +
    + + +
    +
    + {{< /example >}} +
    +
    +
    +
    +

    Validation

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    + + +
    + Looks good! +
    +
    +
    + + +
    + Looks good! +
    +
    +
    + +
    + @ + +
    + Please choose a username. +
    +
    +
    +
    + + +
    + Please provide a valid city. +
    +
    +
    + + +
    + Please select a valid state. +
    +
    +
    + + +
    + Please provide a valid zip. +
    +
    +
    +
    + + +
    + You must agree before submitting. +
    +
    +
    +
    + +
    +
    + {{< /example >}} +
    +
    +
    + +
    +

    Components

    + +
    +
    +

    Accordion

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    +

    + +

    +
    +
    + This is the first item's accordion body. It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the .accordion-body, though the transition does limit overflow. +
    +
    +
    +
    +

    + +

    +
    +
    + This is the second item's accordion body. It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the .accordion-body, though the transition does limit overflow. +
    +
    +
    +
    +

    + +

    +
    +
    + This is the third item's accordion body. It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the .accordion-body, though the transition does limit overflow. +
    +
    +
    +
    + {{< /example >}} +
    +
    +
    +
    +

    Alerts

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + {{< alerts.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + {{ end -}} + {{< /alerts.inline >}} + {{< /example >}} + + {{< example show_markup="false" >}} + + {{< /example >}} +
    +
    +
    +
    +

    Badge

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +

    Example heading New

    +

    Example heading New

    +

    Example heading New

    +

    Example heading New

    +

    Example heading New

    +

    Example heading New

    +

    Example heading New

    +

    Example heading New

    + {{< /example >}} + + {{< example show_markup="false" >}} + {{< badge.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + {{ .name | title }}{{- end -}} + {{< /badge.inline >}} + {{< /example >}} +
    +
    + +
    +
    +

    Buttons

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + {{< buttons.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + + {{- end -}} + {{< /buttons.inline >}} + + + {{< /example >}} + + {{< example show_markup="false" >}} + {{< buttons.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + + {{- end -}} + {{< /buttons.inline >}} + {{< /example >}} + + {{< example show_markup="false" >}} + + + + {{< /example >}} +
    +
    +
    +
    +

    Button group

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + + {{< /example >}} +
    +
    +
    +
    +

    Card

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    +
    + {{< placeholder width="100%" height="180" class="card-img-top" text="Image cap" >}} +
    +
    Card title
    +

    Some quick example text to build on the card title and make up the bulk of the card's content.

    + Go somewhere +
    +
    +
    +
    +
    +
    + Featured +
    +
    +
    Card title
    +

    Some quick example text to build on the card title and make up the bulk of the card's content.

    + Go somewhere +
    + +
    +
    +
    +
    +
    +
    Card title
    +

    Some quick example text to build on the card title and make up the bulk of the card's content.

    +
    +
      +
    • An item
    • +
    • A second item
    • +
    • A third item
    • +
    + +
    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="250" text="Image" >}} +
    +
    +
    +
    Card title
    +

    This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +

    Last updated 3 mins ago

    +
    +
    +
    +
    +
    +
    + {{< /example >}} +
    +
    + + +
    +
    +

    List group

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
      +
    • A disabled item
    • +
    • A second item
    • +
    • A third item
    • +
    • A fourth item
    • +
    • And a fifth one
    • +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
      +
    • An item
    • +
    • A second item
    • +
    • A third item
    • +
    • A fourth item
    • +
    • And a fifth one
    • +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    + A simple default list group item + {{< list.inline >}} + {{- range (index $.Site.Data "theme-colors") }} + A simple {{ .name }} list group item + {{- end -}} + {{< /list.inline >}} +
    + {{< /example >}} +
    +
    + + + +
    +
    +

    Pagination

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + + {{< /example >}} + + {{< example show_markup="false" >}} + + {{< /example >}} + + {{< example show_markup="false" >}} + + {{< /example >}} +
    +
    +
    +
    +

    Popovers

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + + {{< /example >}} + + {{< example show_markup="false" >}} + + + + + {{< /example >}} +
    +
    +
    +
    +

    Progress

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} +
    +
    0%
    +
    +
    +
    25%
    +
    +
    +
    50%
    +
    +
    +
    75%
    +
    +
    +
    100%
    +
    + {{< /example >}} + + {{< example show_markup="false" >}} +
    +
    +
    +
    +
    +
    +
    +
    + {{< /example >}} +
    +
    +
    +
    +

    Scrollspy

    + }}">Documentation +
    + +
    +
    + +
    +

    First heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Second heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Third heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Fourth heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +

    Fifth heading

    +

    This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.

    +
    +
    +
    +
    +
    +
    +

    Spinners

    + }}">Documentation +
    + +
    + {{< example show_markup="false" >}} + {{< spinner.inline >}} + {{- range (index $.Site.Data "theme-colors") }} +
    + Loading... +
    + {{- end -}} + {{< /spinner.inline >}} + {{< /example >}} + + {{< example show_markup="false" >}} + {{< spinner.inline >}} + {{- range (index $.Site.Data "theme-colors") }} +
    + Loading... +
    + {{- end -}} + {{< /spinner.inline >}} + {{< /example >}} +
    +
    +
    +
    +

    Toasts

    + }}">Documentation +
    + +
    + {{< example show_markup="false" class="bg-dark p-5 align-items-center" >}} + + {{< /example >}} +
    +
    +
    +
    +

    Tooltips

    + }}">Documentation +
    + +
    + {{< example show_markup="false" class="tooltip-demo" >}} + + + + + + {{< /example >}} +
    +
    +
    +
    + + + + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout-rtl/index.html new file mode 100644 index 000000000..6516efea6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout-rtl/index.html @@ -0,0 +1,232 @@ +--- +layout: examples +title: مثال إتمام الشراء +direction: rtl +extra_css: + - "../checkout/checkout.css" +extra_js: + - src: "../checkout/checkout.js" +body_class: "bg-body-tertiary" +--- + +
    +
    +
    + +

    نموذج إتمام الشراء

    +

    فيما يلي مثال على نموذج تم إنشاؤه بالكامل باستخدام عناصر تحكم النموذج في Bootstrap. لكل مجموعة نماذج مطلوبة حالة تحقق يمكن تشغيلها بمحاولة إرسال النموذج دون استكماله.

    +
    + +
    +
    +

    + عربة التسوق + 3 +

    +
      +
    • +
      +
      اسم المنتج
      + وصف مختصر +
      + $12 +
    • +
    • +
      +
      المنتج الثاني
      + وصف مختصر +
      + $8 +
    • +
    • +
      +
      البند الثالث
      + وصف مختصر +
      + $5 +
    • +
    • +
      +
      رمز ترويجي
      + EXAMPLECODE +
      + -$5 +
    • +
    • + مجموع (USD) + $20 +
    • +
    + +
    +
    + + +
    +
    +
    +
    +

    عنوان الفوترة

    +
    +
    +
    + + +
    + يرجى إدخال اسم أول صحيح. +
    +
    + +
    + + +
    + يرجى إدخال اسم عائلة صحيح. +
    +
    + +
    + +
    + @ + +
    + اسم المستخدم الخاص بك مطلوب. +
    +
    +
    + +
    + + +
    + يرجى إدخال عنوان بريد إلكتروني صحيح لتصلكم تحديثات الشحن. +
    +
    + +
    + + +
    + يرجى إدخال عنوان الشحن الخاص بك. +
    +
    + +
    + + +
    + +
    + + +
    + يرجى اختيار بلد صحيح. +
    +
    + +
    + + +
    + يرجى اختيار اسم منطقة صحيح. +
    +
    + +
    + + +
    + الرمز البريدي مطلوب. +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + +

    طريقة الدفع

    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + + الاسم الكامل كما هو معروض على البطاقة +
    + الاسم على البطاقة مطلوب +
    +
    + +
    + + +
    + رقم بطاقة الائتمان مطلوب +
    +
    + +
    + + +
    + تاريخ انتهاء الصلاحية مطلوب +
    +
    + +
    + + +
    + رمز الحماية مطلوب +
    +
    +
    + +
    + + +
    +
    +
    +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/checkout/form-validation.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/checkout.css similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/checkout/form-validation.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/checkout.css diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/checkout.js b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/checkout.js new file mode 100644 index 000000000..30ea0aa6b --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/checkout.js @@ -0,0 +1,19 @@ +// Example starter JavaScript for disabling form submissions if there are invalid fields +(() => { + 'use strict' + + // Fetch all the forms we want to apply custom Bootstrap validation styles to + const forms = document.querySelectorAll('.needs-validation') + + // Loop over them and prevent submission + Array.from(forms).forEach(form => { + form.addEventListener('submit', event => { + if (!form.checkValidity()) { + event.preventDefault() + event.stopPropagation() + } + + form.classList.add('was-validated') + }, false) + }) +})() diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/index.html new file mode 100644 index 000000000..d39f0f2a4 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/checkout/index.html @@ -0,0 +1,232 @@ +--- +layout: examples +title: Checkout example +extra_css: + - "checkout.css" +extra_js: + - src: "checkout.js" +body_class: "bg-body-tertiary" +--- + +
    +
    +
    + +

    Checkout form

    +

    Below is an example form built entirely with Bootstrap’s form controls. Each required form group has a validation state that can be triggered by attempting to submit the form without completing it.

    +
    + +
    +
    +

    + Your cart + 3 +

    +
      +
    • +
      +
      Product name
      + Brief description +
      + $12 +
    • +
    • +
      +
      Second product
      + Brief description +
      + $8 +
    • +
    • +
      +
      Third item
      + Brief description +
      + $5 +
    • +
    • +
      +
      Promo code
      + EXAMPLECODE +
      + −$5 +
    • +
    • + Total (USD) + $20 +
    • +
    + +
    +
    + + +
    +
    +
    +
    +

    Billing address

    +
    +
    +
    + + +
    + Valid first name is required. +
    +
    + +
    + + +
    + Valid last name is required. +
    +
    + +
    + +
    + @ + +
    + Your username is required. +
    +
    +
    + +
    + + +
    + Please enter a valid email address for shipping updates. +
    +
    + +
    + + +
    + Please enter your shipping address. +
    +
    + +
    + + +
    + +
    + + +
    + Please select a valid country. +
    +
    + +
    + + +
    + Please provide a valid state. +
    +
    + +
    + + +
    + Zip code required. +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    + +
    + +

    Payment

    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + + Full name as displayed on card +
    + Name on card is required +
    +
    + +
    + + +
    + Credit card number is required +
    +
    + +
    + + +
    + Expiration date required +
    +
    + +
    + + +
    + Security code required +
    +
    +
    + +
    + + +
    +
    +
    +
    + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/cover/cover.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cover/cover.css similarity index 83% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/cover/cover.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cover/cover.css index 87afc3be9..2e7aef8f8 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/cover/cover.css +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cover/cover.css @@ -4,9 +4,9 @@ /* Custom default button */ -.btn-secondary, -.btn-secondary:hover, -.btn-secondary:focus { +.btn-light, +.btn-light:hover, +.btn-light:focus { color: #333; text-shadow: none; /* Prevent inheritance from `body` */ } @@ -31,10 +31,7 @@ body { */ .nav-masthead .nav-link { - padding: .25rem 0; - font-weight: 700; color: rgba(255, 255, 255, .5); - background-color: transparent; border-bottom: .25rem solid transparent; } diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cover/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cover/index.html new file mode 100644 index 000000000..002a5c310 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/cover/index.html @@ -0,0 +1,33 @@ +--- +layout: examples +title: Cover Template +extra_css: + - "cover.css" +html_class: "h-100" +body_class: "d-flex h-100 text-center text-bg-dark" +--- + +
    +
    +
    +

    Cover

    + +
    +
    + +
    +

    Cover your page.

    +

    Cover is a one-page template for building simple and beautiful home pages. Download, edit the text, and add your own fullscreen background photo to make it your own.

    +

    + Learn more +

    +
    + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard-rtl/dashboard.js b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard-rtl/dashboard.js new file mode 100644 index 000000000..bdb3029d3 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard-rtl/dashboard.js @@ -0,0 +1,49 @@ +/* globals Chart:false */ + +(() => { + 'use strict' + + // Graphs + const ctx = document.getElementById('myChart') + // eslint-disable-next-line no-unused-vars + const myChart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + 'الأحد', + 'الإثنين', + 'الثلاثاء', + 'الأربعاء', + 'الخميس', + 'الجمعة', + 'السبت' + ], + datasets: [{ + data: [ + 15339, + 21345, + 18483, + 24003, + 23489, + 24092, + 12034 + ], + lineTension: 0, + backgroundColor: 'transparent', + borderColor: '#007bff', + borderWidth: 4, + pointBackgroundColor: '#007bff' + }] + }, + options: { + plugins: { + legend: { + display: false + }, + tooltip: { + boxPadding: 3 + } + } + } + }) +})() diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard-rtl/index.html new file mode 100644 index 000000000..ffdd9d100 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard-rtl/index.html @@ -0,0 +1,333 @@ +--- +layout: examples +title: قالب لوحة القيادة +direction: rtl +extra_css: + - "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.min.css" + - "../dashboard/dashboard.rtl.css" +extra_js: + - src: "https://cdn.jsdelivr.net/npm/chart.js@4.3.2/dist/chart.umd.js" + integrity: "sha384-eI7PSr3L1XLISH8JdDII5YN/njoSsxfbrkCTnJrzXt+ENP5MOVBxD+l6sEG4zoLp" + - src: "dashboard.js" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    +

    لوحة القيادة

    +
    +
    + + +
    + +
    +
    + + + +

    عنوان القسم

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #عنوانعنوانعنوانعنوان
    1,001بياناتعشوائيةتثريالجدول
    1,002تثريمبهةتصميمتنسيق
    1,003عشوائيةغنيةقيمةمفيدة
    1,003معلوماتتثريتوضيحيةعشوائية
    1,004الجدولبياناتتنسيققيمة
    1,005قيمةمبهةالجدولتثري
    1,006قيمةتوضيحيةغنيةعشوائية
    1,007تثريمفيدةمعلوماتمبهة
    1,008بياناتعشوائيةتثريالجدول
    1,009تثريمبهةتصميمتنسيق
    1,010عشوائيةغنيةقيمةمفيدة
    1,011معلوماتتثريتوضيحيةعشوائية
    1,012الجدولتثريتنسيققيمة
    1,013قيمةمبهةالجدولتصميم
    1,014قيمةتوضيحيةغنيةعشوائية
    1,015بياناتمفيدةمعلوماتالجدول
    +
    +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.css new file mode 100644 index 000000000..154940c90 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.css @@ -0,0 +1,48 @@ +.bi { + display: inline-block; + width: 1rem; + height: 1rem; +} + +/* + * Sidebar + */ + +@media (min-width: 768px) { + .sidebar .offcanvas-lg { + position: -webkit-sticky; + position: sticky; + top: 48px; + } + .navbar-search { + display: block; + } +} + +.sidebar .nav-link { + font-size: .875rem; + font-weight: 500; +} + +.sidebar .nav-link.active { + color: #2470dc; +} + +.sidebar-heading { + font-size: .75rem; +} + +/* + * Navbar + */ + +.navbar-brand { + padding-top: .75rem; + padding-bottom: .75rem; + background-color: rgba(0, 0, 0, .25); + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25); +} + +.navbar .form-control { + padding: .75rem 1rem; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.js b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.js new file mode 100644 index 000000000..a60b39356 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.js @@ -0,0 +1,49 @@ +/* globals Chart:false */ + +(() => { + 'use strict' + + // Graphs + const ctx = document.getElementById('myChart') + // eslint-disable-next-line no-unused-vars + const myChart = new Chart(ctx, { + type: 'line', + data: { + labels: [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday' + ], + datasets: [{ + data: [ + 15339, + 21345, + 18483, + 24003, + 23489, + 24092, + 12034 + ], + lineTension: 0, + backgroundColor: 'transparent', + borderColor: '#007bff', + borderWidth: 4, + pointBackgroundColor: '#007bff' + }] + }, + options: { + plugins: { + legend: { + display: false + }, + tooltip: { + boxPadding: 3 + } + } + } + }) +})() diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.rtl.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.rtl.css new file mode 100644 index 000000000..5c8a7e257 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/dashboard.rtl.css @@ -0,0 +1,48 @@ +.bi { + display: inline-block; + width: 1rem; + height: 1rem; +} + +/* + * Sidebar + */ + +@media (min-width: 768px) { + .sidebar .offcanvas-lg { + position: -webkit-sticky; + position: sticky; + top: 48px; + } + .navbar-search { + display: block; + } +} + +.sidebar .nav-link { + font-size: .875rem; + font-weight: 500; +} + +.sidebar .nav-link.active { + color: #2470dc; +} + +.sidebar-heading { + font-size: .75rem; +} + +/* + * Navbar + */ + +.navbar-brand { + padding-top: .75rem; + padding-bottom: .75rem; + background-color: rgba(0, 0, 0, .25); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, .25); +} + +.navbar .form-control { + padding: .75rem 1rem; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/index.html new file mode 100644 index 000000000..d060048b6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dashboard/index.html @@ -0,0 +1,332 @@ +--- +layout: examples +title: Dashboard Template +extra_css: + - "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.min.css" + - "dashboard.css" +extra_js: + - src: "https://cdn.jsdelivr.net/npm/chart.js@4.3.2/dist/chart.umd.js" + integrity: "sha384-eI7PSr3L1XLISH8JdDII5YN/njoSsxfbrkCTnJrzXt+ENP5MOVBxD+l6sEG4zoLp" + - src: "dashboard.js" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    +

    Dashboard

    +
    +
    + + +
    + +
    +
    + + + +

    Section title

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #HeaderHeaderHeaderHeader
    1,001randomdataplaceholdertext
    1,002placeholderirrelevantvisuallayout
    1,003datarichdashboardtabular
    1,003informationplaceholderillustrativedata
    1,004textrandomlayoutdashboard
    1,005dashboardirrelevanttextplaceholder
    1,006dashboardillustrativerichdata
    1,007placeholdertabularinformationirrelevant
    1,008randomdataplaceholdertext
    1,009placeholderirrelevantvisuallayout
    1,010datarichdashboardtabular
    1,011informationplaceholderillustrativedata
    1,012textplaceholderlayoutdashboard
    1,013dashboardirrelevanttextvisual
    1,014dashboardillustrativerichdata
    1,015randomtabularinformationtext
    +
    +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dropdowns/dropdowns.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dropdowns/dropdowns.css new file mode 100644 index 000000000..f633e2cd8 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dropdowns/dropdowns.css @@ -0,0 +1,71 @@ +.dropdown-item-danger { + color: var(--bs-red); +} +.dropdown-item-danger:hover, +.dropdown-item-danger:focus { + color: #fff; + background-color: var(--bs-red); +} +.dropdown-item-danger.active { + background-color: var(--bs-red); +} + +.btn-hover-light { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); +} +.btn-hover-light:hover, +.btn-hover-light:focus { + color: var(--bs-link-hover-color); + background-color: var(--bs-tertiary-bg); +} + +.cal-month, +.cal-days, +.cal-weekdays { + display: grid; + grid-template-columns: repeat(7, 1fr); + align-items: center; +} +.cal-month-name { + grid-column-start: 2; + grid-column-end: 7; + text-align: center; +} +.cal-weekday, +.cal-btn { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: center; + height: 3rem; + padding: 0; +} +.cal-btn:not([disabled]) { + font-weight: 500; + color: var(--bs-emphasis-color); +} +.cal-btn:hover, +.cal-btn:focus { + background-color: var(--bs-secondary-bg); +} +.cal-btn[disabled] { + border: 0; + opacity: .5; +} + +.w-220px { + width: 220px; +} + +.w-280px { + width: 280px; +} + +.w-340px { + width: 340px; +} + +.opacity-10 { + opacity: .1; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dropdowns/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dropdowns/index.html new file mode 100644 index 000000000..66140413f --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/dropdowns/index.html @@ -0,0 +1,462 @@ +--- +layout: examples +title: Dropdowns +extra_css: + - "dropdowns.css" +body_class: "" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + + + +
    + +
    + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/features.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/features.css new file mode 100644 index 000000000..debc26364 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/features.css @@ -0,0 +1,26 @@ +.feature-icon { + width: 4rem; + height: 4rem; + border-radius: .75rem; +} + +.icon-square { + width: 3rem; + height: 3rem; + border-radius: .75rem; +} + +.text-shadow-1 { text-shadow: 0 .125rem .25rem rgba(0, 0, 0, .25); } +.text-shadow-2 { text-shadow: 0 .25rem .5rem rgba(0, 0, 0, .25); } +.text-shadow-3 { text-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .25); } + +.card-cover { + background-repeat: no-repeat; + background-position: center center; + background-size: cover; +} + +.feature-icon-small { + width: 3rem; + height: 3rem; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/index.html new file mode 100644 index 000000000..a2d4b73a8 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/index.html @@ -0,0 +1,340 @@ +--- +layout: examples +title: Features +extra_css: + - "features.css" +body_class: "" +--- + + + + Bootstrap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Features examples

    + + + +
    + +
    +

    Hanging icons

    +
    +
    +
    + +
    +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.

    + + Primary button + +
    +
    +
    +
    + +
    +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.

    + + Primary button + +
    +
    +
    +
    + +
    +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.

    + + Primary button + +
    +
    +
    +
    + +
    + +
    +

    Custom cards

    + +
    +
    +
    +
    +

    Short title, long jacket

    +
      +
    • + Bootstrap +
    • +
    • + + Earth +
    • +
    • + + 3d +
    • +
    +
    +
    +
    + +
    +
    +
    +

    Much longer title that wraps to multiple lines

    +
      +
    • + Bootstrap +
    • +
    • + + Pakistan +
    • +
    • + + 4d +
    • +
    +
    +
    +
    + +
    +
    +
    +

    Another longer title belongs here

    +
      +
    • + Bootstrap +
    • +
    • + + California +
    • +
    • + + 5d +
    • +
    +
    +
    +
    +
    +
    + +
    + +
    +

    Icon grid

    + +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    +
    + +
    + +
    +

    Features with title

    + +
    +
    +

    Left-aligned title explaining these awesome features

    +

    Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.

    + Primary button +
    + +
    +
    +
    +
    + + + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    + +
    +
    + + + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    + +
    +
    + + + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    + +
    +
    + + + +
    +

    Featured title

    +

    Paragraph of text beneath the heading to explain the heading.

    +
    +
    +
    +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-1.jpg b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-1.jpg similarity index 99% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-1.jpg rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-1.jpg index ed2e36a78..283acd0b4 100644 Binary files a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-1.jpg and b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-1.jpg differ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-2.jpg b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-2.jpg similarity index 99% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-2.jpg rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-2.jpg index b66864a00..81eae64d8 100644 Binary files a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-2.jpg and b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-2.jpg differ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-3.jpg b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-3.jpg similarity index 99% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-3.jpg rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-3.jpg index c411b17ec..0f401d1e1 100644 Binary files a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/features/unsplash-photo-3.jpg and b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/features/unsplash-photo-3.jpg differ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/footers/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/footers/index.html new file mode 100644 index 000000000..b78d5aad8 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/footers/index.html @@ -0,0 +1,186 @@ +--- +layout: examples +title: Footers +body_class: "" +--- + + + + Bootstrap + + + + + + + + + + + + + +
    + +
    + +
    + +
    +
    +
    + + + + © {{< year >}} Company, Inc +
    + + +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/grid/grid.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/grid/grid.css new file mode 100644 index 000000000..cbc7c311f --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/grid/grid.css @@ -0,0 +1,13 @@ +.themed-grid-col { + padding-top: .75rem; + padding-bottom: .75rem; + background-color: rgba(112.520718, 44.062154, 249.437846, .15); + border: 1px solid rgba(112.520718, 44.062154, 249.437846, .3); +} + +.themed-container { + padding: .75rem; + margin-bottom: 1.5rem; + background-color: rgba(112.520718, 44.062154, 249.437846, .15); + border: 1px solid rgba(112.520718, 44.062154, 249.437846, .3); +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/grid/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/grid/index.html new file mode 100644 index 000000000..8a6158202 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/grid/index.html @@ -0,0 +1,187 @@ +--- +layout: examples +title: Grid Template +extra_css: + - "grid.css" +body_class: "py-4" +--- + +
    +
    + +

    Bootstrap grid examples

    +

    Basic grid layouts to get you familiar with building within the Bootstrap grid system.

    +

    In these examples the .themed-grid-col class is added to the columns to add some theming. This is not a class that is available in Bootstrap by default.

    + +

    Five grid tiers

    +

    There are five tiers to the Bootstrap grid system, one for each range of devices we support. Each tier starts at a minimum viewport size and automatically applies to the larger devices unless overridden.

    + +
    +
    .col-4
    +
    .col-4
    +
    .col-4
    +
    + +
    +
    .col-sm-4
    +
    .col-sm-4
    +
    .col-sm-4
    +
    + +
    +
    .col-md-4
    +
    .col-md-4
    +
    .col-md-4
    +
    + +
    +
    .col-lg-4
    +
    .col-lg-4
    +
    .col-lg-4
    +
    + +
    +
    .col-xl-4
    +
    .col-xl-4
    +
    .col-xl-4
    +
    + +
    +
    .col-xxl-4
    +
    .col-xxl-4
    +
    .col-xxl-4
    +
    + +

    Three equal columns

    +

    Get three equal-width columns starting at desktops and scaling to large desktops. On mobile devices, tablets and below, the columns will automatically stack.

    +
    +
    .col-md-4
    +
    .col-md-4
    +
    .col-md-4
    +
    + +

    Three equal columns alternative

    +

    By using the .row-cols-* classes, you can easily create a grid with equal columns.

    +
    +
    .col child of .row-cols-md-3
    +
    .col child of .row-cols-md-3
    +
    .col child of .row-cols-md-3
    +
    + +

    Three unequal columns

    +

    Get three columns starting at desktops and scaling to large desktops of various widths. Remember, grid columns should add up to twelve for a single horizontal block. More than that, and columns start stacking no matter the viewport.

    +
    +
    .col-md-3
    +
    .col-md-6
    +
    .col-md-3
    +
    + +

    Two columns

    +

    Get two columns starting at desktops and scaling to large desktops.

    +
    +
    .col-md-8
    +
    .col-md-4
    +
    + +

    Full width, single column

    +

    + No grid classes are necessary for full-width elements. +

    + +
    + +

    Two columns with two nested columns

    +

    Per the documentation, nesting is easy—just put a row of columns within an existing column. This gives you two columns starting at desktops and scaling to large desktops, with another two (equal widths) within the larger column.

    +

    At mobile device sizes, tablets and down, these columns and their nested columns will stack.

    +
    +
    +
    + .col-md-8 +
    +
    +
    .col-md-6
    +
    .col-md-6
    +
    +
    +
    .col-md-4
    +
    + +
    + +

    Mixed: mobile and desktop

    +

    The Bootstrap v5 grid system has six tiers of classes: xs (extra small, this class infix is not used), sm (small), md (medium), lg (large), xl (x-large), and xxl (xx-large). You can use nearly any combination of these classes to create more dynamic and flexible layouts.

    +

    Each tier of classes scales up, meaning if you plan on setting the same widths for md, lg, xl and xxl, you only need to specify md.

    +
    +
    .col-md-8
    +
    .col-6 .col-md-4
    +
    +
    +
    .col-6 .col-md-4
    +
    .col-6 .col-md-4
    +
    .col-6 .col-md-4
    +
    +
    +
    .col-6
    +
    .col-6
    +
    + +
    + +

    Mixed: mobile, tablet, and desktop

    +
    +
    .col-sm-6 .col-lg-8
    +
    .col-6 .col-lg-4
    +
    +
    +
    .col-6 .col-sm-4
    +
    .col-6 .col-sm-4
    +
    .col-6 .col-sm-4
    +
    + +
    + +

    Gutters

    +

    With .gx-* classes, the horizontal gutters can be adjusted.

    +
    +
    .col with .gx-4 gutters
    +
    .col with .gx-4 gutters
    +
    .col with .gx-4 gutters
    +
    .col with .gx-4 gutters
    +
    .col with .gx-4 gutters
    +
    .col with .gx-4 gutters
    +
    +

    Use the .gy-* classes to control the vertical gutters.

    +
    +
    .col with .gy-4 gutters
    +
    .col with .gy-4 gutters
    +
    .col with .gy-4 gutters
    +
    .col with .gy-4 gutters
    +
    .col with .gy-4 gutters
    +
    .col with .gy-4 gutters
    +
    +

    With .g-* classes, the gutters in both directions can be adjusted.

    +
    +
    .col with .g-3 gutters
    +
    .col with .g-3 gutters
    +
    .col with .g-3 gutters
    +
    .col with .g-3 gutters
    +
    .col with .g-3 gutters
    +
    .col with .g-3 gutters
    +
    +
    + +
    +
    + +

    Containers

    +

    Additional classes added in Bootstrap v4.4 allow containers that are 100% wide until a particular breakpoint. v5 adds a new xxl breakpoint.

    +
    + +
    .container
    +
    .container-sm
    +
    .container-md
    +
    .container-lg
    +
    .container-xl
    +
    .container-xxl
    +
    .container-fluid
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/headers/headers.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/headers/headers.css new file mode 100644 index 000000000..f887573fe --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/headers/headers.css @@ -0,0 +1,15 @@ +.form-control-dark { + border-color: var(--bs-gray); +} +.form-control-dark:focus { + border-color: #fff; + box-shadow: 0 0 0 .25rem rgba(255, 255, 255, .25); +} + +.text-small { + font-size: 85%; +} + +.dropdown-toggle:not(:focus) { + outline: 0; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/headers/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/headers/index.html new file mode 100644 index 000000000..2be0d36ad --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/headers/index.html @@ -0,0 +1,297 @@ +--- +layout: examples +title: Headers +extra_css: + - "headers.css" +body_class: "" +--- + + + + Bootstrap + + + + + + + + + + + + + + + + + + + + + +
    +

    Headers examples

    + + + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + +
    + + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + + + + + + + + +
    + + +
    +
    +
    +
    + +
    + +
    +
    +
    + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + + +
    + + + +
    +
    +
    + +
    +
    +
    +









    +
    +
    +









    +
    +
    +
    + +
    + + +
    + +
    + +
    + +
    + +
    +
    + + +
    + + +
    +
    +
    +
    + +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/bootstrap-docs.png b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/bootstrap-docs.png new file mode 100644 index 000000000..daf9c62d1 Binary files /dev/null and b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/bootstrap-docs.png differ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/heroes/bootstrap-themes.png b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/bootstrap-themes.png similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/heroes/bootstrap-themes.png rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/bootstrap-themes.png diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/heroes.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/heroes.css new file mode 100644 index 000000000..e9deaf744 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/heroes.css @@ -0,0 +1,3 @@ +@media (min-width: 992px) { + .rounded-lg-3 { border-radius: .3rem; } +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/index.html new file mode 100644 index 000000000..7f5daa9b9 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/heroes/index.html @@ -0,0 +1,125 @@ +--- +layout: examples +title: Heroes +extra_css: + - "heroes.css" +body_class: "" +--- + +
    +

    Heroes examples

    + +
    + +

    Centered hero

    +
    +

    Quickly design and customize responsive mobile-first sites with Bootstrap, the world’s most popular front-end open source toolkit, featuring Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful JavaScript plugins.

    +
    + + +
    +
    +
    + +
    + +
    +

    Centered screenshot

    +
    +

    Quickly design and customize responsive mobile-first sites with Bootstrap, the world’s most popular front-end open source toolkit, featuring Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful JavaScript plugins.

    +
    + + +
    +
    +
    +
    + Example image +
    +
    +
    + +
    + +
    +
    +
    + Bootstrap Themes +
    +
    +

    Responsive left-aligned hero with image

    +

    Quickly design and customize responsive mobile-first sites with Bootstrap, the world’s most popular front-end open source toolkit, featuring Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful JavaScript plugins.

    +
    + + +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Vertically centered hero sign-up form

    +

    Below is an example form built entirely with Bootstrap’s form controls. Each required form group has a validation state that can be triggered by attempting to submit the form without completing it.

    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + +
    + +
    + By clicking Sign up, you agree to the terms of use. +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Border hero with cropped image and shadows

    +

    Quickly design and customize responsive mobile-first sites with Bootstrap, the world’s most popular front-end open source toolkit, featuring Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful JavaScript plugins.

    +
    + + +
    +
    +
    + +
    +
    +
    + +
    + +
    +
    +

    Dark color hero

    +
    +

    Quickly design and customize responsive mobile-first sites with Bootstrap, the world’s most popular front-end open source toolkit, featuring Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful JavaScript plugins.

    +
    + + +
    +
    +
    +
    + +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotron/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotron/index.html new file mode 100644 index 000000000..049684df6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotron/index.html @@ -0,0 +1,44 @@ +--- +layout: examples +title: Jumbotron example +--- + +
    +
    +
    + + Bootstrap + Jumbotron example + +
    + +
    +
    +

    Custom jumbotron

    +

    Using a series of utilities, you can create this jumbotron, just like the one in previous versions of Bootstrap. Check out the examples below for how you can remix and restyle it to your liking.

    + +
    +
    + +
    +
    +
    +

    Change the background

    +

    Swap the background-color utility and add a `.text-*` color utility to mix up the jumbotron look. Then, mix and match with additional component themes and more.

    + +
    +
    +
    +
    +

    Add borders

    +

    Or, keep it light and add a border for some added definition to the boundaries of your content. Be sure to look under the hood at the source HTML here as we've adjusted the alignment and sizing of both column's content for equal-height.

    + +
    +
    +
    + +
    + © {{< year >}} +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotrons/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotrons/index.html new file mode 100644 index 000000000..efb12bb6b --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotrons/index.html @@ -0,0 +1,82 @@ +--- +layout: examples +title: Jumbotrons +extra_css: + - "jumbotrons.css" +body_class: "" +--- + + + + Bootstrap + + + + + + + + + + + +
    +
    + +

    Jumbotron with icon

    +

    + This is a custom jumbotron featuring an SVG image at the top, some longer text that wraps early thanks to a responsive .col-* class, and a customized call to action. +

    +
    + + +
    +
    +
    + +
    + +
    +
    + + +

    Placeholder jumbotron

    +

    + This faded back jumbotron is useful for placeholder content. It's also a great way to add a bit of context to a page or section when no content is available and to encourage visitors to take a specific action. +

    + +
    +
    + +
    + +
    +
    +
    +

    Full-width jumbotron

    +

    + This takes the basic jumbotron above and makes its background edge-to-edge with a .container inside to align content. Similar to above, it's been recreated with built-in grid and utility classes. +

    +
    +
    +
    + +
    + +
    +
    +

    Basic jumbotron

    +

    + This is a simple Bootstrap jumbotron that sits within a .container, recreated with built-in utility classes. +

    +
    +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotrons/jumbotrons.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotrons/jumbotrons.css new file mode 100644 index 000000000..d7d065ed6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/jumbotrons/jumbotrons.css @@ -0,0 +1 @@ +.border-dashed { --bs-border-style: dashed; } diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/list-groups/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/list-groups/index.html new file mode 100644 index 000000000..9411442da --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/list-groups/index.html @@ -0,0 +1,225 @@ +--- +layout: examples +title: List groups +extra_css: + - "list-groups.css" +body_class: "" +--- + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + +
    + +
    + + + +
    +
    + +
    + +
    +
    + + + + +
    +
    + +
    + +
    +
    + + + + + + + + + + + +
    +
    + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/list-groups/list-groups.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/list-groups/list-groups.css new file mode 100644 index 000000000..b90cfa065 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/list-groups/list-groups.css @@ -0,0 +1,63 @@ +.list-group { + width: 100%; + max-width: 460px; + margin-inline: 1.5rem; +} + +.form-check-input:checked + .form-checked-content { + opacity: .5; +} + +.form-check-input-placeholder { + border-style: dashed; +} +[contenteditable]:focus { + outline: 0; +} + +.list-group-checkable .list-group-item { + cursor: pointer; +} +.list-group-item-check { + position: absolute; + clip: rect(0, 0, 0, 0); +} +.list-group-item-check:hover + .list-group-item { + background-color: var(--bs-secondary-bg); +} +.list-group-item-check:checked + .list-group-item { + color: #fff; + background-color: var(--bs-primary); + border-color: var(--bs-primary); +} +.list-group-item-check[disabled] + .list-group-item, +.list-group-item-check:disabled + .list-group-item { + pointer-events: none; + filter: none; + opacity: .5; +} + +.list-group-radio .list-group-item { + cursor: pointer; + border-radius: .5rem; +} +.list-group-radio .form-check-input { + z-index: 2; + margin-top: -.5em; +} +.list-group-radio .list-group-item:hover, +.list-group-radio .list-group-item:focus { + background-color: var(--bs-secondary-bg); +} + +.list-group-radio .form-check-input:checked + .list-group-item { + background-color: var(--bs-body); + border-color: var(--bs-primary); + box-shadow: 0 0 0 2px var(--bs-primary); +} +.list-group-radio .form-check-input[disabled] + .list-group-item, +.list-group-radio .form-check-input:disabled + .list-group-item { + pointer-events: none; + filter: none; + opacity: .5; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/masonry/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/masonry/index.html new file mode 100644 index 000000000..c554deb48 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/masonry/index.html @@ -0,0 +1,105 @@ +--- +layout: examples +title: Masonry example +extra_js: + - src: "https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js" + integrity: "sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D" + async: true +--- + +
    +

    Bootstrap and Masonry

    +

    Integrate Masonry with the Bootstrap grid system and cards component.

    + +

    Masonry is not included in Bootstrap. Add it by including the JavaScript plugin manually, or using a CDN like so:

    + +
    
    +<script src="https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js" integrity="sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D" crossorigin="anonymous" async></script>
    +  
    + +

    By adding data-masonry='{"percentPosition": true }' to the .row wrapper, we can combine the powers of Bootstrap's responsive grid and Masonry's positioning.

    + +
    + +
    +
    +
    + {{< placeholder width="100%" height="200" class="card-img-top" text="Image cap" >}} +
    +
    Card title that wraps to a new line
    +

    This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.

    +
    +
    +
    +
    +
    +
    +
    +

    A well-known quote, contained in a blockquote element.

    +
    + +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="200" class="card-img-top" text="Image cap" >}} +
    +
    Card title
    +

    This card has supporting text below as a natural lead-in to additional content.

    +

    Last updated 3 mins ago

    +
    +
    +
    +
    +
    +
    +
    +

    A well-known quote, contained in a blockquote element.

    +
    + +
    +
    +
    +
    +
    +
    +
    Card title
    +

    This card has a regular title and short paragraph of text below it.

    +

    Last updated 3 mins ago

    +
    +
    +
    +
    +
    + {{< placeholder width="100%" height="260" class="card-img" text="Card image" >}} +
    +
    +
    +
    +
    +
    +

    A well-known quote, contained in a blockquote element.

    +
    + +
    +
    +
    +
    +
    +
    +
    Card title
    +

    This is another card with title and supporting text below. This card has some additional content to make it slightly taller overall.

    +

    Last updated 3 mins ago

    +
    +
    +
    +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/modals/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/modals/index.html new file mode 100644 index 000000000..c2c21c8fe --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/modals/index.html @@ -0,0 +1,150 @@ +--- +layout: examples +title: Modals +extra_css: + - "modals.css" +body_class: "" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/modals/modals.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/modals/modals.css new file mode 100644 index 000000000..924952ae3 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/modals/modals.css @@ -0,0 +1,8 @@ +.modal-sheet .modal-dialog { + width: 380px; + transition: bottom .75s ease-in-out; +} +.modal-sheet .modal-footer { + padding-bottom: 2rem; +} + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-bottom/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-bottom/index.html new file mode 100644 index 000000000..123cd0bf3 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-bottom/index.html @@ -0,0 +1,41 @@ +--- +layout: examples +title: Bottom navbar example +--- + +
    +
    +

    Bottom Navbar example

    +

    This example is a quick exercise to illustrate how the bottom navbar works.

    + }}" role="button">View navbar docs » +
    +
    + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-fixed/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-fixed/index.html new file mode 100644 index 000000000..b8dd5dac4 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-fixed/index.html @@ -0,0 +1,40 @@ +--- +layout: examples +title: Fixed top navbar example +extra_css: + - "navbar-fixed.css" +--- + + + +
    +
    +

    Navbar example

    +

    This example is a quick exercise to illustrate how fixed to top navbar works. As you scroll, it will remain fixed to the top of your browser’s viewport.

    + }}" role="button">View navbar docs » +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/navbar-fixed/navbar-top-fixed.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-fixed/navbar-fixed.css similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/navbar-fixed/navbar-top-fixed.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-fixed/navbar-fixed.css diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-static/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-static/index.html new file mode 100644 index 000000000..5624404d6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-static/index.html @@ -0,0 +1,40 @@ +--- +layout: examples +title: Top navbar example +extra_css: + - "navbar-static.css" +--- + + + +
    +
    +

    Navbar example

    +

    This example is a quick exercise to illustrate how the top-aligned navbar works. As you scroll, this navbar remains in its original position and moves with the rest of the page.

    + }}" role="button">View navbar docs » +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/navbar-static/navbar-top.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-static/navbar-static.css similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/navbar-static/navbar-top.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbar-static/navbar-static.css diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars-offcanvas/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars-offcanvas/index.html new file mode 100644 index 000000000..858998fb6 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars-offcanvas/index.html @@ -0,0 +1,147 @@ +--- +layout: examples +title: Navbar Template +extra_css: + - "navbars-offcanvas.css" +--- + +
    + + + + + + +
    +
    +
    +

    Navbar with offcanvas examples

    +

    This example shows how responsive offcanvas menus work within the navbar. For positioning of navbars, checkout the }}">top and }}">fixed top examples.

    +

    From the top down, you'll see a dark navbar, light navbar and a responsive navbar—each with offcanvases built in. Resize your browser window to the large breakpoint to see the toggle for the offcanvas.

    +

    + }}" role="button">Learn more about offcanvas navbars » +

    +
    +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/navbars/navbar.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars-offcanvas/navbars-offcanvas.css similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/navbars/navbar.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars-offcanvas/navbars-offcanvas.css diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars/index.html new file mode 100644 index 000000000..6ccfab850 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars/index.html @@ -0,0 +1,450 @@ +--- +layout: examples +title: Navbar Template +extra_css: + - "navbars.css" +--- + +
    + + + + + + + + + + + + + + + + + + +
    +

    Matching .container-xl...

    +
    + + + +
    + + + + + + +
    +
    +
    +

    Navbar examples

    +

    This example is a quick exercise to illustrate how the navbar and its contents work. Some navbars extend the width of the viewport, others are confined within a .container. For positioning of navbars, checkout the }}">top and }}">fixed top examples.

    +

    At the smallest breakpoint, the collapse plugin is used to hide the links and show a menu button to toggle the collapsed content.

    +

    + }}" role="button">View navbar docs » +

    +
    +
    +
    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars/navbars.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars/navbars.css new file mode 100644 index 000000000..70d209409 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/navbars/navbars.css @@ -0,0 +1,7 @@ +body { + padding-bottom: 20px; +} + +.navbar { + margin-bottom: 20px; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/index.html new file mode 100644 index 000000000..f72583f9b --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/index.html @@ -0,0 +1,140 @@ +--- +layout: examples +title: Offcanvas navbar template +extra_css: + - "offcanvas-navbar.css" +extra_js: + - src: "offcanvas-navbar.js" +body_class: "bg-body-tertiary" +aliases: "/docs/5.3/examples/offcanvas/" +--- + + + + + +
    +
    + +
    +

    Bootstrap

    + Since 2011 +
    +
    + +
    +
    Recent updates
    +
    + {{< placeholder width="32" height="32" background="#007bff" color="#007bff" class="flex-shrink-0 me-2 rounded" >}} +

    + @username + Some representative placeholder content, with some information about this user. Imagine this being some sort of status update, perhaps? +

    +
    +
    + {{< placeholder width="32" height="32" background="#e83e8c" color="#e83e8c" class="flex-shrink-0 me-2 rounded" >}} +

    + @username + Some more representative placeholder content, related to this other user. Another status update, perhaps. +

    +
    +
    + {{< placeholder width="32" height="32" background="#6f42c1" color="#6f42c1" class="flex-shrink-0 me-2 rounded" >}} +

    + @username + This user also gets some representative placeholder content. Maybe they did something interesting, and you really want to highlight this in the recent updates. +

    +
    + + All updates + +
    + +
    +
    Suggestions
    +
    + {{< placeholder width="32" height="32" background="#007bff" color="#007bff" class="flex-shrink-0 me-2 rounded" >}} +
    +
    + Full Name + Follow +
    + @username +
    +
    +
    + {{< placeholder width="32" height="32" background="#007bff" color="#007bff" class="flex-shrink-0 me-2 rounded" >}} +
    +
    + Full Name + Follow +
    + @username +
    +
    +
    + {{< placeholder width="32" height="32" background="#007bff" color="#007bff" class="flex-shrink-0 me-2 rounded" >}} +
    +
    + Full Name + Follow +
    + @username +
    +
    + + All suggestions + +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/offcanvas-navbar.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/offcanvas-navbar.css new file mode 100644 index 000000000..f855b96a5 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/offcanvas-navbar.css @@ -0,0 +1,52 @@ +html, +body { + overflow-x: hidden; /* Prevent scroll on narrow devices */ +} + +body { + padding-top: 56px; +} + +@media (max-width: 991.98px) { + .offcanvas-collapse { + position: fixed; + top: 56px; /* Height of navbar */ + bottom: 0; + left: 100%; + width: 100%; + padding-right: 1rem; + padding-left: 1rem; + overflow-y: auto; + visibility: hidden; + background-color: #343a40; + transition: transform .3s ease-in-out, visibility .3s ease-in-out; + } + .offcanvas-collapse.open { + visibility: visible; + transform: translateX(-100%); + } +} + +.nav-scroller .nav { + color: rgba(255, 255, 255, .75); +} + +.nav-scroller .nav-link { + padding-top: .75rem; + padding-bottom: .75rem; + font-size: .875rem; + color: #6c757d; +} + +.nav-scroller .nav-link:hover { + color: #007bff; +} + +.nav-scroller .active { + font-weight: 500; + color: #343a40; +} + +.bg-purple { + background-color: #6f42c1; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/offcanvas-navbar.js b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/offcanvas-navbar.js new file mode 100644 index 000000000..b97a17164 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/offcanvas-navbar/offcanvas-navbar.js @@ -0,0 +1,7 @@ +(() => { + 'use strict' + + document.querySelector('#navbarSideCollapse').addEventListener('click', () => { + document.querySelector('.offcanvas-collapse').classList.toggle('open') + }) +})() diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/pricing/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/pricing/index.html new file mode 100644 index 000000000..2f375b36d --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/pricing/index.html @@ -0,0 +1,186 @@ +--- +layout: examples +title: Pricing example +extra_css: + - "pricing.css" +--- + + + + Check + + + + +
    +
    + + +
    +

    Pricing

    +

    Quickly build an effective pricing table for your potential customers with this Bootstrap example. It’s built with default Bootstrap components and utilities with little customization.

    +
    +
    + +
    +
    +
    +
    +
    +

    Free

    +
    +
    +

    $0/mo

    +
      +
    • 10 users included
    • +
    • 2 GB of storage
    • +
    • Email support
    • +
    • Help center access
    • +
    + +
    +
    +
    +
    +
    +
    +

    Pro

    +
    +
    +

    $15/mo

    +
      +
    • 20 users included
    • +
    • 10 GB of storage
    • +
    • Priority email support
    • +
    • Help center access
    • +
    + +
    +
    +
    +
    +
    +
    +

    Enterprise

    +
    +
    +

    $29/mo

    +
      +
    • 30 users included
    • +
    • 15 GB of storage
    • +
    • Phone and email support
    • +
    • Help center access
    • +
    + +
    +
    +
    +
    + +

    Compare plans

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FreeProEnterprise
    Public
    Private
    Permissions
    Sharing
    Unlimited members
    Extra security
    +
    +
    + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/pricing/pricing.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/pricing/pricing.css new file mode 100644 index 000000000..c65d0208f --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/pricing/pricing.css @@ -0,0 +1,11 @@ +body { + background-image: linear-gradient(180deg, var(--bs-secondary-bg), var(--bs-body-bg) 100px, var(--bs-body-bg)); +} + +.container { + max-width: 960px; +} + +.pricing-header { + max-width: 700px; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/product/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/product/index.html new file mode 100644 index 000000000..0b245bd96 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/product/index.html @@ -0,0 +1,189 @@ +--- +layout: examples +title: Product example +extra_css: + - "product.css" +--- + + + + + + + + + + + + + + + + +
    +
    +
    +

    Designed for engineers

    +

    Build anything you want with Aperture

    + +
    +
    +
    +
    + +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    + +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    + +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    + +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    +
    +

    Another headline

    +

    And an even wittier subheading.

    +
    +
    +
    +
    +
    + + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/product/product.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/product/product.css similarity index 95% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/product/product.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/product/product.css index 5fcb582b4..6c90ae51e 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/product/product.css +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/product/product.css @@ -2,6 +2,11 @@ max-width: 960px; } +.icon-link > .bi { + width: .75em; + height: .75em; +} + /* * Custom translucent site header */ diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/index.html new file mode 100644 index 000000000..02a9456cc --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/index.html @@ -0,0 +1,356 @@ +--- +layout: examples +title: Sidebars +extra_css: + - "sidebars.css" +extra_js: + - src: "sidebars.js" +body_class: "" +--- + + + + Bootstrap + + + + + + + + + + + + + + + + + + + + + +
    +

    Sidebars examples

    + + + +
    + + + +
    + +
    + + + Icon-only + + + +
    + +
    + +
    + + + Collapsible + + +
    + +
    + + + +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/sidebars.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/sidebars.css new file mode 100644 index 000000000..f6a8f1c53 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/sidebars.css @@ -0,0 +1,63 @@ +body { + min-height: 100vh; + min-height: -webkit-fill-available; +} + +html { + height: -webkit-fill-available; +} + +main { + height: 100vh; + height: -webkit-fill-available; + max-height: 100vh; + overflow-x: auto; + overflow-y: hidden; +} + +.dropdown-toggle { outline: 0; } + +.btn-toggle { + padding: .25rem .5rem; + font-weight: 600; + color: var(--bs-emphasis-color); + background-color: transparent; +} +.btn-toggle:hover, +.btn-toggle:focus { + color: rgba(var(--bs-emphasis-color-rgb), .85); + background-color: var(--bs-tertiary-bg); +} + +.btn-toggle::before { + width: 1.25em; + line-height: 0; + content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e"); + transition: transform .35s ease; + transform-origin: .5em 50%; +} + +[data-bs-theme="dark"] .btn-toggle::before { + content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255,255,255,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e"); +} + +.btn-toggle[aria-expanded="true"] { + color: rgba(var(--bs-emphasis-color-rgb), .85); +} +.btn-toggle[aria-expanded="true"]::before { + transform: rotate(90deg); +} + +.btn-toggle-nav a { + padding: .1875rem .5rem; + margin-top: .125rem; + margin-left: 1.25rem; +} +.btn-toggle-nav a:hover, +.btn-toggle-nav a:focus { + background-color: var(--bs-tertiary-bg); +} + +.scrollarea { + overflow-y: auto; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/sidebars.js b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/sidebars.js new file mode 100644 index 000000000..4075f1f15 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sidebars/sidebars.js @@ -0,0 +1,8 @@ +/* global bootstrap: false */ +(() => { + 'use strict' + const tooltipTriggerList = Array.from(document.querySelectorAll('[data-bs-toggle="tooltip"]')) + tooltipTriggerList.forEach(tooltipTriggerEl => { + new bootstrap.Tooltip(tooltipTriggerEl) + }) +})() diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sign-in/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sign-in/index.html new file mode 100644 index 000000000..8420c4527 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sign-in/index.html @@ -0,0 +1,32 @@ +--- +layout: examples +title: Signin Template +extra_css: + - "sign-in.css" +body_class: "d-flex align-items-center py-4 bg-body-tertiary" +--- + +
    +
    + +

    Please sign in

    + +
    + + +
    +
    + + +
    + +
    + + +
    + +

    © 2017–{{< year >}}

    +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sign-in/sign-in.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sign-in/sign-in.css new file mode 100644 index 000000000..641f6d906 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sign-in/sign-in.css @@ -0,0 +1,25 @@ +html, +body { + height: 100%; +} + +.form-signin { + max-width: 330px; + padding: 1rem; +} + +.form-signin .form-floating:focus-within { + z-index: 2; +} + +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/starter-template/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/starter-template/index.html new file mode 100644 index 000000000..ec8e57df7 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/starter-template/index.html @@ -0,0 +1,107 @@ +--- +layout: examples +title: Starter Template +--- + + + + + + + Bootstrap + + + + +
    +
    + + + Starter template + +
    + +
    +

    Get started with Bootstrap

    +

    Quickly and easily get started with Bootstrap's compiled, production-ready files with this barebones example featuring some basic HTML and helpful links. Download all our examples to get started.

    + + + +
    + +
    +
    +

    Starter projects

    +

    Ready to go beyond the starter template? Check out these open source projects that you can quickly duplicate to a new GitHub repository.

    + +
    + +
    +

    Guides

    +

    Read more detailed instructions and documentation on using or contributing to Bootstrap.

    + +
    +
    +
    +
    + Created by the Bootstrap team · © {{< year >}} +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer-navbar/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer-navbar/index.html new file mode 100644 index 000000000..36bbff50e --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer-navbar/index.html @@ -0,0 +1,52 @@ +--- +layout: examples +title: Sticky Footer Navbar Template +extra_css: + - "sticky-footer-navbar.css" +html_class: "h-100" +body_class: "d-flex flex-column h-100" +--- + +
    + + +
    + + +
    +
    +

    Sticky footer with fixed navbar

    +

    Pin a footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS. A fixed navbar has been added with padding-top: 60px; on the main > .container.

    +

    Back to }}">the default sticky footer minus the navbar.

    +
    +
    + +
    +
    + Place sticky footer content here. +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/sticky-footer-navbar/sticky-footer-navbar.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer-navbar/sticky-footer-navbar.css similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/sticky-footer-navbar/sticky-footer-navbar.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer-navbar/sticky-footer-navbar.css diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer/index.html new file mode 100644 index 000000000..631addabe --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer/index.html @@ -0,0 +1,23 @@ +--- +layout: examples +title: Sticky Footer Template +extra_css: + - "sticky-footer.css" +html_class: "h-100" +body_class: "d-flex flex-column h-100" +--- + + +
    +
    +

    Sticky footer

    +

    Pin a footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.

    +

    Use }}">the sticky footer with a fixed navbar if need be, too.

    +
    +
    + +
    +
    + Place sticky footer content here. +
    +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/sticky-footer/sticky-footer.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer/sticky-footer.css similarity index 100% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/examples/sticky-footer/sticky-footer.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/sticky-footer/sticky-footer.css diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.1/extend/approach.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/extend/approach.md similarity index 92% rename from app/vendor/twbs/bootstrap/site/content/docs/5.1/extend/approach.md rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/extend/approach.md index 033ab219f..392aef4d3 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.1/extend/approach.md +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/extend/approach.md @@ -4,12 +4,12 @@ title: Approach description: Learn about the guiding principles, strategies, and techniques used to build and maintain Bootstrap so you can more easily customize and extend it yourself. group: extend aliases: - - "/docs/5.1/extend/" + - "/docs/5.3/extend/" --- While the getting started pages provide an introductory tour of the project and what it offers, this document focuses on _why_ we do the things we do in Bootstrap. It explains our philosophy to building on the web so that others can learn from us, contribute with us, and help us improve. -See something that doesn't sound right, or perhaps could be done better? [Open an issue]({{< param repo >}}/issues/new)—we'd love to discuss it with you. +See something that doesn't sound right, or perhaps could be done better? [Open an issue]({{< param repo >}}/issues/new/choose)—we'd love to discuss it with you. ## Summary @@ -18,7 +18,7 @@ We'll dive into each of these more throughout, but at a high level, here's what - Components should be responsive and mobile-first - Components should be built with a base class and extended via modifier classes - Component states should obey a common z-index scale -- Whenever possible, prefer a HTML and CSS implementation over JavaScript +- Whenever possible, prefer an HTML and CSS implementation over JavaScript - Whenever possible, use utilities over custom styles - Whenever possible, avoid enforcing strict HTML requirements (children selectors) @@ -65,11 +65,11 @@ This principle is our first-class JavaScript API using `data` attributes. You do Lastly, our styles build on the fundamental behaviors of common web elements. Whenever possible, we prefer to use what the browser provides. For example, you can put a `.btn` class on nearly any element, but most elements don't provide any semantic value or browser functionality. So instead, we use ` + + +{{< /example >}} + +## File input + +{{< example >}} +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +{{< /example >}} + +## Color + +Set the `type="color"` and add `.form-control-color` to the ``. We use the modifier class to set fixed `height`s and override some inconsistencies between browsers. + +{{< example >}} + + +{{< /example >}} + +## Datalists + +Datalists allow you to create a group of `
    }}" class="btn btn-bd-primary" onclick="ga('send', 'event', 'Getting started', 'Download', 'Download Bootstrap');">Download + +## Source files + +Compile Bootstrap with your own asset pipeline by downloading our source Sass, JavaScript, and documentation files. This option requires some additional tooling: + +- [Sass compiler]({{< docsref "/getting-started/contribute#sass" >}}) for compiling Sass source files into CSS files +- [Autoprefixer](https://github.com/postcss/autoprefixer) for CSS vendor prefixing + +Should you require our full set of [build tools]({{< docsref "/getting-started/contribute#tooling-setup" >}}), they are included for developing Bootstrap and its docs, but they're likely unsuitable for your own purposes. + +}}" class="btn btn-bd-primary" onclick="ga('send', 'event', 'Getting started', 'Download', 'Download source');">Download source + +## Examples + +If you want to download and examine our [examples]({{< docsref "/examples" >}}), you can grab the already built examples: + +}}" class="btn btn-bd-primary" onclick="ga('send', 'event', 'Getting started', 'Download', 'Download Examples');">Download Examples + +## CDN via jsDelivr + +Skip the download with [jsDelivr](https://www.jsdelivr.com/) to deliver cached version of Bootstrap's compiled CSS and JS to your project. + +```html +}}" rel="stylesheet" integrity="{{< param "cdn.css_hash" >}}" crossorigin="anonymous"> + +``` + +If you're using our compiled JavaScript and prefer to include Popper separately, add Popper before our JS, via a CDN preferably. + +```html + + +``` + +### Alternative CDNs + +We recommend [jsDelivr](https://www.jsdelivr.com/) and use it ourselves in our documentation. However, in some cases—like in some specific countries or environments—you may need to use other CDN providers like [cdnjs](https://cdnjs.com/) or [unpkg](https://unpkg.com/). + +You'll find the same files on these CDN providers, albeit with different URLs. With cdnjs, you can [use this direct Bootstrap package link](https://cdnjs.com/libraries/bootstrap) to copy and paste ready-to-use HTML snippets for each dist file from any version of Bootstrap. + +{{< callout warning>}} +**If the SRI hashes differ for a given file, you shouldn't use the files from that CDN, because it means that the file was modified by someone else.** +{{< /callout >}} + +Note that you should compare same length hashes, e.g. `sha384` with `sha384`, otherwise it's expected for them to be different. +As such, you can use an online tool like [SRI Hash Generator](https://www.srihash.org/) to make sure that the hashes are the same for a given file. +Alternatively, assuming you have OpenSSL installed, you can achieve the same from the CLI, for example: + +```sh +openssl dgst -sha384 -binary bootstrap.min.js | openssl base64 -A +``` + +## Package managers + +Pull in Bootstrap's **source files** into nearly any project with some of the most popular package managers. No matter the package manager, Bootstrap will **require a [Sass compiler]({{< docsref "/getting-started/contribute#sass" >}}) and [Autoprefixer](https://github.com/postcss/autoprefixer)** for a setup that matches our official compiled versions. + +### npm + +Install Bootstrap in your Node.js powered apps with [the npm package](https://www.npmjs.com/package/bootstrap): + +```sh +npm install bootstrap@{{< param "current_version" >}} +``` + +`const bootstrap = require('bootstrap')` or `import bootstrap from 'bootstrap'` will load all of Bootstrap's plugins onto a `bootstrap` object. +The `bootstrap` module itself exports all of our plugins. You can manually load Bootstrap's plugins individually by loading the `/js/dist/*.js` files under the package's top-level directory. + +Bootstrap's `package.json` contains some additional metadata under the following keys: + +- `sass` - path to Bootstrap's main [Sass](https://sass-lang.com/) source file +- `style` - path to Bootstrap's non-minified CSS that's been compiled using the default settings (no customization) + +{{< callout info >}} +{{< partial "callouts/info-npm-starter.md" >}} +{{< /callout >}} + +### yarn + +Install Bootstrap in your Node.js powered apps with [the yarn package](https://yarnpkg.com/en/package/bootstrap): + +```sh +yarn add bootstrap@{{< param "current_version" >}} +``` + +### RubyGems + +Install Bootstrap in your Ruby apps using [Bundler](https://bundler.io/) (**recommended**) and [RubyGems](https://rubygems.org/) by adding the following line to your [`Gemfile`](https://bundler.io/gemfile.html): + +```ruby +gem 'bootstrap', '~> {{< param current_ruby_version >}}' +``` + +Alternatively, if you're not using Bundler, you can install the gem by running this command: + +```sh +gem install bootstrap -v {{< param current_ruby_version >}} +``` + +[See the gem's README](https://github.com/twbs/bootstrap-rubygem/blob/main/README.md) for further details. + +### Composer + +You can also install and manage Bootstrap's Sass and JavaScript using [Composer](https://getcomposer.org/): + +```sh +composer require twbs/bootstrap:{{< param current_version >}} +``` + +### NuGet + +If you develop in .NET Framework, you can also install and manage Bootstrap's [CSS](https://www.nuget.org/packages/bootstrap/) or [Sass](https://www.nuget.org/packages/bootstrap.sass/) and JavaScript using [NuGet](https://www.nuget.org/). Newer projects should use [libman](https://docs.microsoft.com/en-us/aspnet/core/client-side/libman/) or another method as NuGet is designed for compiled code, not frontend assets. + +```powershell +Install-Package bootstrap +``` + +```powershell +Install-Package bootstrap.sass +``` diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/getting-started/introduction.md b/app/vendor/twbs/bootstrap/site/content/docs/5.3/getting-started/introduction.md new file mode 100644 index 000000000..538d31924 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/getting-started/introduction.md @@ -0,0 +1,155 @@ +--- +layout: docs +title: Get started with Bootstrap +description: Bootstrap is a powerful, feature-packed frontend toolkit. Build anything—from prototype to production—in minutes. +group: getting-started +aliases: + - "/docs/5.3/getting-started/" + - "/docs/getting-started/" + - "/getting-started/" +toc: true +--- + +## Quick start + +Get started by including Bootstrap's production-ready CSS and JavaScript via CDN without the need for any build steps. See it in practice with this [Bootstrap CodePen demo](https://codepen.io/team/bootstrap/pen/qBamdLj). + +
    + +1. **Create a new `index.html` file in your project root.** Include the `` tag as well for [proper responsive behavior](https://developer.mozilla.org/en-US/docs/Web/HTML/Viewport_meta_tag) in mobile devices. + + ```html + + + + + + Bootstrap demo + + +

    Hello, world!

    + + + ``` + +2. **Include Bootstrap's CSS and JS.** Place the `` tag in the `` for our CSS, and the ` + + + ``` + + You can also include [Popper](https://popper.js.org/) and our JS separately. If you don't plan to use dropdowns, popovers, or tooltips, save some kilobytes by not including Popper. + + ```html + + + ``` + +3. **Hello, world!** Open the page in your browser of choice to see your Bootstrapped page. Now you can start building with Bootstrap by creating your own [layout]({{< docsref "/layout/grid" >}}), adding dozens of [components]({{< docsref "/components/buttons" >}}), and utilizing [our official examples]({{< docsref "/examples" >}}). + +## CDN links + +As reference, here are our primary CDN links. + +{{< bs-table >}} +| Description | URL | +| --- | --- | +| CSS | `{{< param "cdn.css" >}}` | +| JS | `{{< param "cdn.js_bundle" >}}` | +{{< /bs-table >}} + +You can also use the CDN to fetch any of our [additional builds listed in the Contents page]({{< docsref "/getting-started/contents" >}}). + +## Next steps + +- Read a bit more about some [important global environment settings](#important-globals) that Bootstrap utilizes. +- Read about what's included in Bootstrap in our [contents section]({{< docsref "/getting-started/contents/" >}}) and the list of [components that require JavaScript](#js-components) below. +- Need a little more power? Consider building with Bootstrap by [including the source files via package manager]({{< docsref "/getting-started/download#package-managers" >}}). +- Looking to use Bootstrap as a module with ` +``` + +Compared to JS bundlers, using ESM in the browser requires you to use the full path and filename instead of the module name. [Read more about JS modules in the browser.](https://v8.dev/features/modules#specifiers) That's why we use `'bootstrap.esm.min.js'` instead of `'bootstrap'` above. However, this is further complicated by our Popper dependency, which imports Popper into our JavaScript like so: + + +```js +import * as Popper from "@popperjs/core" +``` + +If you try this as-is, you'll see an error in the console like the following: + +```text +Uncaught TypeError: Failed to resolve module specifier "@popperjs/core". Relative references must start with either "/", "./", or "../". +``` + +To fix this, you can use an `importmap` to resolve the arbitrary module names to complete paths. If your [targeted browsers](https://caniuse.com/?search=importmap) do not support `importmap`, you'll need to use the [es-module-shims](https://github.com/guybedford/es-module-shims) project. Here's how it works for Bootstrap and Popper: + + +```html + + + + + + }}" rel="stylesheet" integrity="{{< param "cdn.css_hash" >}}" crossorigin="anonymous"> + Hello, modularity! + + +

    Hello, modularity!

    + + + + + + + +``` + +## Dependencies + +Some plugins and CSS components depend on other plugins. If you include plugins individually, make sure to check for these dependencies in the docs. + +Our dropdowns, popovers, and tooltips also depend on [Popper](https://popper.js.org/). + +## Data attributes + +Nearly all Bootstrap plugins can be enabled and configured through HTML alone with data attributes (our preferred way of using JavaScript functionality). Be sure to **only use one set of data attributes on a single element** (e.g., you cannot trigger a tooltip and modal from the same button.) + +{{< markdown >}} +{{< partial "js-data-attributes.md" >}} +{{< /markdown >}} + +## Selectors + +We use the native `querySelector` and `querySelectorAll` methods to query DOM elements for performance reasons, so you must use [valid selectors](https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier). If you use special selectors like `collapse:Example`, be sure to escape them. + +## Events + +Bootstrap provides custom events for most plugins' unique actions. Generally, these come in an infinitive and past participle form - where the infinitive (ex. `show`) is triggered at the start of an event, and its past participle form (ex. `shown`) is triggered on the completion of an action. + +All infinitive events provide [`preventDefault()`](https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) functionality. This provides the ability to stop the execution of an action before it starts. Returning false from an event handler will also automatically call `preventDefault()`. + +```js +const myModal = document.querySelector('#myModal') + +myModal.addEventListener('show.bs.modal', event => { + return event.preventDefault() // stops modal from being shown +}) +``` + +## Programmatic API + +All constructors accept an optional options object or nothing (which initiates a plugin with its default behavior): + +```js +const myModalEl = document.querySelector('#myModal') +const modal = new bootstrap.Modal(myModalEl) // initialized with defaults + +const configObject = { keyboard: false } +const modal1 = new bootstrap.Modal(myModalEl, configObject) // initialized with no keyboard +``` + +If you'd like to get a particular plugin instance, each plugin exposes a `getInstance` method. For example, to retrieve an instance directly from an element: + +```js +bootstrap.Popover.getInstance(myPopoverEl) +``` + +This method will return `null` if an instance is not initiated over the requested element. + +Alternatively, `getOrCreateInstance` can be used to get the instance associated with a DOM element, or create a new one in case it wasn't initialized. + +```js +bootstrap.Popover.getOrCreateInstance(myPopoverEl, configObject) +``` + +In case an instance wasn't initialized, it may accept and use an optional configuration object as second argument. + +### CSS selectors in constructors + +In addition to the `getInstance` and `getOrCreateInstance` methods, all plugin constructors can accept a DOM element or a valid [CSS selector](#selectors) as the first argument. Plugin elements are found with the `querySelector` method since our plugins only support a single element. + +```js +const modal = new bootstrap.Modal('#myModal') +const dropdown = new bootstrap.Dropdown('[data-bs-toggle="dropdown"]') +const offcanvas = bootstrap.Offcanvas.getInstance('#myOffcanvas') +const alert = bootstrap.Alert.getOrCreateInstance('#myAlert') +``` + +### Asynchronous functions and transitions + +All programmatic API methods are **asynchronous** and return to the caller once the transition is started, but **before it ends**. In order to execute an action once the transition is complete, you can listen to the corresponding event. + +```js +const myCollapseEl = document.querySelector('#myCollapse') + +myCollapseEl.addEventListener('shown.bs.collapse', event => { + // Action to execute once the collapsible area is expanded +}) +``` + +In addition, a method call on a **transitioning component will be ignored**. + +```js +const myCarouselEl = document.querySelector('#myCarousel') +const carousel = bootstrap.Carousel.getInstance(myCarouselEl) // Retrieve a Carousel instance + +myCarouselEl.addEventListener('slid.bs.carousel', event => { + carousel.to('2') // Will slide to the slide 2 as soon as the transition to slide 1 is finished +}) + +carousel.to('1') // Will start sliding to the slide 1 and returns to the caller +carousel.to('2') // !! Will be ignored, as the transition to the slide 1 is not finished !! +``` + +#### `dispose` method + +While it may seem correct to use the `dispose` method immediately after `hide()`, it will lead to incorrect results. Here's an example of the problem use: + +```js +const myModal = document.querySelector('#myModal') +myModal.hide() // it is asynchronous + +myModal.addEventListener('shown.bs.hidden', event => { + myModal.dispose() +}) +``` + +### Default settings + +You can change the default settings for a plugin by modifying the plugin's `Constructor.Default` object: + +```js +// changes default for the modal plugin's `keyboard` option to false +bootstrap.Modal.Default.keyboard = false +``` + +## Methods and properties + +Every Bootstrap plugin exposes the following methods and static properties. + +{{< bs-table "table" >}} +| Method | Description | +| --- | --- | +| `dispose` | Destroys an element's modal. (Removes stored data on the DOM element) | +| `getInstance` | *Static* method which allows you to get the modal instance associated with a DOM element. | +| `getOrCreateInstance` | *Static* method which allows you to get the modal instance associated with a DOM element, or create a new one in case it wasn't initialized. | +{{< /bs-table >}} + +{{< bs-table "table" >}} +| Static property | Description | +| --- | --- | +| `NAME` | Returns the plugin name. (Example: `bootstrap.Tooltip.NAME`) | +| `VERSION` | The version of each of Bootstrap's plugins can be accessed via the `VERSION` property of the plugin's constructor (Example: `bootstrap.Tooltip.VERSION`) | +{{< /bs-table >}} + +## Sanitizer + +Tooltips and Popovers use our built-in sanitizer to sanitize options which accept HTML. + +The default `allowList` value is the following: + +{{< js-docs name="allow-list" file="js/src/util/sanitizer.js" >}} + +If you want to add new values to this default `allowList` you can do the following: + +```js +const myDefaultAllowList = bootstrap.Tooltip.Default.allowList + +// To allow table elements +myDefaultAllowList.table = [] + +// To allow td elements and data-bs-option attributes on td elements +myDefaultAllowList.td = ['data-bs-option'] + +// You can push your custom regex to validate your attributes. +// Be careful about your regular expressions being too lax +const myCustomRegex = /^data-my-app-[\w-]+/ +myDefaultAllowList['*'].push(myCustomRegex) +``` + +If you want to bypass our sanitizer because you prefer to use a dedicated library, for example [DOMPurify](https://www.npmjs.com/package/dompurify), you should do the following: + +```js +const yourTooltipEl = document.querySelector('#yourTooltip') +const tooltip = new bootstrap.Tooltip(yourTooltipEl, { + sanitizeFn(content) { + return DOMPurify.sanitize(content) + } +}) +``` + +## Optionally using jQuery + +**You don't need jQuery in Bootstrap 5**, but it's still possible to use our components with jQuery. If Bootstrap detects `jQuery` in the `window` object, it'll add all of our components in jQuery's plugin system. This allows you to do the following: + +```js +// to enable tooltips with the default configuration +$('[data-bs-toggle="tooltip"]').tooltip() + +// to initialize tooltips with given configuration +$('[data-bs-toggle="tooltip"]').tooltip({ + boundary: 'clippingParents', + customClass: 'myClass' +}) + +// to trigger the `show` method +$('#myTooltip').tooltip('show') +``` + +The same goes for our other components. + +### No conflict + +Sometimes it is necessary to use Bootstrap plugins with other UI frameworks. In these circumstances, namespace collisions can occasionally occur. If this happens, you may call `.noConflict` on the plugin you wish to revert the value of. + +```js +const bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value +$.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Bootstrap functionality +``` + +Bootstrap does not officially support third-party JavaScript libraries like Prototype or jQuery UI. Despite `.noConflict` and namespaced events, there may be compatibility problems that you need to fix on your own. + +### jQuery events + +Bootstrap will detect jQuery if `jQuery` is present in the `window` object and there is no `data-bs-no-jquery` attribute set on ``. If jQuery is found, Bootstrap will emit events thanks to jQuery's event system. So if you want to listen to Bootstrap's events, you'll have to use the jQuery methods (`.on`, `.one`) instead of `addEventListener`. + +```js +$('#myTab a').on('shown.bs.tab', () => { + // do something... +}) +``` + +## Disabled JavaScript + +Bootstrap's plugins have no special fallback when JavaScript is disabled. If you care about the user experience in this case, use [`