diff --git a/.gitignore b/.gitignore
index 7051943..e0f4ccf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,8 @@
/var/
/vendor/
###< symfony/framework-bundle ###va
+
+###> symfony/asset-mapper ###
+/public/assets/
+/assets/vendor/
+###< symfony/asset-mapper ###
diff --git a/assets/app.js b/assets/app.js
new file mode 100644
index 0000000..6174cc6
--- /dev/null
+++ b/assets/app.js
@@ -0,0 +1,9 @@
+/*
+ * Welcome to your app's main JavaScript file!
+ *
+ * This file will be included onto the page via the importmap() Twig function,
+ * which should already be in your base.html.twig.
+ */
+import './styles/app.css';
+
+console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');
diff --git a/assets/icons/fluent/alert-12-regular.svg b/assets/icons/fluent/alert-12-regular.svg
new file mode 100644
index 0000000..474badc
--- /dev/null
+++ b/assets/icons/fluent/alert-12-regular.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/symfony.svg b/assets/icons/symfony.svg
new file mode 100644
index 0000000..93fb329
--- /dev/null
+++ b/assets/icons/symfony.svg
@@ -0,0 +1 @@
+
diff --git a/assets/styles/app.css b/assets/styles/app.css
new file mode 100644
index 0000000..cd77417
--- /dev/null
+++ b/assets/styles/app.css
@@ -0,0 +1,13 @@
+@tailwind theme;
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ h1 {
+ font-size: var(--text-2xl);
+ }
+ h2 {
+ font-size: var(--text-xl);
+ }
+}
diff --git a/composer.json b/composer.json
index e13b15e..08d0998 100644
--- a/composer.json
+++ b/composer.json
@@ -7,13 +7,17 @@
"php": ">=8.2",
"ext-ctype": "*",
"ext-iconv": "*",
+ "symfony/asset": "7.2.*",
"symfony/console": "7.2.*",
"symfony/dotenv": "7.2.*",
"symfony/flex": "^2",
"symfony/framework-bundle": "7.2.*",
"symfony/runtime": "7.2.*",
"symfony/twig-bundle": "7.2.*",
+ "symfony/ux-icons": "^2.24",
+ "symfony/ux-twig-component": "^2.24",
"symfony/yaml": "7.2.*",
+ "symfonycasts/tailwind-bundle": "^0.10.0",
"twig/extra-bundle": "^2.12|^3.0",
"twig/twig": "^2.12|^3.0"
},
@@ -49,7 +53,8 @@
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
- "assets:install %PUBLIC_DIR%": "symfony-cmd"
+ "assets:install %PUBLIC_DIR%": "symfony-cmd",
+ "importmap:install": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
diff --git a/composer.lock b/composer.lock
index b5ab24b..f43fb71 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,89 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "24fd9597dbeb0ee0b04bb7f0e06c022c",
+ "content-hash": "6d7d92db308b6f06403a19d3243f05ae",
"packages": [
+ {
+ "name": "composer/semver",
+ "version": "3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.3"
+ },
+ "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": "2024-09-19T14:15:21+00:00"
+ },
{
"name": "psr/cache",
"version": "3.0.0",
@@ -208,6 +289,154 @@
},
"time": "2024-09-11T13:17:53+00:00"
},
+ {
+ "name": "symfony/asset",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/asset.git",
+ "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/asset/zipball/cb926cd59fefa1f9b4900b3695f0f846797ba5c0",
+ "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<6.4"
+ },
+ "require-dev": {
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Asset\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/asset/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-25T15:15:23+00:00"
+ },
+ {
+ "name": "symfony/asset-mapper",
+ "version": "v7.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/asset-mapper.git",
+ "reference": "6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8",
+ "reference": "6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.0",
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/filesystem": "^7.1",
+ "symfony/http-client": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/framework-bundle": "<6.4"
+ },
+ "require-dev": {
+ "symfony/asset": "^6.4|^7.0",
+ "symfony/browser-kit": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/event-dispatcher-contracts": "^3.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/web-link": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\AssetMapper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/asset-mapper/tree/v7.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-26T11:29:07+00:00"
+ },
{
"name": "symfony/cache",
"version": "v7.2.5",
@@ -1350,6 +1579,179 @@
],
"time": "2025-03-24T12:37:32+00:00"
},
+ {
+ "name": "symfony/http-client",
+ "version": "v7.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6",
+ "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-client-contracts": "~3.4.4|^3.5.2",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "amphp/amp": "<2.5",
+ "php-http/discovery": "<1.15",
+ "symfony/http-foundation": "<6.4"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "1.0",
+ "symfony/http-client-implementation": "3.0"
+ },
+ "require-dev": {
+ "amphp/http-client": "^4.2.1|^5.0",
+ "amphp/http-tunnel": "^1.0|^2.0",
+ "amphp/socket": "^1.1",
+ "guzzlehttp/promises": "^1.4|^2.0",
+ "nyholm/psr7": "^1.0",
+ "php-http/httplug": "^1.0|^2.0",
+ "psr/http-client": "^1.0",
+ "symfony/amphp-http-client-meta": "^1.0|^2.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/rate-limiter": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "http"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client/tree/v7.2.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-02-13T10:27:23+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v3.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645",
+ "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:49:48+00:00"
+ },
{
"name": "symfony/http-foundation",
"version": "v7.2.5",
@@ -1857,6 +2259,228 @@
],
"time": "2024-09-09T11:45:10+00:00"
},
+ {
+ "name": "symfony/process",
+ "version": "v7.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "87b7c93e57df9d8e39a093d32587702380ff045d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d",
+ "reference": "87b7c93e57df9d8e39a093d32587702380ff045d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v7.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-13T12:21:46+00:00"
+ },
+ {
+ "name": "symfony/property-access",
+ "version": "v7.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-access.git",
+ "reference": "b28732e315d81fbec787f838034de7d6c9b2b902"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902",
+ "reference": "b28732e315d81fbec787f838034de7d6c9b2b902",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/property-info": "^6.4|^7.0"
+ },
+ "require-dev": {
+ "symfony/cache": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyAccess\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides functions to read and write from/to an object or array using a simple string notation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "access",
+ "array",
+ "extraction",
+ "index",
+ "injection",
+ "object",
+ "property",
+ "property-path",
+ "reflection"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/property-access/tree/v7.2.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": "2025-01-17T10:56:55+00:00"
+ },
+ {
+ "name": "symfony/property-info",
+ "version": "v7.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-info.git",
+ "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/f00fd9685ecdbabe82ca25c7b739ce7bba99302c",
+ "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/string": "^6.4|^7.0",
+ "symfony/type-info": "~7.1.9|^7.2.2"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<5.2",
+ "phpdocumentor/type-resolver": "<1.5.1",
+ "symfony/cache": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/serializer": "<6.4"
+ },
+ "require-dev": {
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "phpstan/phpdoc-parser": "^1.0|^2.0",
+ "symfony/cache": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyInfo\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "doctrine",
+ "phpdoc",
+ "property",
+ "symfony",
+ "type",
+ "validator"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/property-info/tree/v7.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-06T16:27:19+00:00"
+ },
{
"name": "symfony/routing",
"version": "v7.2.3",
@@ -2459,6 +3083,253 @@
],
"time": "2024-10-23T08:11:15+00:00"
},
+ {
+ "name": "symfony/type-info",
+ "version": "v7.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/type-info.git",
+ "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/type-info/zipball/c4824a6b658294c828e609d3d8dbb4e87f6a375d",
+ "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/container": "^1.1|^2.0"
+ },
+ "require-dev": {
+ "phpstan/phpdoc-parser": "^1.0|^2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\TypeInfo\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mathias Arlaud",
+ "email": "mathias.arlaud@gmail.com"
+ },
+ {
+ "name": "Baptiste LEDUC",
+ "email": "baptiste.leduc@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Extracts PHP types information.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "PHPStan",
+ "phpdoc",
+ "symfony",
+ "type"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/type-info/tree/v7.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-24T09:03:36+00:00"
+ },
+ {
+ "name": "symfony/ux-icons",
+ "version": "v2.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-icons.git",
+ "reference": "39f689b41081f7788ee9c4a188817599d546bfb2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-icons/zipball/39f689b41081f7788ee9c4a188817599d546bfb2",
+ "reference": "39f689b41081f7788ee9c4a188817599d546bfb2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/twig-bundle": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/flex": "<1.13",
+ "symfony/ux-twig-component": "<2.21"
+ },
+ "require-dev": {
+ "psr/log": "^2|^3",
+ "symfony/asset-mapper": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-client": "6.4|^7.0",
+ "symfony/phpunit-bridge": "^6.3|^7.0",
+ "symfony/ux-twig-component": "^2.14",
+ "zenstruck/console-test": "^1.5"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\Icons\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Bond",
+ "email": "kevinbond@gmail.com"
+ },
+ {
+ "name": "Simon André",
+ "email": "smn.andre@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Renders local and remote SVG icons in your Twig templates.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "icons",
+ "svg",
+ "symfony-ux",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-icons/tree/v2.24.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-04T17:32:18+00:00"
+ },
+ {
+ "name": "symfony/ux-twig-component",
+ "version": "v2.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/ux-twig-component.git",
+ "reference": "48a46e4c6215d41cc97ba8dff0cff21ea9b255a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/48a46e4c6215d41cc97ba8dff0cff21ea9b255a8",
+ "reference": "48a46e4c6215d41cc97ba8dff0cff21ea9b255a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "twig/twig": "^3.8"
+ },
+ "conflict": {
+ "symfony/config": "<5.4.0"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dom-crawler": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0",
+ "symfony/phpunit-bridge": "^6.0|^7.0",
+ "symfony/stimulus-bundle": "^2.9.1",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0",
+ "symfony/webpack-encore-bundle": "^1.15"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/ux",
+ "name": "symfony/ux"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\UX\\TwigComponent\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Twig components for Symfony",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "components",
+ "symfony-ux",
+ "twig"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/ux-twig-component/tree/v2.24.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-21T20:14:36+00:00"
+ },
{
"name": "symfony/var-dumper",
"version": "v7.2.3",
@@ -2690,6 +3561,62 @@
],
"time": "2025-03-03T07:12:39+00:00"
},
+ {
+ "name": "symfonycasts/tailwind-bundle",
+ "version": "v0.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/SymfonyCasts/tailwind-bundle.git",
+ "reference": "380502c39bf403f772d050ff9904932040de8cf1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/SymfonyCasts/tailwind-bundle/zipball/380502c39bf403f772d050ff9904932040de8cf1",
+ "reference": "380502c39bf403f772d050ff9904932040de8cf1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/asset-mapper": "^6.3|^7.0",
+ "symfony/cache": "^6.3|^7.0",
+ "symfony/console": "^5.4|^6.3|^7.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/http-client": "^5.4|^6.3|^7.0",
+ "symfony/process": "^5.4|^6.3|^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6",
+ "symfony/filesystem": "^6.3|^7.0",
+ "symfony/framework-bundle": "^6.3|^7.0",
+ "symfony/phpunit-bridge": "^6.3.9|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfonycasts\\TailwindBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ryan Weaver",
+ "homepage": "https://symfonycasts.com"
+ }
+ ],
+ "description": "Delightful Tailwind Support for Symfony + AssetMapper",
+ "keywords": [
+ "asset-mapper",
+ "tailwind"
+ ],
+ "support": {
+ "issues": "https://github.com/SymfonyCasts/tailwind-bundle/issues",
+ "source": "https://github.com/SymfonyCasts/tailwind-bundle/tree/v0.10.0"
+ },
+ "time": "2025-04-09T15:18:46+00:00"
+ },
{
"name": "twig/extra-bundle",
"version": "v3.20.0",
@@ -3085,67 +4012,6 @@
}
],
"time": "2025-01-15T00:21:40+00:00"
- },
- {
- "name": "symfony/process",
- "version": "v7.2.5",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "87b7c93e57df9d8e39a093d32587702380ff045d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d",
- "reference": "87b7c93e57df9d8e39a093d32587702380ff045d",
- "shasum": ""
- },
- "require": {
- "php": ">=8.2"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Executes commands in sub-processes",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/process/tree/v7.2.5"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-03-13T12:21:46+00:00"
}
],
"aliases": [],
diff --git a/config/bundles.php b/config/bundles.php
index a6f9fbc..a3b8818 100644
--- a/config/bundles.php
+++ b/config/bundles.php
@@ -5,4 +5,7 @@ return [
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
+ Symfonycasts\TailwindBundle\SymfonycastsTailwindBundle::class => ['all' => true],
+ Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
+ Symfony\UX\Icons\UXIconsBundle::class => ['all' => true],
];
diff --git a/config/packages/asset_mapper.yaml b/config/packages/asset_mapper.yaml
new file mode 100644
index 0000000..f7653e9
--- /dev/null
+++ b/config/packages/asset_mapper.yaml
@@ -0,0 +1,11 @@
+framework:
+ asset_mapper:
+ # The paths to make available to the asset mapper.
+ paths:
+ - assets/
+ missing_import_mode: strict
+
+when@prod:
+ framework:
+ asset_mapper:
+ missing_import_mode: warn
diff --git a/config/packages/symfonycasts_tailwind.yaml b/config/packages/symfonycasts_tailwind.yaml
new file mode 100644
index 0000000..146ace0
--- /dev/null
+++ b/config/packages/symfonycasts_tailwind.yaml
@@ -0,0 +1,6 @@
+symfonycasts_tailwind:
+ # Specify the EXACT version of Tailwind CSS you want to use
+ binary_version: 'v3.4.17'
+
+ # Alternatively, you can specify the path to the binary that you manage yourself
+ #binary: 'node_modules/.bin/tailwindcss'
diff --git a/config/packages/twig_component.yaml b/config/packages/twig_component.yaml
new file mode 100644
index 0000000..fd17ac6
--- /dev/null
+++ b/config/packages/twig_component.yaml
@@ -0,0 +1,5 @@
+twig_component:
+ anonymous_template_directory: 'components/'
+ defaults:
+ # Namespace & directory for components
+ App\Twig\Components\: 'components/'
diff --git a/importmap.php b/importmap.php
new file mode 100644
index 0000000..70ebf14
--- /dev/null
+++ b/importmap.php
@@ -0,0 +1,19 @@
+ [
+ 'path' => './assets/app.js',
+ 'entrypoint' => true,
+ ],
+];
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..02ec1f4
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,63 @@
+# Use the front controller as index file.
+DirectoryIndex index.php
+
+# Uncomment the following line if you install assets as symlinks or if you
+# experience problems related to symlinks when compiling LESS/Sass/CoffeScript.
+Options +FollowSymlinks
+
+# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
+# to the front controller "/index.php" but be rewritten to "/index.php/index".
+
+ Options -MultiViews
+
+
+
+ RewriteEngine On
+
+ # This RewriteRule is used to dynamically discover the RewriteBase path.
+ # See https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule
+ # Here we will compare the stripped per-dir path *relative to the filesystem
+ # path where the .htaccess file is read from* with the URI of the request.
+ #
+ # If a match is found, the prefix path is stored into an ENV var that is later
+ # used to properly prefix the URI of the front controller index.php.
+ # This is what makes it possible to host a Symfony application under a subpath,
+ # such as example.com/subpath
+
+ # The convoluted rewrite condition means:
+ # 1. Match all current URI in the RewriteRule and backreference it using $0
+ # 2. Strip the request uri the per-dir path and use ir as REQUEST_URI.
+ # This is documented in https://bit.ly/3zDm3SI ("What is matched?")
+ # 3. Evaluate the RewriteCond, assuming your DocumentRoot is /var/www/html,
+ # this .htaccess is in the /var/www/html/public dir and your request URI
+ # is /public/hello/world:
+ # * strip per-dir prefix: /var/www/html/public/hello/world -> hello/world
+ # * applying pattern '.*' to uri 'hello/world'
+ # * RewriteCond: input='/public/hello/world::hello/world' pattern='^(/.+)/(.*)::\\2$' => matched
+ # 4. Execute the RewriteRule:
+ # * The %1 in the RewriteRule flag E=BASE:%1 refers to the first group captured in the RewriteCond ^(/.+)/(.*)
+ # * setting env variable 'BASE' to '/public'
+ RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
+ RewriteRule .* - [E=BASE:%1]
+
+ # Sets the HTTP_AUTHORIZATION header removed by Apache
+ RewriteCond %{HTTP:Authorization} .+
+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
+
+ # Removes the /index.php/ part from a URL, if present
+ RewriteCond %{ENV:REDIRECT_STATUS} =""
+ RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+ # If the requested filename exists, simply serve it.
+ # Otherwise rewrite all other queries to the front controller.
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ %{ENV:BASE}/index.php [L]
+
+
+
+
+ # When mod_rewrite is not available, we instruct a temporary redirect
+ # to the front controller explicitly so that the website
+ RedirectMatch 307 ^/$ /index.php/
+
+
diff --git a/src/Twig/Components/Card.php b/src/Twig/Components/Card.php
new file mode 100644
index 0000000..5d30598
--- /dev/null
+++ b/src/Twig/Components/Card.php
@@ -0,0 +1,10 @@
+{% block title %}Welcome!{% endblock %}
{% block stylesheets %}
+
{% endblock %}
{% block javascripts %}
+ {% block importmap %}{{ importmap('app') }}{% endblock %}
{% endblock %}
-
- {% block body %}{% endblock %}
+
+
+
+
+
+ {% block body %}{% endblock %}
+
diff --git a/templates/components/Card.html.twig b/templates/components/Card.html.twig
new file mode 100644
index 0000000..4d2c53c
--- /dev/null
+++ b/templates/components/Card.html.twig
@@ -0,0 +1,13 @@
+
+
+
+
+ {{ title }}
+
+
+
+ {% block content %}{% endblock %}
+
+
+
+
diff --git a/templates/components/Header.html.twig b/templates/components/Header.html.twig
new file mode 100644
index 0000000..6e00af9
--- /dev/null
+++ b/templates/components/Header.html.twig
@@ -0,0 +1,15 @@
+
diff --git a/templates/components/NavBar.html.twig b/templates/components/NavBar.html.twig
new file mode 100644
index 0000000..08145be
--- /dev/null
+++ b/templates/components/NavBar.html.twig
@@ -0,0 +1,88 @@
+
diff --git a/templates/components/Poster.html.twig b/templates/components/Poster.html.twig
new file mode 100644
index 0000000..fc7f472
--- /dev/null
+++ b/templates/components/Poster.html.twig
@@ -0,0 +1,4 @@
+
+

+
+
diff --git a/templates/components/SearchBar.html.twig b/templates/components/SearchBar.html.twig
new file mode 100644
index 0000000..9cdc72b
--- /dev/null
+++ b/templates/components/SearchBar.html.twig
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/templates/index/index.html.twig b/templates/index/index.html.twig
index 2ca36a9..e461114 100644
--- a/templates/index/index.html.twig
+++ b/templates/index/index.html.twig
@@ -1,20 +1,122 @@
{% extends 'base.html.twig' %}
-{% block title %}Hello IndexController!{% endblock %}
+{% block title %}Dashboard &mdash - Torsearch{% endblock %}
{% block body %}
-
+
+
Dashboard
+
+
+
+
+
+ |
+ Title
+ |
+
+ Progress
+ |
+
+
+
+
+ |
+ The Wolf of Wallstreet
+ |
+
+
+ 11
+
+ |
+
-
-
Hello {{ controller_name }}! ✅
+
+ |
+ Inception
+ |
+
+
+ 36
+
+ |
+
- This friendly message is coming from:
-
- - Your controller at
/Users/brockcaldwell/Repositories/templates/symfony/src/Controller/IndexController.php
- - Your template at
/Users/brockcaldwell/Repositories/templates/symfony/templates/index/index.html.twig
-
-
+
+ |
+ Hop
+ |
+
+
+ 0
+
+ |
+
+
+
+
+
+
+
+
+
+ |
+ Title
+ |
+
+ Status
+ |
+
+
+
+
+ |
+ The Family Plan
+ |
+
+
+ Complete
+
+ |
+
+
+
+ |
+ It
+ |
+
+
+ Complete
+
+ |
+
+
+
+ |
+ Silicon Cowboys
+ |
+
+
+ Complete
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{% endblock %}